Сделать так, чтобы переменные не «сбрасывались» в вложенном файле

#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 Я думаю, что ваш пример слишком надуманный, чтобы ответить на этот вопрос, без реального примера того, что вы пытаетесь сделать, все, что я могу сказать, это то, что вам, вероятно, не следует возвращаться в ту же папку.