nmake.exe:有没有办法从宏指定的文件集中排除文件?

时间:2010-05-10 20:42:56

标签: windows nmake

我正在寻找像msbuild的Exclude过滤器之类的东西,但我希望它在由nmake处理的makefile中。

这可能吗?

假设我有一个定义此宏的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)

和$(objs)的值是

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 个答案:

答案 0 :(得分:1)

我没有办法完全按照自己的意愿行事,但我找到了解决方法。

它涉及一个名为"inline files"的东西,它是nmake动态创建然后在命令块中使用的文件。在我的情况下,我使用“内联文件”技巧来创建.cmd文件并运行它。 .cmd文件执行了include / exclude逻辑,然后在按摩的源文件列表上运行编译器。

看起来像这样。

  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。