Makefile 为子目录生成模式规则
在测试递归Makefile 为子目录生成模式规则,makefile,gnu-make,Makefile,Gnu Make,在测试递归make情况下的并行化可能性时,我偶然发现了模式规则的一个奇怪行为 Makefile: ## prepare the dir structure # mkdir -p bs{1,2,3} # for i in 1 2 3; do ln -s ../Makefile bs$i ; done aaa: @echo $(CURDIR) sleep 1 s: bs1 bs2 bs3 true ## alt1 bs1 bs2 bs3: ; +
make
情况下的并行化可能性时,我偶然发现了模式规则的一个奇怪行为
Makefile
:
## prepare the dir structure
# mkdir -p bs{1,2,3}
# for i in 1 2 3; do ln -s ../Makefile bs$i ; done
aaa:
@echo $(CURDIR)
sleep 1
s: bs1 bs2 bs3
true
## alt1
bs1 bs2 bs3: ; +make -C $@ aaa
## alt2
#bs%: ; +make -C $@ aaa
.PHONY: s bs1 bs2 bs3
有两种方法可以选择如何指定目标:直接列出配方中的所有目标,alt1-bs1 bs2 bs3
,或者使用%
模式,alt2-bs%
当我使用alt1运行make-js
时,它会按预期工作
但是如果我切换到alt2(注释掉alt1规则,注释进入alt2规则),则make-js
只运行true
,并且默默地忽略先决条件bs1
、bs2
和bs3
目标
同样地,对于alt1,makeBS1
调用子make,而对于alt2,makeBS1
表示,对“bs1”无需执行任何操作。
使用强制
虚拟目标的技巧不会改变行为
为什么?来自
将跳过.PHONY
目标的隐式规则搜索(请参阅)
bs%:
是一个隐式规则,因此它被忽略。换句话说,在这种情况下,目标名称可能与目录名称不一致?@Dummy00001正如您在定义的第一个规则中所看到的,您只是不能将模式规则与.PHONY
目标一起使用。