makefileでワイルドカードを使用してnmakeを使用する
質問
nmake makefileを設定してbalsamiqモックアップファイルをpngファイルに自動的にエクスポートしようとしていますが、明示的にリストせずに、これを行うための一般的なルールを作成する方法の頭も尾も作成できないと思いますエクスポートするすべてのファイル。
このページは、ファイルをエクスポートするためのコマンドライン構文の詳細と、このページには、.objファイルの一般的なルールが含まれているように見える例が含まれています.exeファイルへ。
これまで試したメイクファイルは次のようになります。
.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] :
特定のファイルを1つ作成するように要求すると、次のようになります。
[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ファイルをコピーして作成するmakefileの例は、次のようになります:
.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.
解決
NMAKEパターンルールは、GNU makeの旧式の接尾辞ルールによく似ています。あなたの場合、あなたは最初からほぼ正しいことをしていましたが、.SUFFIXES宣言がありませんでした。例:
.SUFFIXES: .bmml .png
.bmml.png:
@echo Building $@ 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 $@ 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ファイルが非常に多い場合は、コマンドラインの長さ制限に違反する可能性があるので、注意してください。その場合は、ソースファイルを明示的にリストするか、GNU make(さまざまな形式でWindowsで使用可能)などのより高性能なmakeツールを使用することをお勧めします。
他のヒント
これはあなたのために働きますか?これを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が作成されます。