2010-05-10 54 views
0

我正在尋找諸如用於msbuild的Exclude過濾器,但我希望它在由nmake處理的生成文件中。nmake.exe:是否有一種方法可以從宏中指定的一組文件中排除文件?

這可能嗎?

假設我有一個makefile定義此宏:

SOURCES=xxx.c yyy.c zzz.c 

,我調用它與nmake OLD=xxx.c NEW=bbb.c

...我能生產,makefile文件中,宏與像一個值:

yyy.c zzz.c bbb.c 

...基本上用bbb.c代替xxx.c?

這些文件可以按任意順序出現。


如果可以在nmake宏中進行字符串替換,允許評估宏,這將非常容易。

換句話說,我所能做的

sources=xxx.c yyy.c zzz.c 
objs=$(sources:.c=.o) 

和值$(OBJ文件)是

xxx.o yyy.o zzz.o 

nmake does not allow a macro for the value of either argument to that substitution。我不能這樣做:

new=.o 
sources=xxx.c yyy.c zzz.c 
objs=$(sources:.c=$(new)) 

回答

1

我沒有找到一種方法來做到我想要的,但我找到了解決方法。

它涉及到一些叫做"inline files"的文件,它們是nmake動態創建的文件,然後在命令塊中使用。在我的情況下,我使用「內聯文件」技巧來創建.cmd文件並運行它。 .cmd文件執行了包含/排除邏輯,然後在源文件的按摩列表上運行編譯器。

看起來像這樣。

CSOURCE=Fribble.c Zambda.c Twoolie.c 
     .... 
    target : 
      <<tmp-build-file.cmd $(CSOURCE) 
     SETLOCAL ENABLEDELAYEDEXPANSION 
     for %%I in (%*) do if NOT %%I == $(EXC) (
     set filesToBuild=!filesToBuild! %%I 
    ) 
     $(CC) $(INC) !filesToBuild! 
     ENDLOCAL 
    << 

要調用的是,你可以這樣做:

nmake INC=AdditionalFile.c EXC=Zambda.c target 

...它做正確的事:編譯Fribble.c Twoolie.c和AdditionalFile.c,但不Zambda.c。

相關問題