#makefile
#makefile
Вопрос:
Я вижу некоторое интересное поведение с переменными, переданными в вложенный файл. Я создал игрушечный пример проекта со следующим макетом:
./make_test
| -- foo
| -- Makefile
-- Makefile
make_test/Makefile
.PHONY: deps
deps:
$(MAKE) -C foo
.PHONY: deps2
deps2: export SOME_VAR=something
deps2:
$(MAKE) -C foo
make_test/foo/Makefile
SOME_VAR ?= something
$(info 1 - SOME_VAR=$(SOME_VAR))
SOME_VAR = else
$(info 2 - SOME_VAR=$(SOME_VAR))
all: deps
@$(MAKE) app
.PHONY: deps
deps:
$(info Getting deps)
app: foo_a foo_b
touch app
foo_a:
touch foo_a
foo_b:
touch foo_b
Результаты выполнения make deps
/Library/Developer/CommandLineTools/usr/bin/make -C foo
1 - SOME_VAR=something
2 - SOME_VAR=something else
Getting deps
1 - SOME_VAR=something
2 - SOME_VAR=something else
make[2]: `app' is up to date.
Результаты выполнения make deps2
/Library/Developer/CommandLineTools/usr/bin/make -C foo
1 - SOME_VAR=something
2 - SOME_VAR=something else
Getting deps
1 - SOME_VAR=something else
2 - SOME_VAR=something else else
make[2]: `app' is up to date.
Я понимаю, что SOME_VAR
это оценивается дважды. Однако для deps
конечного результата something else
, в то deps2
время как результаты something else else
.
Мой вопрос в том, почему значение SOME_VAR
«reset» перед второй оценкой при вызове deps
, но нет deps2
. Почему на это влияет передача начального значения в вложенный файл?
Ответ №1:
Если вы export
задаете переменную, эта переменная будет рекурсивно export
отредактирована, если вы unexport
не сделаете это позже.
Когда вы вызываете $(MAKE)
в foo/Makefile
нем export
s SOME_VAR
as something else
, потому что вы сказали make export
ему в корневом makefile.
Комментарии:
1. Есть ли способ предотвратить такое поведение, но все же передать значение в вложенный файл? Я знаю, что мог бы использовать
findstring
, чтобы проверить, был лиelse
уже добавленSOME_VAR
, но есть ли лучший способ?2. @GuessBurger Я думаю, что ваш пример слишком надуманный, чтобы ответить на этот вопрос, без реального примера того, что вы пытаетесь сделать, все, что я могу сказать, это то, что вам, вероятно, не следует возвращаться в ту же папку.