将 nmake 与通配符目标一起使用

问题描述 投票:0回答:2

使用

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 nmake
2个回答
3
投票

对 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
循环并不是真正的循环,因为
$**
只是一个单独的项目。)


0
投票

另一种解决方案是保留原始 makefile,并使用 DOS 命令,例如:

for %a in (ABC*.inp) do nmake -nologo %~na.out

此处语法

%~na
从变量
%a
中删除扩展名。

这比仅使用 makefile 稍微慢一些,但也慢不了多少。例如,对于 600 个

inp
文件和
mycmd
存根,在我的系统上,此命令需要 20 秒,而 makefile 需要 15 秒。

© www.soinside.com 2019 - 2024. All rights reserved.