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

Posted

技术标签:

【中文标题】nmake.exe:有没有办法从宏中指定的一组文件中排除一个文件?【英文标题】:nmake.exe: is there a way to exclude a file from a set of files specified in a macro? 【发布时间】: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))

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于nmake.exe:有没有办法从宏中指定的一组文件中排除一个文件?的主要内容,如果未能解决你的问题,请参考以下文章

grep 返回“命令中指定的参数过多”[重复]

为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?

如何删除PDF文档中指定的一页文件?

php返回数组中指定的一列方法是啥?

如何使用 C# 为 OData 查询中指定的每个过滤器获取一组键/值对?

Intellij IDEA 无法识别 Maven 依赖项中指定的类