Makefile:仅订购先决条件和$ ^

时间:2013-01-10 21:22:50

标签: makefile gnu-make

我在makefile中有以下内容:

.PHONY: preq_test a b c d

a b c d:
    @echo building $@

preq_test : a b | c d
    @echo preq prequisites are: $^;

现在,$^应根据文档列出所有先决条件(除了重复项):

$^
$+
    The names of all the prerequisites, with spaces between them. For prerequisites
    which are archive members, only the named member is used (see Archives). The value
    of $^ omits duplicate prerequisites, while $+ retains them and preserves their
    order.

但仅限订单的先决条件未显示在$^

building a
building b
building c
building d
preq prequisites are: a b

我可以依赖当前的行为,还是应该以其他方式工作,还是应该将其视为未定义的行为?

谢谢,

约翰

2 个答案:

答案 0 :(得分:6)

$^的{​​{3}}是省略仅限订单的先决条件,因此您可以依赖它(documented behavior $| >仅限订单的先决条件,BTW)。

答案 1 :(得分:2)

是的,因为Anton说$^不会列出仅限订单的先决条件,因为在|之后打印依赖关系必须使用$|

检查以下makefile代码,

  

a b c d:

      @echo building $@
     

preq_test:a b | c d

      @echo preq prequisites are: $^ $|;

欲了解更多信息:

$^     所有先决条件的名称,它们之间有空格。对于作为存档成员的先决条件,仅使用指定的成员(请参阅存档)。无论每个文件作为先决条件列出多少次,目标在其依赖的每个其他文件上只有一个先决条件。因此,如果您为目标多次列出先决条件,则$ ^的值仅包含该名称的一个副本。 This list does not contain any of the order-only prerequisites; for those use $ | variable.

$+     这类似于$^,但是多次列出的先决条件按照它们在makefile中列出的顺序重复。这主要用于链接命令,以便按特定顺序重复库文件名。

$|     The names of all the order-only prerequisites, with spaces between them.