makefile - with - Pasando variables adicionales desde la línea de comandos para hacer
makefile java args (7)
Del manual :
Las variables en make pueden provenir del entorno en el que se ejecuta make. Cada variable de entorno que make ve cuando se inicia se transforma en una variable make con el mismo nombre y valor. Sin embargo, una asignación explícita en el archivo make, o con un argumento de comando, reemplaza el entorno.
Así que puedes hacer (desde bash):
FOOBAR=1 make
dando como resultado una variable FOOBAR
en tu Makefile.
¿Puedo pasar variables a un archivo GNU Makefile como argumentos de línea de comando? En otras palabras, quiero pasar algunos argumentos que eventualmente se convertirán en variables en el Makefile.
Digamos que tienes un makefile como este:
action:
echo argument is $(argument)
Entonces lo llamarías make action argument=something
Hay otra opción no citada aquí, que está incluida en el libro GNU Make de Stallman y McGrath (consulte http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Proporciona el ejemplo:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Implica verificar si un parámetro dado aparece en MAKEFLAGS
. Por ejemplo ... suponga que está estudiando los subprocesos en c ++ 11 y ha dividido su estudio en varios archivos ( class01
, ..., classNM
) y desea: compilar luego todos y ejecutar individualmente o compilar uno a la vez y ejecútelo si se especifica un indicador ( -r
, por ejemplo). Por lo tanto, usted podría subir con el siguiente Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./[email protected]
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Teniendo eso, tu deberías:
- construir y ejecutar un archivo w /
make -r class02
; - construir todo w /
make
omake all
; - construir y ejecutar todo w /
make -r
(suponga que todos ellos contienen algún tipo de afirmación determinada y que solo quiere probarlos todos)
La forma más sencilla es:
make foo=bar target
Luego en tu makefile puedes referirte a $(foo)
. Tenga en cuenta que esto no se propagará a las sub-marcas automáticamente.
Si está usando sub-marcas, vea este artículo: Comunicar variables a una sub-marca
Si crea un archivo llamado Makefile y agrega una variable como esta $ (unittest), podrá usar esta variable dentro del Makefile incluso con comodines.
ejemplo:
make unittest=*
Utilizo BOOST_TEST y al asignar un comodín al parámetro --run_test = $ (unittest), luego podré usar expresiones regulares para filtrar la prueba Quiero que mi Makefile se ejecute
Tienes varias opciones para configurar variables desde fuera de tu makefile:
Desde el entorno : cada variable de entorno se transforma en una variable makefile con el mismo nombre y valor.
También es posible que desee
--environments-override
opción-e
(también--environments-override
como--environments-override
), y las variables de su entorno--environments-override
las asignaciones realizadas en el archivo MAKE (a menos que estas asignaciones utilicen la directiva deoverride
. Sin embargo, no se recomienda y es mucho mejor. ¿flexible para usar?=
asignación (el operador de asignación de variable condicional, solo tiene un 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 script. -
SHELL
se establece dentro de un archivo make, o por defecto en/bin/sh
(razón: los comandos se especifican dentro del archivo make, y son específicos de la shell).
-
Desde la línea de comandos :
make
puede tomar asignaciones de variables como parte de su línea de comandos, mezclado con objetivos:make target FOO=bar
Pero entonces todas las asignaciones a la variable
FOO
dentro del archivo MAKE serán ignoradas a menos que use la directiva deoverride
en la asignación. (El efecto es el mismo que con la opción-e
para las variables de entorno).Exportar desde el Make principal : si llama a Make desde un Makefile, por lo general no debe escribir explícitamente las asignaciones de variables de esta manera:
# Don''t do this! target: $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
En su lugar, una mejor solución podría ser exportar estas variables. Exportar una variable lo hace en el entorno de cada invocación de shell, y Hacer llamadas desde estos comandos selecciona estas variables de entorno como se especificó anteriormente.
# Do like this CFLAGS=-g export CFLAGS target: $(MAKE) -C target
También puede exportar todas las variables utilizando
export
sin argumentos.
export ROOT_DIR=<path/value>
Luego use la variable, $(ROOT_DIR)
en el Makefile.