强制Makefiles中先决条件的顺序

强制Makefiles中先决条件的顺序,makefile,gnu-make,Makefile,Gnu Make,我有一个第三方makefile,我希望在首先构建另一个定制目标(T2)之前不要构建其中一个目标(T1)。通常,这可以通过将T2作为T1的先决条件来实现。但是,T1在其一个规则中使用了$^。。因此,通过添加先决条件,我最终破坏了构建。。。我所拥有的是: T1: x y z T2 $(MAKE) -j $^; # fails because T2 should not be passed to the make!!! .PHONY: T2 T2: #do some lin

我有一个第三方makefile,我希望在首先构建另一个定制目标(T2)之前不要构建其中一个目标(T1)。通常,这可以通过将T2作为T1的先决条件来实现。但是,T1在其一个规则中使用了$^。。因此,通过添加先决条件,我最终破坏了构建。。。我所拥有的是:

T1: x y z T2
    $(MAKE) -j $^;
    # fails because T2 should not be passed to the make!!!

.PHONY: T2

T2:
    #do some linking and prep for T1

有没有一种好方法可以确保T2在T1之前运行?(注意:上面的示例实际上简化了一点。T1实际上是Linux内核makefile中的vmlinux目标,因此重写它不仅困难,而且会使代码不可移植。此外,由于其他一些依赖关系,我无法在内核上调用make之前运行T2).

您是否可以在构建脚本中调用Make,并按正确的顺序调用两个目标,例如

make T2 T1
这样,您就不需要对T1进行任何修改。

将T2作为:


根据Makefile文档(位于),$^包含除重复项之外的所有先决条件。因此T2应该是$^(尽管不是)。那么这是标准行为,还是一个bug?i、 e,我能指望在不同版本的make上工作吗,包括将来的版本?好的,收回最后一个版本。显然,$^在该url中被描述了两次——一次它提到不包括订单,另一次它没有。我将向文档所有者发送一封电子邮件,让他们知道。
$^
的第二个描述只是一个简单的参考附录。第一个描述为it:>此列表不包含任何仅限订单的先决条件;对于那些查看
$$
变量的人,顺便说一句,如果有多个仅顺序的先决条件
|A B C
,它们是按照
A>B>C
的顺序构建的吗?@nn0p:AFAIK没有指定它们的构建顺序;他们可能会按顺序进行,但不要指望。上面的评论非常重要。(它突出的问题让我头痛不已,让串行<代码>使<代码>看起来很有吸引力,尽管这将导致8倍的减速。好吧,我之前已经忍受了足够长的时间了……)
T1: x y z | T2
    $(MAKE) -j $^;
    # Make will run the T2 rule before this one, but T2 will not appear in $^