with makefile gnu command-line-arguments

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 o make 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 de override . 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 de override 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.