1

我在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

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

谢谢,

约翰

4

2 回答 2

6

$^记录行为是省略仅订购的先决条件,因此您可以依赖它(您可以使用 $|它来获取订购的先决条件,顺便说一句)。

于 2013-01-10T21:31:42.677 回答
2

是的,正如 Anton 所说$^,不会列出仅订单的先决条件,以便在|您必须使用$|.

检查下面的makefile代码,

A B C D:

      @echo building $@

preq_test : ab | 光盘

      @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.

于 2013-01-11T11:58:16.797 回答