¿Cómo pasar la definición de macro de los argumentos de la línea de comandos "make" (-D) al código fuente de C?


107

Normalmente paso las definiciones de macros de "make command line" a un "makefile" usando la opción: -Dname = value. La definición es accesible dentro del archivo MAKE.

También paso las definiciones de macro del "makefile" al "código fuente" usando la opción de compilador similar: -Dname = value (compatible con muchos compiladores). Esta definición es accesible en el código fuente.

Lo que necesito ahora es permitir que el usuario de mi archivo MAKE pueda pasar definiciones de macros arbitrarias de la "línea de comandos make.exe" al "código fuente" de inmediato, sin tener que cambiar nada en el archivo MAKE.

para que el usuario pueda escribir: make -f mymakefile.mk -SOMEOPTION var = 5

luego directamente el código main.c puede ver var:

int main()
{
  int i = var;
}

15
¿Por qué el voto negativo? Me parece una pregunta perfectamente legítima.
Thomas

Respuestas:


99

Llame al makecomando de esta manera:

make CFLAGS=-Dvar=42

Y asegúrese de usarlo $(CFLAGS)en su comando de compilación en el Makefile. Como mencionó @ jørgensen, poner la asignación de variable después del makecomando anulará el CFLAGSvalor ya definido en el Makefile.

Alternativamente, puede establecer -Dvar=42otra variable que CFLAGSy luego reutilizar esta variable CFLAGSpara evitar anular completamente CFLAGS.


8
No puede utilizar "CFLAGS = $ (CFLAGS) -Wall"; esta sería una definición recursiva y make no lo permite. Puede usar "CFLAGS: = $ (CFLAGS) -Wall" o "CFLAGS + = -Wall", pero tampoco funcionarán porque una asignación en la línea de comando tiene una prioridad más alta. Puede usar "anular CFLAGS + = -Wall", pero generalmente le recomendamos que elija diferentes variables internamente. Los estándares de codificación GNU requieren que se deje CFLAGS, etc. al usuario, y los archivos MAKE eligen otra variable, como "local_CFLAGS = $ (CFLAGS) -Wall".
MadScientist

2
Solo para agregar a la nota de @MadScientist, los Estándares de codificación GNU también establecen que $(CFLAGS)debería ser el último, de modo que cualquier opción especificada por un usuario anulará cualquier cosa que el Makefile establezca internamente. Eso significaría usar, por ejemplo local_CFLAGS = -Wall $(CFLAGS). Por el contrario, si hay algo que realmente desea tener prioridad, $(CFLAGS)colóquelo después , como en el comentario de @MadScientist.
Sam

1
¿Cómo configurar múltiples macros con esto?
Woody Huang

2
@WoodyHuang por ejemploCFLAGS="-Dvar1=42 -Dvar2=314"
ouah

1
CPPFLAGSpodría representar un mejor ajuste que CFLAGSo CXXFLAGS: stackoverflow.com/a/53527858/2278206
psq

11

Solo usa una variable específica para eso.

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo

10

Llamar a hacer de esta manera

make CFLAGS=-Dvar=42

porque desea anular el CFLAGS de su Makefile, y no solo el entorno (que tiene una prioridad menor con respecto a las variables de Makefile).


6

Debido a la baja reputación, no puedo comentar la respuesta aceptada.

Me gustaría mencionar la variable predefinida CPPFLAGS. Podría representar un mejor ajuste que CFLAGSo CXXFLAGS, ya que el manual GNU Make lo describe como:

Indicadores adicionales para entregar al preprocesador de C y los programas que lo usan (los compiladores de C y Fortran).

Ejemplos de reglas implícitas integradas que utilizan CPPFLAGS

  • n.ose hace automáticamente n.ccon una receta de la forma:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.ose elabora automáticamente a partir de n.cc, n.cppo n.Ccon una receta de la forma:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

Uno usaría el comando make CPPFLAGS=-Dvar=123para definir la macro deseada.

Más información


1
$ cat x.mak
todas:
    echo $ (OPCION)
$ make -f x.mak 'OPCIÓN = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42

-4

Encuentre el archivo C y la implementación de Makefile a continuación para cumplir con sus requisitos

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

la cuestión es pasar definiciones arbitrarias de la línea de comandos make directamente al código fuente de C "sin cambiar el archivo make". Así que quería cambiar mi archivo MAKE una vez, para permitir que se hicieran esas definiciones arbitrarias.
MohamedEzz

No funciona para hacer. Eso es make -DMAKE_DEFINE = 11 dice opción inválida.
Ramakrishnan Kannan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.