【问题标题】:forcing order of prerequisites in Makefiles强制 Makefile 中的先决条件顺序
【发布时间】:2013-01-10 20:56:15
【问题描述】:

我有一个第三方生成文件,我希望在先构建另一个自定义目标 (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目标,所以重写它不仅困难,而且使代码不可移植。另外,我之前不能运行T2由于其他一些依赖关系,在内核上调用 make)。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    将 T2 设为 order-only prerequisite:

    T1: x y z | T2
        $(MAKE) -j $^;
        # Make will run the T2 rule before this one, but T2 will not appear in $^
    

    【讨论】:

    • 虽然这确实有效,但根据 Makefile 文档(gnu.org/software/make/manual/make.html),$^ 包含所有先决条件,但重复项除外。因此 T2 应该在 $^ 中(尽管不是)。那么这是标准行为,还是这是一个错误?即,我可以指望这适用于不同版本的 make,包括未来的?
    • 好的,收回最后一个。显然 $^ 在该 url 被描述了两次——一旦它提到不包括仅订购的,另一次则不包括。我会向文档所有者发送一封电子邮件,让他们知道。
    • $^ 的第二个描述只是快速参考附录。第一个被描述为: > 此列表不包含任何仅订单的先决条件;对于那些看到$|变量
    • 顺便说一句,如果有多个仅限订单的先决条件| A B C,它们是否按照A > B > C 的顺序构建?
    • @nn0p:AFAIK 未指定它们的构建顺序;他们可能会按顺序进行,但不要指望它。
    【解决方案2】:

    你能不能在你的构建脚本中调用 Make,两个目标按正确的顺序,例如

    make T2 T1
    

    这样您就无需对 T1 进行任何修改。

    【讨论】:

    • 以上评论极其重要。 (它强调的问题是让我头疼不已,并使连续剧make 看起来很有吸引力,尽管这会导致 8 倍的减速。好吧,我之前已经忍受了足够长的时间......)
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2013-04-22
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多