2009-08-20 22 views
30

todos. Digamos que tengo un programa que contiene una larga lista de archivos fuente C, Ac, Bc, ...., Zc, ahora quiero compilar Ac, Bc con ciertos CFLAGS, y compilar el resto de los archivos fuente con un archivo diferente. Valor de CFLAGS¿Cómo compilar diferentes archivos c con diferentes CFLAGS usando Makefile?

¿Cómo escribir un Makefile para realizar el trabajo descrito anteriormente? Actualmente lo que estoy haciendo en mi Makefile es:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o] 
SPECIAL_OBJS=A.o B.o 

all: $(OBJ) $(SPECIAL_OBJS) 

$(SPECIAL_OBJS): 
    @echo [Compiling]: $(@:.o=.c) 
    $(CC) [SOME OTHER GCC OPTIONS HERE] $(CFLAGS) -c $(@:.o=.c) -o [email protected] 

%.o: %.c 
    @echo [Compiling]: $< 
    $(CC) $(CFLAGS) -o [email protected] -c $< 

Funciona, pero se ve estúpido/complicado. ¿Alguien puede ayudar a señalar cuál es la forma recomendada de hacer esto en Makefile? ¡Gracias!

Respuesta

45

Trate de usar las variables específicas de la diana. Una variable específica de la diana está declarada como esto:

TARGET: VAR := foo # Any valid form of assignment may be used (=, :=, +=, ?=) 

Ahora, cuando se realiza la llamada de la blanco, la variable denominada VAR tendrá el valor "foo".

Uso de variables específicas de la diana, se puede hacer esto, por ejemplo:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o] 
SPECIAL_OBJS=A.o B.o 

all: $(OBJ) $(SPECIAL_OBJS) 

$(SPECIAL_OBJS): EXTRA_FLAGS := -std=c99 # Whatever extra flags you need 

%.o: %.c 
    @echo [Compiling]: $< 
    $(CC) $(CFLAGS) $(EXTRA_FLAGS) -o [email protected] -c $< 
+1

Si no desea volver a definir la regla de compilación predeterminada .c -> .o, un 'CFLAGS + = $ (EXTRA_CFLAGS) 'funcionaría también (al menos para GNU make). – sstn

+0

La adición directa a CFLAGS parece funcionar también: '$ (SPECIAL_OBJS): CFLAGS + = - std = c99' (GNU make again). – sstn

+0

@sstn Como se indicó anteriormente, se puede usar cualquier forma válida de asignación. –

1

No puedo responder a la pregunta de Makefile primas, pero si usted está dispuesto a utilizar automake es trivial:

 
foo_CFLAGS = [options passed to CC only when building foo] 
+0

Al usar automake como este, puede "foo" ser cualquier tipo de objetivo (por ejemplo, archivo de objeto), o tiene que ser un objetivo final (ejecutable o biblioteca) ? –

+1

Usar primarios como este se aplica a los objetivos finales y a todos los objetivos intermedios. Para aplicar solo a objetivos intermedios (por ejemplo, archivos .o), puede escribir reglas explícitas en Makefile.am –

10

El enfoque adoptado por el sistema operativo Linux kernel construcción:

CFLAGS += $([email protected]) 

Y luego,

CFLAGS-A.o += -DEXTRA 
CFLAGS-B.o += -DEXTRA 
Cuestiones relacionadas