Ich versuche eine einfache Sache zu tun:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
Das funktioniert, wenn ich laufe:
$ make test
/tmp
Es funktioniert auch, wenn ich laufe:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
Was kann ich tun, damit es auch funktioniert:
$ TMPDIR=~/tmp make test
/home/user/tmp
?=
eine Umgebungsvariable verwenden und festgelegt haben, wird stattdessen der Wert der Umgebungsvariablen verwendet). Was genau ist das Problem (warum funktioniert es Ihrer Meinung nach nicht)?TMPDIR ?= "/tmp"
undecho $(TMPDIR)
das einzige , was nicht die Klammer um die Variablennamen zu vergessen.-e
rückwärts.-e
Damit env- Variablen Variablen überschreiben können, die im Makefile definiert sind, wirken sie sich nicht auf die Variablenzuweisung aus, die von Befehlszeilenargumenten ausgeht.?=
funktioniert . Wenn es nicht das tut, was Sie wollen, ist entweder Ihre obige Erklärung verwirrend und wir verstehen nicht, was Sie wollen, oder es gibt etwas an Ihrer realen Umgebung, das sich in Ihrer obigen Frage nicht widerspiegelt.Antworten:
Um meinen obigen Kommentaren nachzugehen, hier ein Beispiel:
T ?= foo all: : '$(T)'
Wenn ich das Makefile nun auf verschiedene Arten ausführe, verhält es sich wie erwartet (ich bekomme es
foo
nur, wenn ich esT
weder in der Befehlszeile noch in der Umgebung festgelegt habe):$ make : 'foo' $ make T=bar : 'bar' $ T=bar make : 'bar'
quelle
all:;:
?all:
erstellt eine Regel für ein Ziel alle . Das Semikolon beendet die Liste der Voraussetzungen und beginnt die erste Rezeptzeile. Das letzte:
ist das Rezept; Ein Doppelpunkt ist ein spezieller POSIX-Shell-Operator, der im Grunde bedeutet "nichts tun". Dies definiert also eine vollständige Regel für dasall
Ziel, die ein Rezept hat, das nichts tut.In der Befehlszeile von make angegebene Variablen überschreiben die in makefile zugewiesenen Werte :
TMPDIR := "/tmp" test: @echo $(TMPDIR)
Und dann:
Es ist im Allgemeinen eine schlechte Praxis, dass Makefiles von Umgebungsvariablen abhängen. Aus diesem Grund wird die Übergabe von Variablen in der make-Befehlszeile bevorzugt.
Eine andere Möglichkeit ist die Verwendung der make-
or
Funktion:X := $(or ${X},${X},abc) all : @echo ${X} make abc X=def make def
Eigentlich sollten Sie sich nur an die
?=
Zuweisung halten.quelle
TMPDIR := $(or $$TMPDIR,$$TMPDIR,"/tmp")
aber es scheint nicht zu funktionieren.$(or
Aufrufe scheinen mehr zu sein als nötig. Funktioniert das nicht$(or $X,abc)
?Hier ist eine einfache Lösung:
SHELL := env TMPDIR=$(TMPDIR) $(SHELL) TMPDIR ?= "/tmp" all: @echo $(TMPDIR)
Das funktioniert für beide Szenarien:
TMPDIR=new/path make
undmake TMPDIR=new/path
.quelle
Eines der Dinge, die Sie tun könnten, ist:
TMPDIR := "/tmp" ifdef $$TMPDIR TMPDIR := $$TMPDIR endif test: echo $(TMPDIR)
quelle
TMPDIR=~/tmp make
, nur wenn es als läuftmake TMPDIR=~/tmp
, aber die Frage war, ob es für beide funktioniert.