nmake推理规则限于1的深度

时间:2011-01-26 18:55:56

标签: nmake

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

$ cat Makefile
.SUFFIXES: .a .b .d .e

all: abc.e

.a.b:
        copy $** $@

.b.d:
        copy $** $@

.d.e:
        copy $** $@

$ touch abc.a

$ nmake
NMAKE : fatal error U1073: don't know how to make 'abc.e'
Stop.

$ nmake -n abc.a
'abc.a' is up-to-date

$ nmake -n abc.b
        copy abc.a abc.b

$ nmake -n abc.d
NMAKE : fatal error U1073: don't know how to make 'abc.d'
Stop.

这个相同的Makefile产生跟随GNU make:

$ make -n 
copy abc* abc.b
copy abc* abc.d
copy abc* abc.e
rm abc.b abc.d

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

您的nmake.exe版本是否能更好地处理此问题?有魔术开关吗?或者它真的像看起来一样破碎?

1 个答案:

答案 0 :(得分:4)

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

GNU make采用一次建模整个依赖关系树的方法,并将修改后的文件一直跟踪到输出。如果make是您使用的唯一构建工具,那么这很棒。如果您有非常大的项目,这不能很好地工作,因此您需要按特定顺序制作它们。如果'make'不支持构建过程的某些工具,那么这不会很好,所以无论如何你都需要多次运行make。

nmake.exe采用最简单的方法:一次只进行一次传递。它假设它将成为更大工具链的一部分。因此,如果您有多遍依赖关系,则需要多次传递nmake。如果您的构建过程需要超过3次,那么您可能正在做一件坏事,您应该修复您的过程。如果您需要多次通过,请大声哭泣,只需编写一个脚本即可完成。