在makefile中将nmake与通配符一起使用
我正在尝试设置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文件来简单地从.txt文件中创建.dat文件,如下所示:
.txt.dat: copy $< $@
这也无济于事,所以很明显我不理解这种通用规则是如何工作的。我是否需要指定一个目标,以某种方式列出我想要的文件?
编辑:响应新的答案:
这个makefile:
{}.txt{}.dat: copy $** $@
与此文件(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.
解决方案
这对我们有用吗?把它放在MAKEFILE中:
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。
NMAKE模式规则很像GNU制定的老式后缀规则。就我们而言,我们几乎一开始就正确,但是我们缺少.SUFFIXES声明。例如:
.SUFFIXES: .bmml .png .bmml.png: @echo Building $@ from $<
我认为这只是解决方案的一部分,因为我们还提到要避免明确列出要转换的所有文件。不幸的是,我不知道在NMAKE中这样做的一种非常干净的方法,因为它只会扩展依赖项列表中的通配符,而我们真正想要的依赖项列表中的内容不是已经存在的文件列表(* .bmml文件),但将从这些文件创建的文件列表(* .png文件)。不过,我认为我们可以通过递归的NMAKE调用来实现目标,如下所示:
all: *.bmml $(MAKE) $(**:.bmml=.png)
在这里,NMAKE将prereq列表中的all的* .bmml扩展到目录中的.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的各种形式)。