2011-07-17 11 views
1

私がソースから構築しているウェブサイトは、主に2つのファイルグループで構成されています。まず、ローカライズされたマークアップファイルの作成の一部として、というビルド時にPHP で処理するPHP処理命令を含む一連のHTMLファイル。言い換えれば、ソースディレクトリのHTMLファイルはPHPで処理され、同じ名前のビルドディレクトリにある別のHTMLファイルに出力されます。私のメークファイルは、暗黙的なルールと明示的なルールの間で欲しいものをやっていないのはなぜですか?

上記HTMLファイルの処理には、独自のPHPファイルが含まれています。これらのファイルは、ソースHTMLファイル内のプレースホルダを置き換える実際のローカリゼーションテキストを持ちます。これらのPHPファイルは、対応するXMLファイルから生成されます。これはローカリゼーションテキストの元のキャリアとしてXMLを選択したためです。このプロジェクトは、使用されるテクノロジに関してはむしろ異質なものの大きな部分の一部であるため、XMLを使用して迅速な翻訳を支援しました。

最後に、「静的」資産と呼ばれるファイルの第2のグループがあります。これはソースからビルドディレクトリにそのままコピーするだけです。

私は、依存関係を正しく表現するGNU makeで使用する簡潔なmakefileを書くのに苦労しています。最高で私は半分を達成するmake私を混乱させる私のトリックを果たしているようだ。

  • PHPはincludeがで呼び出されることができ、コードにXML形式からローカリゼーションデータを変換プロセスを:あなたは本当に速いものを拾う場合

    以下のmakefileの簡単な伝説、あなたがprollyこれをスキップすることができますxml_to_php_res。 XMLファイルは現在の(ソース)ディレクトリにあり、*.res.xmlと一致します。

  • includeにローカライズファイルやプロセスのHTMLファイルをPHPを呼び出すと
  • DESTDIRは、変数はビルドディレクトリの接頭辞を示すために使用されていることを確認しprocess_htmlスクリプトで抽象化されています。接頭辞であるため、定義されるときには通常/で終わります。明らかな理由から、のソースディレクトリと一致することはできません。
  • ソースディレクトリは現在のディレクトリとみなされます
  • XMLファイルから生成されたローカリゼーションPHPファイルは、$(DESTDIR)resources/*.phpと一致します。私は使用後にそれらを破棄しない。なぜなら、1)それらをキャッシュすることは良いことであり、2)実行時に必要と思われる場合に使用できるからである。私はこれらがmakeが "中間"の前提条件と呼んでいると思いますか?

メイク:

php_pp_def_files := $(patsubst ./%.res.xml,$(DESTDIR)resources/%.php,$(shell find -name \*.res.xml)) 

$(DESTDIR)resources/%.php: %.res.xml 
    ./xml_to_php_res $< > [email protected] 

$(DESTDIR)%.html: %.html $(php_pp_def_files) # Each built HTML file depends on corresponding source HTML file and all PHP localization definition files 
    ./process_html $< > [email protected] 

$(DESTDIR)%: % 
    $(INSTALL_DATA) -D $< [email protected] 

最後のルールは私の意図を妨害すると表示されます。 makeが設計されているようです - 第2のルールのいくつかの前提条件が存在しない場合、単にそれをスキップして、代わりに第3のルールを考慮します。それは私が必要とするものではありません。

私はallという目標を省きました。メイクファイルは任意の個々のファイルでは機能しないからです。

私はどのように検索し、ルールにマッチするかについてのいくつかの重要な知識が不足していると思います。私は実際にn回目のマニュアルを実際に十字架にしましたが、それは非常にわかりにくいので、私はそれを習得する前に泣いています:/

答えて

1

私が正しく理解するならば、最後の規則は静的資産をビルドディレクトリ。もしそうなら、最初の解決策は、それをstatic pattern ruleにすることです。この方法では、ルールは指定したターゲットにのみ適用されます。このために静的資産のリストを作成する必要があります。コメントへの応答で

STATICS := $(addprefix $(DESTDIR), ...) 
$(STATICS): $(DESTDIR)%: % 
    $(INSTALL_DATA) -D $< [email protected] 

編集:
私は次のことが必要なファイルのリストを構築すべきだと思います。

STATICS := $(addprefix $(DESTDIR), $(filter-out %.php %.html, $(wildcard *))) 
+0

うわー、これは有望ですね。ただし、私の統計情報は「* .phpと* .html以外のすべてです」と指定する方法を除きます。私はこれらのパターンを '$(shell find!-name \ *。php!-name \ *。html)'で明示的に除外するか、実際には$(shell find)このルールは他のルールが優先されるときにはうまくいかないことを願っていますか? – amn

+0

@ amn:「すべてのリスト」(個人的には、シェル呼び出しの代わりに組み込み関数 'wildcard'を使用します)を作成し、' filter-out'関数を使って不要なファイルを削除することができます。私はこれを反映するために私の答えを編集します。 – eriktous

+0

十分ですが、自分の「ワイルドカード」を作成した経験がある限り、それはサブディレクトリには降りませんか?私はファイルのフォルダ内にフォルダを持っています。 – amn

関連する問題