2010-01-24 15 views
48

Estoy usando un Makefile GNU-make para construir un proyecto C con varios objetivos (all, clean, y algunos objetivos específicos del proyecto). En el proceso de depuración, me gustaría agregar algunos indicadores a una compilación única sin editar permanentemente el archivo Makefile (por ejemplo, agregar símbolos de depuración o establecer un indicador de preprocesador).Adjuntar a GNU hacer variables a través de la línea de comando

En el pasado, he hecho eso de la siguiente manera (usando el ejemplo símbolos de depuración):

make target CFLAGS+=-g 

Por desgracia, esto no está anexando a la variable CFLAGS, pero en su lugar, la limpieza y evitando que la compilación . ¿Hay una forma clara de hacerlo sin definir algún tipo de variable ficticia añadida al final de CFLAGS y LDFLAGS?

Respuesta

65

Eche un vistazo a override directive. Es probable que necesite modificar el archivo MAKE una vez, pero debe hacer lo que desee.

Ejemplo makefile:

override CFLAGS += -Wall 

app: main.c 
    gcc $(CFLAGS) -o app main.c 

Ejemplo de líneas de comando:

$ make 
gcc -Wall -o app main.c 
$ make CFLAGS=-g 
gcc -g -Wall -o app main.c 
+0

Gracias por el enlace de referencia. Esta parece una de las mejores soluciones para el problema. –

20

Para el registro, la respuesta prepends de @Carl Norum la variable, desde el punto de vista de línea de comandos.

necesitaba una forma de añadir realidad y se le ocurrió:

override CFLAGS := -Wall $(CFLAGS) 
6

Sólo una nota, ya que se confundió - dejar que este archivo sea testmake:

$(eval $(info A: CFLAGS here is $(CFLAGS))) 

override CFLAGS += -B 

$(eval $(info B: CFLAGS here is $(CFLAGS))) 

CFLAGS += -C 

$(eval $(info C: CFLAGS here is $(CFLAGS))) 

override CFLAGS += -D 

$(eval $(info D: CFLAGS here is $(CFLAGS))) 

CFLAGS += -E 

$(eval $(info E: CFLAGS here is $(CFLAGS))) 

continuación:

$ make -f testmake 
A: CFLAGS here is 
B: CFLAGS here is -B 
C: CFLAGS here is -B 
D: CFLAGS here is -B -D 
E: CFLAGS here is -B -D 
make: *** No targets. Stop. 
$ make -f testmake CFLAGS+=-g 
A: CFLAGS here is -g 
B: CFLAGS here is -g -B 
C: CFLAGS here is -g -B 
D: CFLAGS here is -g -B -D 
E: CFLAGS here is -g -B -D 
make: *** No targets. Stop. 

Con las directivas override eliminadas del archivo testmake:

$ make -f testmake 
A: CFLAGS here is 
B: CFLAGS here is -B 
C: CFLAGS here is -B -C 
D: CFLAGS here is -B -C -D 
E: CFLAGS here is -B -C -D -E 
make: *** No targets. Stop. 
$ make -f testmake CFLAGS+=-g 
A: CFLAGS here is -g 
B: CFLAGS here is -g 
C: CFLAGS here is -g 
D: CFLAGS here is -g 
E: CFLAGS here is -g 
make: *** No targets. Stop. 

Así,

  • si una variable usada override vez, sólo se puede añadir con otra declaración con override (se tendrán en cuenta las asignaciones normales);
  • cuando no ha habido override en absoluto; intentar agregar (como en +=) desde la línea de comando sobrescribe cada instancia de esa variable.
9

Hay dos formas de pasar las variables de Marca:

  • Uso de argumentos de línea de comandos:

    make VAR=value 
    
  • Usando el ambiente:

    export VAR=var; make 
    

    o (mejor porque cambia el entorno solo para el comandante actual d)

    VAR=var make 
    

Ellos son ligeramente diferentes. El primero es más fuerte. Significa que sabes lo que quieres. El segundo puede considerarse como una pista. La diferencia entre ellos se refiere a los operadores = y += (sin override). Estos operadores se ignoran cuando una variable se define en la línea de comando, pero no se ignoran cuando la variable se define en el entorno. Por lo tanto, lo que sugeriría tener un Makefile con:

CC ?= gcc 
    CFLAGS += -Wall 
    INTERNAL_VARS = value 

y llamarlo con:

CFLAGS=-g make 

Aviso, si desea retirar -Wall, puede utilizar:

make CFLAGS= 

No utilice la palabra clave override, de lo contrario no tendrá forma de cambiar una variable afectada con override.

Cuestiones relacionadas