Makefile 使变量不“变”;重置";分装

Makefile 使变量不“变”;重置";分装,makefile,Makefile,我看到了一些有趣的行为,变量被传递给子make。我制作了一个玩具示例项目,布局如下: ./make_test | -- foo | \ -- Makefile \ -- Makefile make\u测试/Makefile .PHONY: deps deps: $(MAKE) -C foo .PHONY: deps2 deps2: export SOME_VAR=something deps2: $(MAKE) -C foo SOME_VAR ?= so

我看到了一些有趣的行为,变量被传递给子make。我制作了一个玩具示例项目,布局如下:

./make_test
| -- foo
|   \ -- Makefile
\ -- Makefile
make\u测试/Makefile

.PHONY: deps
deps:
        $(MAKE) -C foo

.PHONY: deps2
deps2: export SOME_VAR=something
deps2:
        $(MAKE) -C foo
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\u test/foo/Makefile

.PHONY: deps
deps:
        $(MAKE) -C foo

.PHONY: deps2
deps2: export SOME_VAR=something
deps2:
        $(MAKE) -C foo
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.
我知道
某些变量会被评估两次。但是,对于
deps
而言,最终结果是
其他东西
,而
deps2
则是
其他东西


我的问题是,为什么调用
deps
而不是
deps2
时,
SOME\u VAR
的值会在第二次求值之前“重置”。为什么将初始值传递给子生成会影响这一点?

如果导出变量,则该变量将递归导出,除非以后取消导出


当您在
foo/Makefile
中调用
$(MAKE)
时,它将
导出
s
一些变量
作为
另一些
,因为您告诉MAKE在根Makefile中导出它。

如果
导出
变量,该变量将以递归方式导出,除非以后将其导出


当您在
foo/Makefile
it
export
s
SOME\u VAR
中调用
$(MAKE)
作为
something
时,因为您告诉MAKE在根Makefile中导出它。

是否仍然可以防止这种行为,但仍然将值传递给子MAKE?我知道我可以用
findstring
来检查
else
是否已经添加到
SOME\u VAR
中,但是有更好的方法吗?@GuessBurger我认为你的例子太过做作,无法回答这个问题,如果没有一个真实的例子来说明您正在尝试做什么,我只能说您可能不应该递归到同一个文件夹中。是否有任何方法可以防止这种行为,但仍然将值传递给子make?我知道我可以用
findstring
来检查
else
是否已经被添加到
SOME_VAR
中,但是有更好的方法吗?@Guess Burger我认为你的例子太过做作,无法回答这个问题,如果没有一个真实的例子来说明你正在尝试做什么,我能说的是你可能不应该递归到同一个文件夹中。