Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 为子目录生成模式规则_Makefile_Gnu Make - Fatal编程技术网

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
目标一起使用。