Makefile 对通配符目标使用nmake
使用Makefile 对通配符目标使用nmake,makefile,nmake,Makefile,Nmake,使用nmake我有下面的makefile,它当前执行我需要它执行的操作mycmd(正在运行的程序)将获取.inp文件并生成.out文件。我可以根据需要制作任意数量的.inp文件,并且制作文件不需要更改。它将找到所有这些文件,并生成所有相关的.out文件 ##################################################################################### # A SUFFIXES declaration is required
nmake
我有下面的makefile,它当前执行我需要它执行的操作mycmd
(正在运行的程序)将获取.inp
文件并生成.out
文件。我可以根据需要制作任意数量的.inp
文件,并且制作文件不需要更改。它将找到所有这些文件,并生成所有相关的.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进行简单的修改就可以了。添加新的$(模式)
宏:
。后缀:.inp
模式=*#新宏;默认为*
全部:$(模式)。inp#使用它!
@$(MAKE)-nologo$(**:.inp=.out)
.inp.out:#用于测试的假存根
@echo mycmd-i$(*B).inp-o$(*B).out
@键入NUL>$(*B).out
然后在命令行中,覆盖模式
。例如,nmake-nologo pattern=ABC*
更新:生成文件中的命令行:
$(MAKE) $(**:.inp=.out)
将失败,出现致命错误U1095:扩展的命令行<如果字符串$**
太长,则代码>太长。在我的系统中,这大约是32800个字符
添加感叹号代码>一开始(请参阅)似乎不起作用,可能是因为没有简单的$**
。将使用两种变通方法:
!call set a=$** & call nmake %%a:.inp=.out%%
或:
这两个程序的速度都是原来的两倍,使用的是一个不做任何事情的mycmd
stub。(此处的for
循环实际上不是一个循环,因为$**
只是一个项目。)另一种解决方案是保留原始生成文件,并使用DOS命令,例如:
for %a in (ABC*.inp) do nmake -nologo %~na.out
这里的语法%~na
从变量%a
中删除扩展名
这比仅仅使用makefile稍微慢一点,但不会慢很多。例如,对于600个inp
文件和一个mycmd
存根,在我的系统上,这个命令需要20秒,而makefile需要15秒。Edit:可能需要提及。谢谢!第二条评论:谢谢你的更新。我的makefile不需要处理接近32K字符的文件,所以这个限制对我来说不是问题(谁会让文件名这么长!)
for %a in (ABC*.inp) do nmake -nologo %~na.out