J'essaie de faire une chose simple:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
Cela fonctionne si je lance:
$ make test
/tmp
Cela fonctionne aussi si je lance:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
Que puis-je faire pour que cela fonctionne également pour:
$ TMPDIR=~/tmp make test
/home/user/tmp
Pour faire suite à mes commentaires ci-dessus, voici un exemple:
T ?= foo
all:
: '$(T)'
Maintenant, si je lance le Makefile de différentes manières, il se comporte comme prévu (je ne reçois foo
que si je ne mets pas T
sur la ligne de commande ou dans l'environnement):
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
TMPDIR := "/tmp"
test:
@echo $(TMPDIR)
Et alors:
make TMPDIR=whatever
whatever
Il est généralement déconseillé pour les makefiles de dépendre de variables d’environnement, c’est pourquoi il est préférable de passer des variables à la ligne de commande make.
Une autre méthode consiste à utiliser la fonction make or
:
X := $(or ${X},${X},abc)
all :
@echo ${X}
make
abc
X=def make
def
En fait, vous devriez juste vous en tenir à utiliser ?=
cession.
Voici une solution simple:
Shell := env TMPDIR=$(TMPDIR) $(Shell)
TMPDIR ?= "/tmp"
all:
@echo $(TMPDIR)
qui fonctionne pour les deux scénarios: TMPDIR=new/path make
et make TMPDIR=new/path
.
Une des choses que vous pourriez faire est:
TMPDIR := "/tmp"
ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif
test:
echo $(TMPDIR)