Определить переменную Makefile с помощью переменной ENV или значения по умолчанию
Я пытаюсь сделать простую вещь:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
Это работает, если я запускаю:
$ make test
/tmp
Он также работает, если я запускаю:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
Что я могу сделать, чтобы он работал для:
$ TMPDIR=~/tmp make test
/home/user/tmp
Ответы
Ответ 1
Чтобы прокомментировать мои комментарии выше, вот пример:
T ?= foo
all:
: '$(T)'
Теперь, если я запускаю Makefile различными способами, он ведет себя так, как мы ожидаем (я получаю foo
только если я не установил T
ни в командной строке, ни в среде):
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
Ответ 2
Переменные, указанные в командной строке make, переопределяют значения, назначенные в make файле:
TMPDIR := "/tmp"
test:
@echo $(TMPDIR)
А потом:
make TMPDIR=whatever
whatever
Как правило, плохая практика для make файлов зависеть от переменных среды, поэтому передача переменных в командной строке make предпочтительнее.
Другой способ - использовать make or
функцию:
X := $(or ${X},${X},abc)
all :
@echo ${X}
make
abc
X=def make
def
На самом деле, вы должны просто использовать ?=
Назначение.
Ответ 3
Вот простое решение:
SHELL := env TMPDIR=$(TMPDIR) $(SHELL)
TMPDIR ?= "/tmp"
all:
@echo $(TMPDIR)
который работает для обоих сценариев: TMPDIR=new/path make
и make TMPDIR=new/path
.
Ответ 4
Одна из вещей, которую вы можете сделать, это:
TMPDIR := "/tmp"
ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif
test:
echo $(TMPDIR)