为子目录制作模式规则

时间:2016-05-06 09:47:36

标签: 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 -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}},bs1bs2目标。

同样,使用 alt1 bs3调用sub-make,而使用 alt2 make bs1表示make bs1使用Nothing to be done for 'bs1'.虚拟目标的技巧并未改变行为。

为什么?

1 个答案:

答案 0 :(得分:1)

来自manual

  

.PHONY个目标会跳过隐式规则搜索(请参阅Implicit Rules)。

bs%:是一个隐式规则,因此会被忽略。