在递归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 -j s
时,它会按预期运行。
但是如果我切换到 alt2 (注释掉alt1规则,在alt2规则中注释),make -j s
只运行true
,并默默地忽略先决条件{{ 1}},bs1
和bs2
目标。
同样,使用 alt1 ,bs3
调用sub-make,而使用 alt2 ,make bs1
表示make bs1
使用Nothing to be done for 'bs1'.
虚拟目标的技巧并未改变行为。
为什么?