web-dev-qa-db-fra.com

Définir une variable Makefile en utilisant une variable ENV ou une valeur par défaut

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

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'
80
MadScientist

Les variables spécifiées sur la ligne de commande make remplacent les valeurs assignées dans le fichier makefile :

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.

20
Maxim Egorushkin

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.

3
kenorb

Une des choses que vous pourriez faire est:

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)
0
Natim