2010-05-13 21 views

Respuesta

476

tiene varias opciones para configurar las variables de fuera de su makefile:

  • De ambiente - cada variable de entorno se transforma en una variable makefile con el mismo nombre y valor.

    También es posible que desee establecer -e opción (también conocido como --environments-override) en adelante, y las variables de entorno va a anular las asignaciones hechas en makefile (a menos que estas asignaciones mismos utilizan el override directive. Sin embargo, no es recomendable, y es mucho mejor y más flexible para utilizar ?= asignación (el operador de asignación variable de condicional, que sólo tiene un efecto si la variable aún no está definida):

    FOO?=default_value_if_not_set_in_environment 
    

    Nota que ciertas variables no se heredan de medio ambiente:

    • MAKE se incorpora a partir del nombre del script
    • SHELL es establecido dentro de un makefile, o por defecto a /bin/sh (razón de ser: los comandos se especifican en el archivo MAKE, y son de concha específica).
  • De línea de comandos-make pueden tener asignaciones de variables como parte de su línea de comandos, se mezclaba con los objetivos de:

    make target FOO=bar 
    

    Pero entonces todas las asignaciones a FOO variable dentro del archivo MAKE se ignorará a menos que use el override directive en la asignación. (El efecto es el mismo que con la opción -e para variables de entorno).

  • Exportación de los padres Hacer - si se llama a hacer a partir de un Makefile, por lo general, no se debe escribir de forma explícita las asignaciones de variables como este:

    # Don't do this! 
    target: 
         $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS) 
    

    En su lugar, una mejor solución podría ser la de exportar estas variables . Al exportar una variable, se convierte en el entorno de cada invocación de shell y, al hacer llamadas desde estos comandos, se eligen estas variables de entorno tal como se especificó anteriormente.

    # Do like this 
    CFLAGS=-g 
    export CFLAGS 
    target: 
         $(MAKE) -C target 
    

    También puede exportar todos variables usando export sin argumentos.

+3

para pasar de la línea de comando algo con espacios '' make A = '"como df"' '' –

+2

Parece que estás buscando problemas si te preocupan las variables de entorno. Por un lado, es una pesadilla de depuración si funciona en el lugar A y no en el lugar B, simplemente porque tienen entornos diferentes. –

+0

En realidad se deletrea --ambientment-overrides – user7610

115

La forma más sencilla es:

make foo=bar target 

Luego, en su makefile puede hacer referencia a $(foo). Tenga en cuenta que esto no se propagará a sub-marcas automáticamente.

Si está utilizando sub-marcas, vea este artículo: Communicating Variables to a Sub-make

+2

por sub-marcas te refieres a los makefiles 'included' en el archivo make principal? – Pablo

+2

@Michael: Significa llamar nuevamente desde dentro del archivo MAKEEL. He actualizado mi respuesta ya que pareces estar interesado en este detalle. –

35

Digamos que tiene un makefile como esto:

action: 
    echo argument is $(argument) 

A continuación, lo llamarían make action argument=something

+2

para que el objetivo y los argumentos se puedan intercambiar en términos de posición? – Pablo

+3

@Michael: Sí (ver la respuesta de Mark Byers) – nc3b

16

Desde el manual:

Las variables en la marca pueden venir de el entorno en el que se ejecuta make. Cada variable de entorno que 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, anula el entorno.

para que pueda hacer (de golpe):

FOOBAR=1 make 

lo que resulta en una variable FOOBAR en su Makefile.

+0

No me gusta el medio ambiente, pero gracias – Pablo

+1

La otra manera es de hecho mejor en casi todos los casos. Dejaré esto aquí para completarlo. – Thomas

2

Si comete un fichero llamado Makefile y agrega una variable como esta $ (unittest) entonces usted será capaz de utilizar esta variable dentro del Makefile incluso con comodines

ejemplo:

make unittest=* 

utilizo BOOST_TEST y dando un comodín en el parámetro --run_test = $ (unittest) entonces será capaz de utilizar expresiones regulares para filtrar la prueba Quiero que mi Makefile para funcionar

1

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:

archive.a: ... 
ifneq (,$(findstring t,$(MAKEFLAGS))) 
     +touch archive.a 
     +ranlib -t archive.a 
else 
     ranlib archive.a 
endif 

Se trata de verificar si un parámetro dado aparece en MAKEFLAGS. Por ejemplo ... suponga que está estudiando hilos en C++ 11 y ha dividido su estudio en varios archivos (class01, ..., classNM) y desea: compilar todos y ejecutar de forma individual o compilar uno a la vez y ejecútelo si se especifica una bandera (-r, por ejemplo).Por lo tanto, se podría llegar a la 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 

Tener esto, puede que:

  • generar y ejecutar un archivo w/make -r class02;
  • construir todo w/make o make all;
  • generar y ejecutar todos los w/make -r (supongamos que todos ellos contienen algo de cierto tipo de cosas valer y lo que desea es probarlos todos)
2
export ROOT_DIR=<path/value> 

A continuación, utilice la variable, $(ROOT_DIR) en el Makefile .

Cuestiones relacionadas