2013-12-17 4 views
6

Я столкнулся с каким-то странным поведением при использовании Make recent (v3.81).Могу ли я сказать Make игнорировать переменные окружения?

Предположим, что я следующий Makefile:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

all: 
    @echo "Hi" 

clean: 
    @echo "Hi again" 

Кажется достаточно простым, верно? Примечательно, что FOOBAR является «рекурсивно расширенной переменной», поэтому его нельзя оценивать до тех пор, пока я не обращусь к нему. Обратите внимание, что я никогда не обращаюсь к нему. Также обратите внимание, что nonexistentdirectory не существует, как вы могли ожидать.

Теперь предположим, что я поставил FOOBARв оболочке, прежде чем я вызвать цель Make:

compy386$ FOOBAR="stuff" make clean 
find: nonexistentdirectory: No such file or directory 
Hi again 

Почему FOOBAR оцениваемого? Очевидно, что это связано с тем, что переменная определена в оболочке. Предполагаю ли я, что пользователь мог бы установить в своей оболочке переменных? Что я тут делаю?

ответ

2

FOOBAR оценивается, так как вы используете рецепт (для clean) и FOOBAR существует в среде при входе в make. Поскольку FOOBAR существовал в среде при входе, он становится экспортируемой переменной, а это означает, что make предоставит его как часть среды любой программе в рецепте. make не специальный чехол echo; он просто использует тот, который найден на вашем пути. И он не может знать, ссылается ли эта утилита на конкретную переменную среды, поэтому она должна экспортировать все экспортированные переменные, а это значит, что она должна оценивать FOOBAR.

(Для официального слова, увидеть третий абзац Variables from the Environment в макияже руководстве. Также смотрите рецепт на recursive make invocation.)

Чтобы ответить на прямой вопрос, вы можете сказать, make игнорировать тот факт, что переменный поступает из окружающей среды, поэтому он не реэкспортирует его, не экспортируя его:

unexport FOOBAR 
0

Добавить ? перед = как:

FOOBAR ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

Это будет использовать переменную окружения, если установить и оценивать только если установлен или пустой.

Смежные вопросы