我注意到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
版本是否能更好地处理此问题?有魔术开关吗?或者它真的像看起来一样破碎?
答案 0 :(得分:4)
此处的问题是在构建过程中跟踪多步操作。您的源文件生成某种类型的中间文件,这些文件又生成最终的构建输出。在糟糕的Universe中,您可能会对源文件进行更改,然后仍然可以从中间文件的旧版本构建最终的二进制文件。显然,那会很糟糕。
GNU make采用一次建模整个依赖关系树的方法,并将修改后的文件一直跟踪到输出。如果make是您使用的唯一构建工具,那么这很棒。如果您有非常大的项目,这不能很好地工作,因此您需要按特定顺序制作它们。如果'make'不支持构建过程的某些工具,那么这不会很好,所以无论如何你都需要多次运行make。
nmake.exe采用最简单的方法:一次只进行一次传递。它假设它将成为更大工具链的一部分。因此,如果您有多遍依赖关系,则需要多次传递nmake。如果您的构建过程需要超过3次,那么您可能正在做一件坏事,您应该修复您的过程。如果您需要多次通过,请大声哭泣,只需编写一个脚本即可完成。