9

我正在尝试设置一个 nmake makefile 以自动将我们的 balsamiq 模型文件导出为 png 文件,但恐怕我无法确定如何制定通用规则,而无需明确列出所有文件我要出口。

此页面详细介绍了用于导出文件的命令行语法,并且此页面包含一个示例,该示例看起来包含将 .obj 文件转换为 .exe 文件的通用规则。

到目前为止,我尝试过的 makefile 如下所示:

.bmml.png:
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< $@

但这不起作用。

如果我只是简单地运行 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] :

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

[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] :

那里有任何可以让我直截了当的nmake大师吗?

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

.txt.dat:
    copy $< $@

这也无济于事,所以很明显我不明白这些通用规则是如何工作的。我是否需要在上面指定一个目标,以某种方式列出我想要的文件?

4

2 回答 2

18

NMAKE 模式规则很像 GNU make old-school 后缀规则。在您的情况下,您一开始几乎是正确的,但是您缺少 .SUFFIXES 声明。例如:

.SUFFIXES: .bmml .png
.bmml.png:
    @echo Building $@ from $<

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

all: *.bmml
    $(MAKE) $(**:.bmml=.png)

在这里,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 $<

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

Converting Test1.bmml Test2.bmml to .png...
Building Test1.png from Test1.bmml
Building Test2.png from Test2.bmml

当然,如果您有很多这样的 .bmml 文件,您可能会违反命令行长度限制,因此请注意这一点。在这种情况下,我建议要么明确列出源文件,要么使用功能更强大的 make 工具,例如 GNU make(它可用于 Windows,有多种形式)。

于 2009-03-12T23:28:41.067 回答
0

这对你有用吗?把它放在 MAKEFILE 中:

export : *.bmml
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $** $(**B).png

然后运行:

nmake /A

我没有 Balsamiq,所以我无法测试这个,但在我的情况下,如果我有以下 MAKEFILE。:

export : *.txt
    copy $** $(**B).dat

nmake /A在带有 myFile.txt 的文件夹中运行,它将创建 myFile.dat。

于 2009-03-10T18:45:15.083 回答