Antworten:
Sie haben mehrere Möglichkeiten, Variablen von außerhalb Ihres Makefiles einzurichten:
Aus der Umgebung - Jede Umgebungsvariable wird in eine Makefile-Variable mit demselben Namen und Wert umgewandelt.
Möglicherweise möchten Sie auch die -e
Option (auch bekannt als --environments-override
) aktivieren, und Ihre Umgebungsvariablen überschreiben Zuweisungen, die in Makefile vorgenommen wurden (es sei denn, diese Zuweisungen selbst verwenden die override
Direktive . Es wird jedoch nicht empfohlen, und es ist viel besser und flexibler, die ?=
Zuweisung (die bedingte Variable) zu verwenden Zuweisungsoperator, wirkt sich nur aus, wenn die Variable noch nicht definiert ist):
FOO?=default_value_if_not_set_in_environment
Beachten Sie, dass bestimmte Variablen nicht von der Umgebung geerbt werden:
MAKE
wird vom Namen des Skripts erhaltenSHELL
wird entweder in einem Makefile festgelegt oder standardmäßig auf /bin/sh
(Begründung: Befehle werden im Makefile angegeben und sind shell-spezifisch).Über die Befehlszeile - make
kann variable Zuweisungen als Teil seiner Befehlszeile übernehmen, gemischt mit Zielen:
make target FOO=bar
Aber dann werden alle Zuweisungen an FOO
Variablen innerhalb des Makefiles ignoriert, es sei denn, Sie verwenden die override
Direktive bei der Zuweisung. (Der Effekt ist der gleiche wie bei der -e
Option für Umgebungsvariablen.)
Exportieren aus dem übergeordneten Make - Wenn Sie Make aus einem Makefile aufrufen, sollten Sie Variablenzuweisungen wie folgt normalerweise nicht explizit schreiben:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Stattdessen könnte eine bessere Lösung darin bestehen, diese Variablen zu exportieren. Wenn Sie eine Variable exportieren, wird sie in die Umgebung jedes Shell-Aufrufs übernommen. Wenn Sie über diese Befehle Aufrufe ausführen, wählen Sie diese Umgebungsvariable wie oben angegeben aus.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Sie können auch alle Variablen exportieren , indem Sie export
ohne Argumente verwenden.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
und weiterzugeben make -C folder $(PROJECT_MAKE_FLAGS)
. Wenn es eine Möglichkeit gibt, das Makefile der Bibliothek anzuweisen, die Umgebung zu ignorieren, wäre dies ideal (im Gegensatz zu -e).
make target FOO=bar
make FOO=bar target
?
Der einfachste Weg ist:
make foo=bar target
Dann können Sie in Ihrem Makefile darauf verweisen $(foo)
. Beachten Sie, dass dies nicht automatisch an Untermarken weitergegeben wird.
Wenn Sie Untermarken verwenden, lesen Sie diesen Artikel: Übermitteln von Variablen an eine Untermarke
included
im Haupt-Makefile?
Aus dem Handbuch :
Variablen in make können aus der Umgebung stammen, in der make ausgeführt wird. Jede Umgebungsvariable, die make beim Start sieht, wird in eine make-Variable mit demselben Namen und Wert umgewandelt. Eine explizite Zuweisung im Makefile oder mit einem Befehlsargument überschreibt jedoch die Umgebung.
So können Sie (von Bash) tun:
FOOBAR=1 make
was zu einer Variablen FOOBAR
in Ihrem Makefile führt.
Es gibt eine weitere Option, die hier nicht aufgeführt ist und im GNU Make-Buch von Stallman und McGrath enthalten ist (siehe http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Es liefert das Beispiel:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Dabei wird überprüft, ob ein bestimmter Parameter in angezeigt wird MAKEFLAGS
. Angenommen, Sie lernen Threads in C ++ 11 kennen und haben Ihre Studie auf mehrere Dateien ( class01
, ..., classNM
) aufgeteilt. Sie möchten: dann alle kompilieren und einzeln ausführen oder eine nacheinander kompilieren Zeit und führen Sie es aus, wenn ein Flag angegeben ist ( -r
zum Beispiel). Sie könnten sich also Folgendes einfallen lassen 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
Wenn Sie das haben, würden Sie:
make -r class02
;make
oder make all
;make -r
(Angenommen, alle enthalten bestimmte Assert-Inhalte und Sie möchten sie nur alle testen.)es scheint
Befehl args überschreibt Umgebungsvariable
Makefile
send:
echo $(MESSAGE1) $(MESSAGE2)
Beispiel ausführen
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
Wenn Sie eine Datei mit dem Namen Makefile erstellen und eine Variable wie diese $ (unittest) hinzufügen, können Sie diese Variable auch mit Platzhaltern im Makefile verwenden
Beispiel:
make unittest=*
Ich verwende BOOST_TEST und indem ich dem Parameter --run_test = $ (unittest) einen Platzhalter gebe, kann ich den Test, mit dem mein Makefile ausgeführt werden soll, mit regulären Ausdrücken herausfiltern
make A='"as df"'