为子目录制定模式规则

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,并默默地忽略先决条件 bs1bs2bs3 目标。

同样,使用alt1make bs1调用子make,而使用alt2make bs1Nothing to be done for 'bs1'. .force 虚拟目标的技巧并没有改变行为。

为什么?

来自manual

The implicit rule search (see Implicit Rules) is skipped for .PHONY targets.

bs%:是隐式规则,所以忽略。