2008-10-03 51 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。