【问题标题】:Using nmake with wildcards in the makefile在 makefile 中使用带有通配符的 nmake
【发布时间】:2010-09-15 02:02:08
【问题描述】:

我正在尝试设置一个 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 文件来制作 .dat 文件并进行试验,如下所示:

.txt.dat:
    copy $< $@

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

【问题讨论】:

    标签: png export nmake balsamiq


    【解决方案1】:

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

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

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

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

    在这里,NMAKE 会将 all 的 prereq 列表中的 *.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 然后运行这个 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,有多种形式)。

    【讨论】:

    • 这很好。唯一的问题是,即使目标是最新的,我也发现它每次都会重建。如果目标比源更新,如何也让它跳过?
    • @CashCow 我没有看到这个问题。在 Eric 的示例中,目标永远不存在!它只是回显一些文本,它从未真正创建目标。如果您添加规则copy $&lt; $@,那么它也会创建目标。在这种情况下,它不会不必要地重建最新的目标。
    • 我花了一段时间才弄明白。如果你的 makefile 没有命名为makefile,那么你也需要在递归调用中使用-f
    【解决方案2】:

    这对你有用吗?把它放在 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多