我正在尝试设置nmake makefile以将我们的balsamiq样机文件自动导出为png文件,但是恐怕我不能在不明确列出所有文件的情况下做出如何制定通用规则的决定性因素我要导出。
This page详细介绍了用于导出文件的命令行语法,并且this page包含一个示例,看起来它包含从.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文件来简单地从.txt文件中创建.dat文件,如下所示:
.txt.dat:
copy $< $@
这也无济于事,所以很明显我不理解这种通用规则是如何工作的。我是否需要指定一个目标,以某种方式列出我想要的文件? 最佳答案
NMAKE模式规则很像GNU制定的老式后缀规则。就您而言,您几乎一开始就正确,但是您缺少.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,然后运行此生成文件,则会得到以下输出:
Converting Test1.bmml Test2.bmml to .png...
Building Test1.png from Test1.bmml
Building Test2.png from Test2.bmml
当然,如果您有很多这些.bmml文件,则可能会遇到命令行长度限制的情况,因此请当心。在那种情况下,我建议要么明确列出源文件,要么使用功能更强大的make工具,例如GNU make(可用于Windows的各种形式)。
关于png - 在makefile中将nmake与通配符一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/167004/