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
?
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
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)
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
.
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 conoverride
(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.
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