2010-05-10 84 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。

相关问题