使用
nmake
我有以下makefile,它目前可以完成我需要它做的事情。 mycmd
(正在运行的程序)将获取 .inp
文件并生成 .out
文件。我可以根据需要制作任意数量的 .inp
文件,并且 makefile 不必更改。它将找到所有这些并生成所有相关的 .out
文件。
#####################################################################################
# A SUFFIXES declaration is required in order to later use the rule with target .inp.out
#####################################################################################
.SUFFIXES: .inp
#####################################################################################
# Here, NMAKE will expand *.inp in the prereq list for all, into the list of *.inp
# files in the directory, and then it will start a new NMAKE instance, specifying the
# goals to build all those files.
#####################################################################################
all: *.inp
$(MAKE) $(**:.inp=.out)
#####################################################################################
# $(*B) represents the current target's base name minus the path and the file extension
#####################################################################################
.inp.out:
mycmd -i $(*B).inp -o $(*B).out
我的问题是,如何进一步增强这个 makefile,以便我可以,例如,为一组
.inp
文件运行它,所以不是 *.inp
,而是说,ABC*.inp
?
对 makefile 进行简单修改就可以了。添加新的
$(pattern)
宏:
.SUFFIXES: .inp
pattern = * # new macro, set to default value of *
all: $(pattern).inp # use the new macro!
@$(MAKE) -nologo $(**:.inp=.out)
.inp.out: # dummy stub for testing
@echo mycmd -i $(*B).inp -o $(*B).out
@type NUL > $(*B).out
然后在命令行中覆盖
pattern
。例如,nmake -nologo pattern=ABC*
。
更新: makefile 中的命令行:
$(MAKE) $(**:.inp=.out)
如果字符串 fatal error U1095: expanded command line
太长,将会失败,并显示
too long
... $**
。在我的系统上,这种情况发生在大约 32800 个字符时。
在开头添加感叹号
!
(请参阅此处)似乎不起作用,可能是因为没有简单的$**
。使用两种解决方法:
!call set a=$** & call nmake %%a:.inp=.out%%
或:
!for %a in ($**) do nmake -nologo %~na.out
它们的速度大约是原来的两倍,并且带有一个什么都不做的
mycmd
存根。 (这里的 for
循环并不是真正的循环,因为 $**
只是一个单独的项目。)
另一种解决方案是保留原始 makefile,并使用 DOS 命令,例如:
for %a in (ABC*.inp) do nmake -nologo %~na.out
此处语法
%~na
从变量 %a
中删除扩展名。
这比仅使用 makefile 稍微慢一些,但也慢不了多少。例如,对于 600 个
inp
文件和 mycmd
存根,在我的系统上,此命令需要 20 秒,而 makefile 需要 15 秒。