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