Anexar a GNU make variables a través de la línea de comandos


Estoy usando un Makefile GNU-make para construir un proyecto C con varios destinos (all, clean, y algunos objetivos específicos del proyecto). En el proceso de depuración, me gustaría agregar algunas banderas a una sola compilación sin editar permanentemente el Makefile (por ejemplo, agregar símbolos de depuración o establecer una bandera de preprocesador).

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

make target CFLAGS+=-g

Desafortunadamente, esto no se agrega a la variable CFLAGS, sino que, limpiarlo y evitar que se compile. ¿Hay una forma limpia de hacer esto sin definir algún tipo de variable ficticia anexa al final de CFLAGS y LDFLAGS?

Author: Michael Koval, 2010-01-25

4 answers

Echa un vistazo a la directiva de anulación . Probablemente necesitará modificar el makefile una vez, pero debería hacer lo que quiera.

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 
 73
Author: Carl Norum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 23:44:21

Para el registro, la respuesta de @Carl Norum antepone la variable, desde la perspectiva de la línea de comandos.

Necesitaba una manera de añadir realmente y se me ocurrió:

override CFLAGS := -Wall $(CFLAGS)
 22
Author: aib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-27 12:47:22

Hay dos formas de pasar variables a hacer:

  • Usando argumentos de línea de comandos:

    make VAR=value
    
  • Usando el entorno:

    export VAR=var; make
    

    O (mejor porque cambia el entorno solo para el comando actual)

    VAR=var make
    

Son ligeramente diferentes. El primero es más fuerte. Significa que sabes lo que quieres. El segundo puede ser considerado como una pista. La diferencia entre ellos es acerca de los operadores = y += (sin override). Estos los operadores se ignoran cuando una variable se define en la línea de comandos, pero no se ignoran cuando la variable se define en entorno. Por lo tanto, le sugiero que tenga un Makefile con:

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

Y llámalo con:

    CFLAGS=-g make

Aviso, si desea retirar -Wall, puede utilizar:

    make CFLAGS=

Por favor, no use la palabra clave override, de lo contrario no tendrá ninguna manera de cambiar una variable afectada con override.

 11
Author: Jezz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 13:58:52

Solo una nota, ya que me confundí-que este sea el archivo 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)))

Entonces:

$ 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í que,

  • si una variable se usa override una vez, solo se puede agregar otra instrucción con override (se ignorarán las asignaciones normales);
  • cuando no ha habido override en absoluto; tratar de anexar (como en +=) desde la línea de comandos sobrescribe cada instancia de eso variable.
 6
Author: sdaau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 04:06:12