2011-01-26 14 views
2

我注意到nmake.exe將其推理規則搜索限制爲一個丟失的文件。我發現在網上沒有提到這個問題。我錯過了什麼嗎?nmake推理規則限於1的深度

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

all: abc.e 

.a.b: 
     copy $** [email protected] 

.b.d: 
     copy $** [email protected] 

.d.e: 
     copy $** [email protected] 

$ 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. 

此相同的生成文件產生TBE與GNU化妝以下:

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

當然,$**宏和copy命令不與GNU使一樣有用。 ;-)

您的nmake.exe版本處理這個更好嗎?有沒有魔法開關?或者它看起來真的很糟糕?

回答

3

這裏的問題是跟蹤您的構建過程中的多步操作。您的源文件會生成某種類型的中間文件,然後生成最終的構建輸出。在一個糟糕的宇宙中,你可能會修改一個源文件,然後你的最終二進制文件仍然可以從中間文件的陳舊版本來構建。顯然,那會很糟糕。

GNU make採用一次建模整個依賴樹的方法,並將修改後的文件追蹤到輸出。如果make是您使用的唯一構建工具,這非常棒。如果你有非常大的項目,這不太好,所以你需要按照特定的順序進行。如果'make'不支持你的構建過程中的某些工具,那麼這樣做效果不好,因此無論如何你都需要運行make多次。

nmake.exe採取了做最簡單的事情的方法:一次只做一次。它假定它將成爲更大工具鏈的一部分。所以,如果你有多通道依賴,你需要多次通過nmake。如果你的構建過程需要3次以上的通行證,那麼你可能做了一件壞事,你應該修復你的過程。大聲哭泣,如果你需要多次通過,只需寫一個腳本來完成。