2013-06-24 20 views
6

私は現在、リソースに関する情報を格納するために、ディレクトリ内のファイルのリストをC++ヘッダーに変換する必要があるプロジェクトに取り組んでいます。たとえば:メイクファイルはどこにでも、ディレクトリツリー内のリソースのいずれかが変更された場合にのみupdate.pyを実行するために私が欲しいもの再帰的依存関係を作成

/ 
update.py 
resources.h 
Makefile 
/resources 
    resource1.png 
    /sub1 
    /sub2 
     resource2.png 

です。他のメイクファイルはリソースに触れるつもりはなく、resources.hだけです。これを行うにはどのようなmakefileが必要ですか?

PS 私が読んだことから、再帰的にmakeを使って検索するのは悪い考えですが、他の人が同じファイルに触れていなければ問題になるでしょうか?

答えて

12

私はあなたが読んだかわからないんだけど、メイクで、このようなルール書いても問題ありません:

RESOURCES := $(shell find . -name resource\*.png -print) 
resources.h: update.py $(RESOURCES) 
     ./update.py $(RESOURCES) 

または何が。

+0

スペースが含まれているファイルが見つかると失敗します。おそらく小さな微調整が必​​要です。 – HectorJ

+0

一般に、現在のバージョンのmakeを使用して空白を含むファイル名を管理することは現実的ではありません。 – MadScientist

1

私はあなたが間違っていると思う:Recursive Make Considered Harmfulは、どちらも、依存関係の完全な概要を持たないので、別のものの中から1つのmakeを呼び出すべきではないと説明しています。これは遅かれ早かれ、間違ったビルドにつながり、make cleanでしか分類できません。

makeppは、その落とし穴を回避するのに役立つ代替手段です。ファイルがまだ存在しない場合makeppのワイルドカードは、あなたのルールに従って構築することができるものを考慮に入れるため

RESOURCES := **/resource\*.png 
resources.h: $(RESOURCES) 
    .$/update.py $(inputs) 

これも、動作します。また、(上記の再帰とは何の関係も)再帰的なワイルドカードを使用して問題を解決します。どのようにしてプログラムの依存関係に自動的に気付くか注意してください。面白い$/は、どのシステム上で実行されているかに応じていずれかの方法で傾くので、より移植性があります。

makeppにはさらに多くのものがあります。 GNU makeができることのほとんどを行う以外にも、もっと便利なことがたくさんありますし、MakefileをPerlプログラミングで拡張することさえできます。

関連する問題