【问题标题】:How make decides to build targetmake 如何决定构建目标
【发布时间】:2010-05-04 04:16:33
【问题描述】:

一个迹象是目标不存在,理解这一点。

另一个是通过比较目标和先决条件的修改时间戳。它如何更详细地工作?比较目标时间戳和先决条件时间戳的逻辑是什么,以及在存在多个先决条件时它是如何工作的?

【问题讨论】:

    标签: makefile timestamp target prerequisites


    【解决方案1】:

    make 首先获取目标的修改时间,然后将该值与每个 prereq 的修改时间进行比较,从左到右顺序,一旦发现任何比目标更新的 prereq 就停止(因为一个较新的 prereq 就足以要求重新构建目标)。

    例如,假设您有这样的规则:

    foo: bar baz boo
    

    进一步,假设这些文件的修改时间如下:

    foo: 4
    bar: 3
    baz: 6
    boo: 2
    

    此时make会比较foo(4)的修改时间和bar(3)的修改时间;由于bar 较旧,make 将继续比较foo (4) 的修改时间与baz (6) 的修改时间。由于baz 较新,make 将决定必须重建foo,并将停止检查foo 的先决条件(因此永远不会检查boo)。

    如果输出目标有多个依赖行,如:

    foo: bar baz
    foo: boo
    

    第二个和后续依赖行中的 prereqs 被简单地附加到输出目标的 prereqs 列表的末尾——也就是说,这个例子与上面的第一个例子完全等价。

    一般来说,所有make 变体都以这种方式运行,尽管某些变体具有修改此行为的扩展(例如,GNU make 包含仅订单先决条件;Sun make 具有“保持状态”功能;等等)。

    【讨论】:

      【解决方案2】:

      Unix make 有相当复杂的推理规则来确定是否需要重建目标。对于 GNU make,您可以通过在没有 Makefile 的目录中运行“make -p”来转储它们。

      规则也可以链式,更多解释是here

      标准 Unix make 和 Microsoft nmake 的工作方式相似

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-30
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 2011-01-04
        相关资源
        最近更新 更多