2008-10-03 54 views
9

我试图设置一个nmake makefile来将我们的balsamiq样机文件自动导出到png文件,但是恐怕我无法制定一个通用规则的正面和反面。为此,没有明确列出我想要导出的所有文件。在makefile中使用带有通配符的nmake

This page详细介绍了用于导出文件的命令行语法,this page包含一个看起来像包含.obj文件到.exe文件的通用规则的示例。

到目前为止,我已经尝试了生成文件看起来是这样的:

.bmml.png: 
    "C:\Program Files\Balsamiq Mockups\Balsamiq Mockups.exe" export $< [email protected] 

但是,这是行不通的。

如果我只需运行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大师?

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

.txt.dat: 
    copy $< [email protected] 

这个什么都不做一样,所以显然我不理解如何这种通用规则起作用。我是否需要指定一个上面列出我想要的文件的目标?


编辑:为了应对新的答案:

这个Makefile:

{}.txt{}.dat: 
    copy $** [email protected] 

与此文件(TEST.DAT)

1 
2 
3 

和下面的命令:

NMAKE test.txt 

生成此错误消息:

[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. 

回答

16

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

.SUFFIXES: .bmml .png 
.bmml.png: 
    @echo Building [email protected] from $< 

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

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

这里,NMAKE将扩大*.bmml的前提条件列表all到的目录.bmml文件列表,然后将其将启动一个新的NMAKE实例,指定构建目标的所有实例为.bmml的文件列表替换为.png。所以,把他们放在一起:

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

.bmml.png: 
    @echo Building [email protected] from $< 

如果我创建文件Test1.bmml和Test2.bmml,然后运行此生成的文件,我得到下面的输出:

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

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

+0

这是非常好的。唯一的一点是,即使目标是最新的,我也会发现它每次都会重建。如果目标比源更新,那么如何让它跳过? – CashCow 2011-12-29 17:54:18

0

将这项工作的吗?在生成文件:

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

把这然后运行:

nmake /A 

我没有Balsamiq工作室,所以我不能对此进行测试,但在我而言,如果我有下面的Makefile:

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

并在myFile.txt文件夹中运行nmake /A,它会创建myFile.dat。