1

我正在寻找类似 msbuild 的排除过滤器之类的东西,但我希望它在由 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 不允许为该替换的任一参数的值使用宏。我不能做到这一点:

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

1 回答 1

1

我没有找到一种方法来做我想要的,但我找到了一种解决方法。

它涉及称为“内联文件”的东西,这些文件是 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。

于 2010-05-10T21:34:05.077 回答