使用默认目标名称'Makefile'创建命令

Vin*_*uri 2 makefile

为什么以下makefile使用Makefile目标?

Makefile1:最初我有以下makefile在调用make abc xyz -s时按预期工作.

%::
echo $@
Run Code Online (Sandbox Code Playgroud)

我会的

abc
xyz
Run Code Online (Sandbox Code Playgroud)

Makefile2:现在添加一个名为test的空规则.

%:: test
     echo $@
test:
Run Code Online (Sandbox Code Playgroud)

以下调用

make abc xyz -s
Run Code Online (Sandbox Code Playgroud)

结果是

Makefile
abc
xyz
Run Code Online (Sandbox Code Playgroud)

为什么我将Makefile作为我的输出,即使我只给予abcxyz作为目标?提前致谢.

Jan*_*dec 5

因为make总是在构建实际目标之前尝试重建构建文件.如果它找到Makefile的规则并且它是否已过时,它将被重建并重新加载,并且将根据新的makefile构建所请求的目标.这是一个功能,因此如果构建文件本身是生成的(在autotools,cmake等中很常见),它将不会使用过时的构建指令.

有关更多详细信息,请参阅GNU Make Manual第3.5节

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

现在,在第一种情况下Makefile存在并且比所有它的依赖项更新,因为没有,并且它们的依赖性都不需要重新制作,因为没有.因此make将得出结论,Makefile不需要重新制作.

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