2012-04-27 5 views
0

非常に大きなプロジェクトのmakefileをいくつか最適化していますが、GNU makeのvpathコマンドは非常に限られた作業しか行えないことがわかりました。例:なぜGNU makeのvpathコマンドが弱いのですか?

vpath %.o $(OBJPATH) 

は、OBJPATHによってパス値のすべてのオブジェクトファイルを検索することを意味します。つまり、/dir1/../dir2/obj1.oと同じファイルであっても、/dir1/../dir2/obj1.oとは同じファイルですが、既に/dir1/../dir2/obj1.oを作成していて、/dir3/../dir2/obj1.oのツールの考え方ではまだ見つからず、/dir3/../dir2/obj1.oを再作成する必要があります。 。

私はGNU makeソースコードをチェックしました。ハッシュテーブルを使用してファイルパス文字列を比較するので、文字列が異なる場合、同じファイルを表していますが、vpathを使用しても一致させることはできません。

より強力な機能を備えたvpathを実現してみませんか?

+0

これは非常に不明です。ツールの思考が '/ dir3 /../ dir2/obj1.o'のルールになったら、どのように解析すればよいでしょうか?たぶんあなたが私たちにルールを示すなら、私たちは助けることができます。 – Beta

答えて

6

日時:

[GNUのメイク]ファイルパスの文字列を比較するために、ハッシュテーブルを使用していますので、彼らが同じファイルを表すが、文字列は、異なっている場合、彼らはまだVPATHを使用して一致させることができません。

ほぼ正しいことをしています。 2つのオブジェクトが同じかどうかを検出するには、OSとファイルシステムに固有のファイルシステム内の一意のID(iノード番号など)に頼る必要があります。

なぜ同じターゲットまたは前提条件を参照するために2つの異なるパスを使用しますか?おそらく、あなたのMakefileでやっていることは、パスの比較のために文字列の等価性に頼るより悪いです。

また、あなたは何かを誤解している可能性があります。 vpathディレクティブとVPATH変数は、前提条件ファイルの検索に関連しています。

実行ファイルやライブラリを作成するための前提条件として、オブジェクトファイルを前提条件として検索することはめったにありません。

これは、オブジェクトファイルが存在すると見なすことができず、存在しない可能性のあるものを検索しないためです。クリーンビルドを実行すると、オブジェクトファイルは存在しません。あなたのMakefile は正確な名前がであることを知る必要があります。それは変わることができる前提条件です。例えば、foo.o(以前のビルドから既に存在しているかもしれないし、存在していないかもしれない)をビルドすることを知っている。あなたが必ずしもわからないのは、foo.oが作られたソースファイルです。それはlibfoo/foo.cまたはutils/foo.cですか?これはvpathが解決するという問題である:それはPATH/binまたは/usr/binでプログラムfooを見つけるためにあなたのシェルをどのように役立つかと同様に、これらの場所を検索し、foo.cを見つけるだろう、など

VPATH/vpathが迅速書き込むためのハックの多少であり、小規模なプロジェクトではメイクファイルが汚れてしまい、大規模な構成には対応できません。それらを改善しようとすることに意味がない。

関連する問題