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:有没有办法从宏中指定的一组文件中排除一个文件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?