it-swarm.com.de

Definieren Sie eine Makefile-Variable mit einer ENV-Variable oder einem Standardwert

Ich versuche eine einfache Sache zu machen:

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
54
Natim

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 erhalte foo nur, wenn ich T weder in der Befehlszeile noch in der Umgebung einstelle):

$ make
: 'foo'

$ make T=bar
: 'bar'

$ T=bar make
: 'bar'
80
MadScientist

In der make-Befehlszeile angegebene Variablen überschreiben die in makefile zugewiesenen Werte :

TMPDIR := "/tmp"
test:
    @echo $(TMPDIR)

Und dann:

make TMPDIR=whatever
whatever

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 Funktion make or:

X := $(or ${X},${X},abc)

all :
    @echo ${X}

make
abc

X=def make 
def

Eigentlich solltest du einfach bei der Zuweisung von ?= Bleiben.

20

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 und make TMPDIR=new/path.

3
kenorb

Eines der Dinge, die Sie tun könnten, ist:

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)
0
Natim