【问题标题】:Make command using default target name 'Makefile'使用默认目标名称“Makefile”生成命令
【发布时间】:2014-02-21 08:12:46
【问题描述】:

为什么下面的makefile 使用Makefile 目标?

生成文件1: 最初,我有以下生成文件,当调用 make abc xyz -s 时,它按预期工作。

%::
echo $@

我会得到

abc
xyz

生成文件2: 现在在添加一个名为 test 的空规则之后。

%:: test
     echo $@
test:

下面的调用

make abc xyz -s

结果

Makefile
abc
xyz

即使我只给出abcxyz 作为目标,为什么我得到Makefile 作为我的输出?提前致谢。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    因为 make 总是在构建实际目标之前尝试重新构建构建文件。如果它找到了 Makefile 的规则并且它已经过时,它将被重新构建并重新加载,并且请求的目标将根据新的 makefile 构建。这是一个功能,因此如果构建文件是自己生成的(在 autotools、cmake 和类似工具中很常见),它就不会使用过时的构建指令。

    更多详情见GNU Make Manual section 3.5

    在上面的具体示例中,规则的目标是%,并且绝对匹配任何内容,包括Makefile。所以make会发现它作为重新制作makefile的规则并评估它。

    现在,在第一种情况下,Makefile 存在并且比它的所有依赖项都更新,因为没有任何依赖项,而且它的依赖项也不需要重新制作,因为没有。所以make会得出Makefile不需要重新制作的结论。

    在第二种情况下,Makefile 存在,但它的依赖关系 test 需要重新制作。所以 make 运行(空)规则,然后返回并运行 Makefile 的规则。因为 make 在建立依赖关系后不会检查时间戳。它只是假设当它重新制作它们时,依赖的目标也需要重新制作。

    【讨论】:

    • 确实是+1。 OP 应该使用 -d 标志来查看实际情况。
    • 您的解释是正确的,但是请您在我的示例中详细说明一下。 “如果它找到 Makefile 的规则”是什么意思。
    • 非常感谢它回答了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多