Risposte:
Hai diverse opzioni per impostare le variabili dall'esterno del tuo makefile:
Dall'ambiente : ogni variabile di ambiente viene trasformata in una variabile makefile con lo stesso nome e valore.
Potresti anche voler impostare l' -e
opzione (aka --environments-override
) su, e le tue variabili di ambiente sovrascriveranno le assegnazioni fatte in makefile (a meno che queste stesse assegnazioni non utilizzino la override
direttiva . Tuttavia, non è raccomandato ed è molto meglio e flessibile usare l' ?=
assegnazione (la variabile condizionale operatore di assegnazione, ha effetto solo se la variabile non è ancora definita):
FOO?=default_value_if_not_set_in_environment
Si noti che alcune variabili non sono ereditate dall'ambiente:
MAKE
è ottenuto dal nome della sceneggiaturaSHELL
è impostato all'interno di un makefile o il valore predefinito è /bin/sh
(razionale: i comandi sono specificati all'interno del makefile e sono specifici della shell).Dalla riga di comando : make
può assumere assegnazioni variabili come parte della sua riga di comando, unita a target:
make target FOO=bar
Ma poi tutte le assegnazioni alla FOO
variabile all'interno del makefile verranno ignorate a meno che non si usi la override
direttiva nell'assegnazione. (L'effetto è lo stesso -e
dell'opzione per le variabili di ambiente).
Esportazione dal genitore Make - se chiami Make da un Makefile, di solito non dovresti scrivere esplicitamente assegnazioni di variabili come questa:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Invece, la soluzione migliore potrebbe essere quella di esportare queste variabili. L'esportazione di una variabile la rende nell'ambiente di ogni invocazione della shell e Effettua chiamate da questi comandi seleziona queste variabili di ambiente come specificato sopra.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Puoi anche esportare tutte le variabili usando export
senza argomenti.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
e passarlo come make -C folder $(PROJECT_MAKE_FLAGS)
. Se c'è un modo per dire al makefile della libreria di ignorare l'ambiente, sarebbe l'ideale (al contrario di -e).
make target FOO=bar
make FOO=bar target
?
Il modo più semplice è:
make foo=bar target
Quindi nel tuo makefile puoi fare riferimento $(foo)
. Si noti che ciò non si propagherà automaticamente alle sub-marche.
Se si utilizzano sub -make , consultare questo articolo: Comunicazione di variabili a un sub-make
included
nel makefile principale?
Dal manuale :
Le variabili in make possono provenire dall'ambiente in cui make viene eseguito. Ogni variabile d'ambiente che crea vede all'avvio viene trasformata in una variabile make con lo stesso nome e valore. Tuttavia, un'assegnazione esplicita nel makefile, o con un argomento di comando, sovrascrive l'ambiente.
Quindi puoi fare (da bash):
FOOBAR=1 make
risultante in una variabile FOOBAR
nel tuo Makefile.
C'è un'altra opzione non citata qui che è inclusa nel libro GNU Make di Stallman e McGrath (vedi http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Fornisce l'esempio:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Implica la verifica se appare un determinato parametro MAKEFLAGS
. Ad esempio .. supponiamo che tu stia studiando i thread in c ++ 11 e che tu abbia diviso il tuo studio su più file ( class01
, ..., classNM
) e che tu voglia: compilare quindi tutto ed eseguirlo singolarmente o compilarne uno in un tempo ed eseguirlo se viene specificato un flag ( -r
, ad esempio). Quindi, potresti trovare quanto segue Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Detto questo, dovresti:
make -r class02
;make
o make all
;make -r
(supponiamo che tutti contengano un certo tipo di affermazione e che tu voglia solo testarli tutti)sembra
Il comando args sovrascrive la variabile di ambiente
Makefile
send:
echo $(MESSAGE1) $(MESSAGE2)
Esegui esempio
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
Se crei un file chiamato Makefile e aggiungi una variabile come questa $ (unittest), sarai in grado di usare questa variabile all'interno del Makefile anche con caratteri jolly
esempio :
make unittest=*
Uso BOOST_TEST e assegnando un carattere jolly al parametro --run_test = $ (unittest), allora sarò in grado di usare l'espressione regolare per filtrare il test. Voglio che il mio Makefile venga eseguito
make A='"as df"'