11

私は現在、リソースに関する情報を保存するために、ディレクトリ内のファイルのリストを C++ ヘッダーに変換する必要があるプロジェクトに取り組んでいます。例えば:

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

私が望むのは、ディレクトリ ツリー内のリソースの 1 つが変更された場合にのみ、Makefile が update.py を実行することです。他の makefile はリソースに触れず、resources.h だけに触れます。これを行うには、どのようなメイクファイルが必要ですか?

PS私が読んだことから、makeで再帰的に検索するのは悪い考えですが、同じファイルに他に何も触れていない場合、それは問題になりますか?

4

3 に答える 3

20

何を読んだかわかりませんが、make で次のようなルールを書くのに問題はありません。

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

または何でも。

于 2013-06-24T15:52:02.740 に答える
2

私はあなたが間違っていると思います: Recursive Make Considered Harmfulは、ある make を別の make から呼び出してはならないことを説明しています。これは遅かれ早かれ、 でしか解決できない間違ったビルドにつながりますmake clean

makeppは、その落とし穴を回避するのに役立つ代替手段です。また、再帰的(上記の再帰とは関係ありません)ワイルドカードを使用して問題を解決します。

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

これは、ファイルがまだそこにない場合でも機能します。これは、makepp のワイルドカードが、ルールに従ってビルドできるものを考慮に入れるためです。プログラムの依存関係を自動的に認識する方法に注意してください。ファニー$/は、実行するシステムに応じてどちらの方向にも傾くため、移植性が高くなります。

makeppには他にもたくさんあります。GNU make でできることのほとんどすべてを実行する以外に、もっと便利なことがたくさんあります。また、Perl プログラミングを使用して makefile を拡張することもできます。

于 2013-06-24T22:42:27.900 に答える