0

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

vpath %.o $(OBJPATH)

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

GNU make のソース コードを確認しました。ハッシュ テーブルを使用してファイル パス文字列を比較するため、文字列が異なる場合、それらは同じファイルを表しますが、vpath.

vpathより強力な機能で実現しませんか?

4

1 に答える 1

6

Re:

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

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

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

また、何かを誤解しているかもしれません。vpathディレクティブと変数は、VPATH前提条件ファイルの検索に関連しています。

前提条件としてオブジェクト ファイルを検索したい場合は、めったにありません (もちろん、それらは実行可能ファイルまたはライブラリをビルドするための前提条件ですが)。

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

VPATH/vpath大規模な構成に拡張されない小さなプロジェクト用の迅速で汚いメイクファイルを作成するためのハックのようなものです。それらを改善しようとしても意味がありません。

于 2012-04-27T20:53:36.573 に答える