sirve scripts script que programas programacion pasar parametros para español ejemplos comandos c makefile gnu-make

scripts - Anexar a GNU hacer variables a través de la línea de comando



scripts bash ejemplos (4)

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 única compilación sin editar permanentemente el archivo Makefile (por ejemplo, agregar símbolos de depuración o establecer un indicador 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 CFLAGS a la variable CFLAGS , sino que lo CFLAGS que CFLAGS . ¿Hay una manera clara de hacerlo sin definir algún tipo de variable ficticia adjunta al final de CFLAGS y LDFLAGS ?


Consulte la directiva de anulación . Es probable que necesite modificar el archivo MAKE una vez, pero debe hacer lo que desee.

Ejemplo de archivo MAKE

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


Hay dos formas de pasar variables para hacer:

  • Usando argumentos de línea de comando:

    make VAR=value

  • Usando el entorno:

    export VAR=var; make

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

    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 es sobre 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, te sugiero que tengas un Makefile con:

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

y llámalo con:

CFLAGS=-g make

Aviso, si quiere retirar -Wall , puede usar:

make CFLAGS=

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


Para el registro, la respuesta de @Carl Norum es anterior a la variable, desde la perspectiva de la línea de comando.

Necesitaba una forma de anexar realmente y se me ocurrió:

override CFLAGS := -Wall $(CFLAGS)


Solo una nota, ya que me confundí - deja que esto sea testmake archivo:

$(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 de 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.

Asi que,

  • si una variable utilizada se override una vez, solo se puede agregar con otra instrucción con override (las asignaciones normales se ignorarán);
  • cuando no ha habido ninguna override en absoluto; intentar agregar (como en += ) desde la línea de comando sobrescribe cada instancia de esa variable.