我正在寻找像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))
答案 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。