Kann ich Variablen als Befehlszeilenargumente an ein GNU-Makefile übergeben? Mit anderen Worten, ich möchte einige Argumente übergeben, die schließlich zu Variablen im Makefile werden.
Kann ich Variablen als Befehlszeilenargumente an ein GNU-Makefile übergeben? Mit anderen Worten, ich möchte einige Argumente übergeben, die schließlich zu Variablen im Makefile werden.
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.
make A='"as df"'
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
und weiterzugebenmake -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:
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
quelle
included
im Haupt-Makefile?Angenommen, Sie haben ein Makefile wie dieses:
Sie würden es dann nennen
make action argument=something
quelle
Aus dem Handbuch :
So können Sie (von Bash) tun:
was zu einer Variablen
FOOBAR
in Ihrem Makefile führt.quelle
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:
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 lassenMakefile
:Wenn Sie das haben, würden Sie:
make -r class02
;make
odermake all
;make -r
(Angenommen, alle enthalten bestimmte Assert-Inhalte und Sie möchten sie nur alle testen.)quelle
es scheint
Befehl args überschreibt Umgebungsvariable
Makefile
Beispiel ausführen
quelle
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:
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
quelle
Verwenden Sie dann die Variable
$(ROOT_DIR)
im Makefile.quelle