Определить переменную 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)