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;
}

Respuestas:
Llame al
makecomando de esta manera: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 delmakecomando anulará elCFLAGSvalor ya definido en el Makefile.Alternativamente, puede establecer
-Dvar=42otra variable queCFLAGSy luego reutilizar esta variableCFLAGSpara evitar anular completamenteCFLAGS.fuente
$(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 ejemplolocal_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.CFLAGS="-Dvar1=42 -Dvar2=314"CPPFLAGSpodría representar un mejor ajuste queCFLAGSoCXXFLAGS: stackoverflow.com/a/53527858/2278206Solo usa una variable específica para eso.
fuente
Llamar a hacer de esta manera
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).
fuente
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 queCFLAGSoCXXFLAGS, ya que el manual GNU Make lo describe como:Ejemplos de reglas implícitas integradas que utilizan
CPPFLAGSn.ose hace automáticamenten.ccon una receta de la forma:$(CC) $(CPPFLAGS) $(CFLAGS) -cn.ose elabora automáticamente a partir den.cc,n.cppon.Ccon una receta de la forma:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -cUno usaría el comando
make CPPFLAGS=-Dvar=123para definir la macro deseada.Más información
fuente
$ cat x.mak todas: echo $ (OPCION) $ make -f x.mak 'OPCIÓN = -DPASSTOC = 42' echo -DPASSTOC = 42 -DPASSTOC = 42fuente
Encuentre el archivo C y la implementación de Makefile a continuación para cumplir con sus requisitos
foo.c
Makefile
fuente