【问题标题】:nmake.exe: is there a way to exclude a file from a set of files specified in a macro?nmake.exe:有没有办法从宏中指定的一组文件中排除一个文件?
【发布时间】:2010-05-10 20:42:56
【问题描述】:

我正在为 msbuild 寻找类似 @​​987654321@ 过滤器的东西,但我希望它在由 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))

【问题讨论】:

    标签: windows nmake


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2010-09-10
      • 2011-11-27
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多