4

我注意到nmake.exe将其推理规则搜索限制为一个丢失的文件。我发现网上没有提到这个问题。我错过了什么吗?

$猫 Makefile
.后缀:.a .b .d .e

全部:abc.e

.ab:
        复制 $** $@

.bd:
        复制 $** $@

.de:
        复制 $** $@

$ touch abc.a

$ nmake
NMAKE:致命错误 U1073:不知道如何制作“abc.e”
停止。

$ nmake -n abc.a
'abc.a' 是最新的

$ nmake -n abc.b
        复制 abc.a abc.b

$ nmake -n abc.d
NMAKE:致命错误 U1073:不知道如何制作“abc.d”
停止。

这个相同的 Makefile 使用 GNU make 生成以下内容:

$使-n
复制 abc* abc.b
复制 abc* abc.d
复制 abc* abc.e
rm abc.b abc.d

当然,$**宏和copy命令在 GNU make 中没有那么有用。;-)

你的版本nmake.exe处理这个更好吗?有魔法开关吗?或者它真的像看起来那样破碎?

4

1 回答 1

5

这里的问题是跟踪构建过程中的多步操作。您的源文件会生成某种中间文件,而这些中间文件又会生成最终的构建输出。在一个糟糕的宇宙中,您可能会对源文件进行更改,然后您的最终二进制文件仍然可以从中间文件的陈旧版本构建。显然,那会很糟糕。

GNU make 采用一次对整个依赖树建模的方法,并一直跟踪修改后的文件直到输出。如果 make 是您使用的唯一构建工具,那就太好了。如果您有非常大的项目,这将无法正常工作,因此您需要按特定顺序制作它们。如果“make”不支持构建过程中的某些工具,这将无法正常工作,因此无论如何您都需要多次运行 make。

nmake.exe 采用最简单的方法:一次只做一次。它假设它将成为更大工具链的一部分。所以如果你有多遍依赖,你将需要多遍nmake。如果您的构建过程需要超过 3 次通过,那么您可能正在做一件坏事,您应该修复您的过程。为了大声喊叫,如果您需要多次通过,只需编写一个脚本即可。

于 2011-02-19T03:22:20.540 回答