在makefile中使用带有通配符的nmake

ang*_*son 9 png nmake export balsamiq

我正在尝试设置一个nmake makefile来自动将我们的balsamiq模型文件导出到png文件中,但是我担心如何制作一个通用规则无法做到这一点,而无需明确列出所有文件我想出口.

此页面详细介绍了导出文件的命令行语法,此页面包含一个示例,其中包含.obj文件到.exe文件的通用规则.

我到目前为止尝试过的makefile看起来像这样:

.bmml.png:
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< $@
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

如果我只是运行nmake(带有一些过时的png文件),nmake就是这样做的:

[C:\Temp] :nmake

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


[C:\Temp] :
Run Code Online (Sandbox Code Playgroud)

如果我要求它构建一个特定的文件,它会这样做:

[C:\Temp] :nmake "TestFile.png"

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1073: don't know how to make '"TestFile.png"'
Stop.

[C:\Temp] :
Run Code Online (Sandbox Code Playgroud)

在那里任何一个可以让我直截了当的nmake大师?

一个示例makefile,通过复制它们来简单地从.txt文件生成.dat文件,以进行试验,如下所示:

.txt.dat:
    copy $< $@
Run Code Online (Sandbox Code Playgroud)

这没什么用,所以显然我不明白这些通用规则是如何运作的.我是否需要指定一个目标,以某种方式列出我想要的文件?


编辑:回答新答案:

这个makefile:

{}.txt{}.dat:
    copy $** $@
Run Code Online (Sandbox Code Playgroud)

使用此文件(test.dat)

1
2
3
Run Code Online (Sandbox Code Playgroud)

这个命令:

NMAKE test.txt
Run Code Online (Sandbox Code Playgroud)

生成此错误消息:

[C:\] :nmake test.txt

Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1073: don't know how to make 'test.txt'
Stop.
Run Code Online (Sandbox Code Playgroud)

Eri*_*ski 16

NMAKE模式规则很像GNU make old-school后缀规则.在你的情况下,你开始时几乎是正确的,但你错过了.SUFFIXES声明.例如:

.SUFFIXES: .bmml .png
.bmml.png:
    @echo Building $@ from $<
Run Code Online (Sandbox Code Playgroud)

我认为这只是解决方案的一部分,因为您还提到要避免明确列出要转换的所有文件.不幸的是,我不知道在NMAKE中有一个非常干净的方法,因为它只扩展了依赖项列表中的通配符,而你在依赖项列表中真正想要的不是已经存在的文件列表(*.bmml)文件),但是将从这些文件(*.png文件)创建的文件列表.不过,我认为你可以用这样的递归NMAKE调用来实现你的目标:

all: *.bmml
    $(MAKE) $(**:.bmml=.png)
Run Code Online (Sandbox Code Playgroud)

在这里,NMAKE将*.bmml在prereq列表中扩展all到目录中的.bmml文件列表,然后它将启动一个新的NMAKE实例,指定要构建的目标,并将所有实例.bmml替换为该文件列表.png.所以,把它们放在一起:

.SUFFIXES: .bmml .png
all: *.bmml
    @echo Converting $(**) to .png...
    @$(MAKE) $(**:.bmml=.png)

.bmml.png:
    @echo Building $@ from $<
Run Code Online (Sandbox Code Playgroud)

如果我创建文件Test1.bmml和Test2.bmml然后运行这个makefile,我得到以下输出:

Converting Test1.bmml Test2.bmml to .png...
Building Test1.png from Test1.bmml
Building Test2.png from Test2.bmml
Run Code Online (Sandbox Code Playgroud)

当然,如果你有很多这些.bmml文件,你可能会遇到命令行长度限制,所以要小心.在这种情况下,我建议明确列出源文件,或使用功能更强大的make工具,如GNU make(可用于各种形式的Windows).