2017-12-29 37 views
1

私はMarkdownファイル、ビデオ、graphvizドットファイルなどのコレクションを持っています。必要ならばファイルを処理するためにmakeを使用したいと思います。必要以上に自分自身を繰り返す。ターゲットと同じ名前のmakefile前提条件ファイルのショートカット

メイクファイルでは、a)たくさんありませんし、b)各ファイルが理論的にはビルドに若干異なるプロセスを必要とするため、個々のファイルのビルド手順を書いています。標準の%.html: %.mdタイプのルールは、すべてのhtmlファイルが同じコマンドを使用してビルドされているわけではないので、有用ではありません。

ただし、ルール構文の前提条件のセクションを省略する方法を理解できません。各ターゲットファイルは、同じ名前のソースディレクトリ内のファイルに依存します。次のような基本ルールで名前を2回入力しないようにするにはどうすればよいですか?私は、ファイル名、ターゲットサフィックス、ソースサフィックスのステムを指定するだけでよいはずです。それだけです。これは非常に簡単なことだと思われるので、間違った言葉を使ってそれを説明し、解決策を探していると思います。

あなたがより良い解決策は、複数の一般的なルールの下で、グループのターゲットになり

./dist/00-introductions/overview.html: ./dist%.html: ./src%.md 
    $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o [email protected] $< 

ターゲットごとに別々の静的なパターンルールを使用することができ

./dist/00-introductions/overview.html: ./src/00-introductions/overview.md 
     $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o [email protected] $< 

それが重要場合、

$ make -v 
GNU Make 4.1 
Built for x86_64-pc-linux-gnu 
+1

'.md.html:'(あるいは、おそらく '%.html:%.md'ルール)を使って、' .md'ファイルを '.html'に変換するためのジェネリックルールを作成します。次に、さまざまなソースとターゲットのディレクトリを処理する方法を検討しなければなりません。 –

答えて

1

、およびターゲット固有の変数を使用してレシピを調整する:

targets1 := ./dist/00-introductions/overview.html 
targets2 := ./dist/00-introductions/foobar.html 

$(targets1): ./dist%.html: ./src%.md 
    $(PANDOC) $(PANDOC_OPTIONS) $(PANDOC_REVEALJS) -o [email protected] $< 

$(targets2): ./dist%.html: ./src%.md 
    $(FOOBAR) $(FOOBAR_OPTIONS) -o [email protected] $< 

./dist/00-introductions/overview.html: PANDOC_OPTIONS := -foo 
./dist/00-introductions/foobar.html: FOOBAR_OPTIONS := -bar 
+0

私は、前提条件の%のパターンマッチングの使用がターゲットと同じであると考えていました。空でない文字列と一致することを確認します。ファイルが変更されたときにターゲットを再コンパイルしたくないので(そうでなければMakeを使うのは何ですか?)、私はそのオプションを見落としました。 –

関連する問題