2010-12-17 22 views
4

在爲GNU makefile文件讓我用這個成語來測試文件是否存在:測試文件存在於NMAKE

static: 
ifeq ($(wildcard $(FileName)),) 
    # do something when the file doesn't exist 
else 
    # do something different when it does 
endif 

不過,這並不在NMAKE(fatal error U1000: syntax error : ')' missing in macro invocation)工作。我該如何更換它?如果替換在兩個構建系統中均可行,那將是完美的。

回答

2

在shell級別而不是Makefile級別執行此操作。如果你可以依靠posix工具:

static: 
    @if test -f $(FileName); then \ 
     echo something; \ 
    else \ 
     echo some other thing; \ 
    fi 

注意到所有行的連續標記。

如果你需要做這CMD.EXE,那麼也許你使用IF EXIST $(FileName) COMMAND ELSE COMMAND結構可以做類似。

6

只需添加到傑克·凱利的建議,你可以做存在測試的CMD.EXE的外殼。 NMake還包括創建臨時.cmd文件並執行它的功能。

這裏是(n)的生成文件語法的例子,我使用了「檢查語法」的目標。它通過編譯來檢查多文件項目中單個C#源文件中的語法。

check-syntax : 
    <<flymake-build.cmd $(CS_SOURCE) 
SETLOCAL ENABLEDELAYEDEXPANSION 
set errorlevel= 
for %%I in (%*) do if NOT x%%I == x$(FLYMAKE_ORIGINAL) (
    set filesToBuild=!filesToBuild! %%I 
) 
$(_CSC) /t:module $(LIBSREF) $(FLYMAKE_CHECK) !filesToBuild! 
ENDLOCAL && exit /b %errorlevel% 
<< 

「flymake-build.cmd」是創建的臨時cmd文件的名稱。雙尖括號(<<)表示在執行文件之前進入臨時文件的內容的開始和結束。

之後的東西第一行的文件名是傳遞給.cmd文件的參數。在這個例子中,參數是一個名爲CS_SOURCE的makefile變量的內容。在我的情況下,這只是項目中的文件名列表。 Makefile變量也將在臨時文件的文本內展開。你可以看到我指的是一個編譯器(_CSC)和其他一些符號。

裏面的.CMD代碼,您可以循環做,if語句,你喜歡的東西。這是一個普通的.cmd文件。

如果您希望nmake響應.cmd文件中命令生成的錯誤(例如,終止構建),則需要使用exit /b方法來結束cmd。

我發現在黑暗的角落裏爲這個文檔的某個地方,所以我想我會在這裏分享它一般澄清。 (編輯here's the link。)

+0

這是很整潔,並且遠遠超出我做了什麼回來時,我用批處理文件修修補補(我想巴特的ModBoot啓動盤很瘋狂)。也許你可以爲這些信息提出一個單獨的問題和答案?讓它消失在互聯網的另一個黑暗角落是件可恥的事情。 – 2010-12-26 04:23:09

+0

嘿傑克。是的,我認爲這也是有用的。我已經在幾個stackoverflow答案中引用了此功能(例如:http://stackoverflow.com/questions/801778/2813575#2813575,http://stackoverflow.com/questions/3745261/4118794#4118794),其中之一是我自己的問題(http://stackoverflow.com/q/2806325/48082)。不過,這些問題並不是很受歡迎。如今,Nmake似乎正在走出MSBuild風格。 – Cheeso 2010-12-26 14:31:48

3

NMAKE可以運行預處理程序指令:

http://msdn.microsoft.com/en-us/library/7y32zxwh.aspx

的條件可以改變,但是否存在()就是其中之一:

http://msdn.microsoft.com/en-us/library/8t2e8d78.aspx

!IF EXISTS(foo.txt) 

最後你用命令行,http://msdn.microsoft.com/en-us/library/wkxa7sac.aspx

!IF [cmd /C IF NOT EXIST "foo.txt" exit 1] 

無論哪種方式,這應該工作,即使用IF上面這裏是完整的例子:

!IF !EXISTS(foo.txt) 
!ERROR Unable to locate foo. 
!ELSE 
!MESSAGE I Found foo! 
!ENDIF 
+0

這應該是公認的答案。它已經在DDK/WDK構建過程中使用過,像'build.exe'是基於'nmake.exe'構建過程的包裝。 – 0xC0000022L 2016-02-12 13:36:26