¿Puedo pasar variables a un archivo Make de GNU como argumentos de línea de comandos? En otras palabras, quiero pasar algunos argumentos que eventualmente se convertirán en variables en el Makefile.
¿Puedo pasar variables a un archivo Make de GNU como argumentos de línea de comandos? En otras palabras, quiero pasar algunos argumentos que eventualmente se convertirán en variables en el Makefile.
Tiene varias opciones para configurar variables desde fuera de su archivo MAKE:
Desde el entorno : cada variable de entorno se transforma en una variable de archivo MAKE con el mismo nombre y valor.
También es posible que desee establecer la -e
opción (aka --environments-override
) activada , y sus variables de entorno anularán las asignaciones realizadas en el archivo MAKE (a menos que estas asignaciones usen la override
directiva . Sin embargo, no es recomendable, y es mucho mejor y flexible usar la ?=
asignación (la variable condicional operador de asignación, solo tiene efecto si la variable aún no está definida):
FOO?=default_value_if_not_set_in_environment
Tenga en cuenta que ciertas variables no se heredan del entorno:
MAKE
se obtiene del nombre del guiónSHELL
se establece dentro de un archivo MAKE o se establece de manera predeterminada /bin/sh
(justificación: los comandos se especifican dentro del archivo MAKE y son específicos del shell).Desde la línea de comando : make
puede tomar asignaciones variables como parte de su línea de comando, mezcladas con objetivos:
make target FOO=bar
Pero entonces todas las asignaciones a FOO
variables dentro del archivo MAKE serán ignoradas a menos que use la override
directiva en la asignación. (El efecto es el mismo que con la -e
opción para las variables de entorno).
Exportar desde el Make primario : si llama a Make desde un Makefile, por lo general no debería escribir explícitamente asignaciones de variables como esta:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
En cambio, la mejor solución podría ser exportar estas variables. La exportación de una variable lo convierte en el entorno de cada invocación de shell, y Realizar llamadas desde estos comandos selecciona estas variables de entorno como se especifica anteriormente.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
También puede exportar todas las variables utilizando export
sin argumentos.
make A='"as df"'
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
y pasarlo comomake -C folder $(PROJECT_MAKE_FLAGS)
. Si hay una manera de decirle al archivo MAKE de la biblioteca que ignore el entorno, sería ideal (opuesto a -e).make target FOO=bar
make FOO=bar target
?La forma más simple es:
Luego, en su archivo MAKE puede consultar
$(foo)
. Tenga en cuenta que esto no se propagará a sub-marcas automáticamente.Si está utilizando sub-marcas, vea este artículo: Comunicación de variables a una sub-marca
fuente
included
en el makefile principal?Digamos que tienes un makefile como este:
Entonces lo llamarías
make action argument=something
fuente
Del manual :
Entonces puedes hacer (desde bash):
resultando en una variable
FOOBAR
en su Makefile.fuente
Hay otra opción no citada aquí que está incluida en el libro Make de GNU de Stallman y McGrath (ver http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Proporciona el ejemplo:
Implica verificar si un parámetro dado aparece en
MAKEFLAGS
. Por ejemplo ... suponga que está estudiando sobre subprocesos en c ++ 11 y ha dividido su estudio en varios archivos (class01
, ...,classNM
) y desea: compilar todo y ejecutarlo individualmente o compilar uno a la vez tiempo y ejecútelo si se especifica un indicador (-r
por ejemplo). Entonces, podrías llegar a lo siguienteMakefile
:Teniendo eso, usted:
make -r class02
;make
ormake all
;make -r
(supongamos que todos ellos contienen cierto tipo de afirmación y solo quieres probarlos todos)fuente
parece
comando args sobrescribir variable de entorno
Makefile
Ejecutar ejemplo
fuente
Si crea un archivo llamado Makefile y agrega una variable como esta $ (unittest), entonces podrá usar esta variable dentro del Makefile incluso con comodines
ejemplo:
Uso BOOST_TEST y al asignar un comodín al parámetro --run_test = $ (unittest), podré usar expresiones regulares para filtrar la prueba que quiero que ejecute mi Makefile
fuente
Luego use la variable,
$(ROOT_DIR)
en el Makefile.fuente