Makefile 使变量不“变”;重置";分装
我看到了一些有趣的行为,变量被传递给子make。我制作了一个玩具示例项目,布局如下: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_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
itexport
sSOME\u VAR
中调用$(MAKE)
作为something
时,因为您告诉MAKE在根Makefile中导出它。是否仍然可以防止这种行为,但仍然将值传递给子MAKE?我知道我可以用findstring
来检查else
是否已经添加到SOME\u VAR
中,但是有更好的方法吗?@GuessBurger我认为你的例子太过做作,无法回答这个问题,如果没有一个真实的例子来说明您正在尝试做什么,我只能说您可能不应该递归到同一个文件夹中。是否有任何方法可以防止这种行为,但仍然将值传递给子make?我知道我可以用findstring
来检查else
是否已经被添加到SOME_VAR
中,但是有更好的方法吗?@Guess Burger我认为你的例子太过做作,无法回答这个问题,如果没有一个真实的例子来说明你正在尝试做什么,我能说的是你可能不应该递归到同一个文件夹中。