为子目录制定模式规则
Make pattern rule for subdirectories
在递归 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%
.
当我 运行 make -j s
使用 alt1 时,它按预期工作。
但是如果我切换到 alt2(注释掉 alt1 规则,在 alt2 规则中注释),make -j s
运行 只有 true
,并默默地忽略先决条件 bs1
、bs2
和 bs3
目标。
同样,使用alt1,make bs1
调用子make,而使用alt2,make bs1
说 Nothing to be done for 'bs1'.
.force
虚拟目标的技巧并没有改变行为。
为什么?
来自manual
The implicit rule search (see Implicit Rules) is skipped for .PHONY
targets.
bs%:
是隐式规则,所以忽略。
在递归 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%
.
当我 运行 make -j s
使用 alt1 时,它按预期工作。
但是如果我切换到 alt2(注释掉 alt1 规则,在 alt2 规则中注释),make -j s
运行 只有 true
,并默默地忽略先决条件 bs1
、bs2
和 bs3
目标。
同样,使用alt1,make bs1
调用子make,而使用alt2,make bs1
说 Nothing to be done for 'bs1'.
.force
虚拟目标的技巧并没有改变行为。
为什么?
来自manual
The implicit rule search (see Implicit Rules) is skipped for
.PHONY
targets.
bs%:
是隐式规则,所以忽略。