我注意到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一起产生以下内容:
$ make -n 复制abc * abc.b 复制abc * abc.d 复制abc * abc.e rm abc.b abc.d
当然,$**宏和copy命令在GNU make中不那么有用。;-)
您的版本nmake.exe处理得更好吗?有魔术开关吗?还是真的像看起来那样坏了?
小智 5
这里的问题是在构建过程中跟踪多步骤操作。您的源文件产生某种中间文件,这些中间文件又产生最终的构建输出。在糟糕的Universe中,您可能会更改源文件,然后最终的二进制文件仍然可以从旧版本的中间文件中构建。显然,那将是不好的。
GNU make采用了一次对整个依赖树进行建模的方法,并一直跟踪修改后的文件直至输出。如果make是您使用的唯一构建工具,那么这很好。如果您有非常大的项目,这将无法正常工作,因此您需要按特定的顺序进行制作。如果'make'不支持构建过程中的某些工具,则此方法将无法正常工作,因此无论如何您都需要多次运行make。
nmake.exe采用最简单的方法:一次仅执行一次传递。假设它将成为更大的工具链的一部分。因此,如果您具有多遍依赖关系,则将需要多遍nmake。如果您的构建过程需要3次以上的通过,则您可能正在做一件坏事,应该修复您的过程。为了大声喊叫,如果需要多次通过,只需编写一个脚本来完成。