繁体   English   中英

Makefile 目标依赖不兑现

[英]Makefile target dependency not honored

#!make

.PRECIOUS: a/b/c/%_pqr
a/b/c/%_pqr:
        echo $@
        touch $@

.PRECIOUS: a/b/c/%_abc
a/b/c/%_abc: a/b/c/pqr_pqr
        echo $@
        touch $@

当我第一次运行时,它尊重它的依赖性:

make a/b/c/pqr_abc -f 1.mk
echo a/b/c/pqr_pqr
a/b/c/pqr_pqr
touch a/b/c/pqr_pqr
echo a/b/c/pqr_abc
a/b/c/pqr_abc
touch a/b/c/pqr_abc

但是如果我删除“a/b/c/pqr_pqr”文件然后再次运行这个目标,它不会做必要的:

rm -f a/b/c/pqr_pqr; make a/b/c/pqr_abc -f 1.mk
make: `a/b/c/pqr_abc' is up to date.

据我了解,它应该再次运行两个目标。 请有人帮助我。

您的两个目标都是隐含的,因此是中间的。 根据文档

第一个区别是如果中间文件不存在会发生什么。 [...] 但是如果 b 是一个中间文件,那么 make 可以单独留下。 它不会更新 b 或最终目标,除非 b 的某些先决条件比该目标更新,或者有其他原因需要更新该目标。

因此,由于pqr_abc已经存在并且pqr_pqr是一个中间文件并且没有先决条件(因此没有先决条件发生变化),因此不会重新生成。

根据 make 的理解,只需要创建pqr_pqr以从中生成pqr_abc (这是中间文件的定义),并且由于pqr_abc已经存在,因此无需重新生成它。

如果你希望每次都重新生成文件,则必须明确提及,以便不再将其视为中间文件,即:

$ cat Makefile
a/b/c/%_pqr:
        touch $@

a/b/c/%_abc: a/b/c/pqr_pqr
        touch $@

a/b/c/pqr_pqr:

最后一行定义了明确的目标,但没有定义食谱,它仍然会从隐式规则中调用。 请注意,它将不再被视为中间值,也不会自动删除,因此也不需要.PRECIOUS指令。

Output:

$ make a/b/c/pqr_abc
touch a/b/c/pqr_pqr
touch a/b/c/pqr_abc

$ make a/b/c/pqr_abc
make: 'a/b/c/pqr_abc' is up to date.

$ rm a/b/c/pqr_pqr
$ make a/b/c/pqr_abc
touch a/b/c/pqr_pqr
touch a/b/c/pqr_abc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM