Previous: Data, Up: Other objects
Automakeの自動的な依存性追跡は,コンパイルの副作用として働くので (see Dependencies),ブートストラップで問題があります.ターゲットは, 依存性が作成されるまでコンパイルされるべきではありませんが,これらの依 存性は最初にコンパイルされるまで知ることができません.
通常,依存性は配布されているソースにあるので,これは問題になりません.
それらは既に存在し,ビルドする必要はありません.foo.cが
foo.hをインクルードしていると仮定します.最初にfoo.oにコ
ンパイルするとき,makeはfoo.oがfoo.cに依存する
ことを知っています.このコンパイルの副作用として,それ以降の
makeの呼び出しで尊重されるように,depcomp
が
foo.hの依存性を記録します.この条件では,問題がないことが明らか
です.つまり,foo.oが存在せずビルドされていない(依存性には影響
されない),または,正確な依存性が存在しfoo.oをリビルドすべきか
どうかを決定するために使用することが可能であるという,いずれかの状態に
なっています.
最初にmakeを実行するときfoo.hが存在しない場合は,別の 話になります.例えば,foo.hをビルドするルールがあると仮定します. このとき,コンパイラがfoo.hを見つけることができないので, file.oのビルドは失敗します.makeは,依存性の情報が足 りないため,最初にfoo.hをビルドするルールを開始することができま せん.
BUILT_SOURCES
変数でこの問題を回避します.BUILT_SOURCES
で
リストアップされているファイルは,他のターゲットを処理する前に,
make all
やmake check
(または,make install
でも)作
成されます.しかし,そのようなソースファイルは,明示的に他の
‘_SOURCES’で記述し,要求していない限りコンパイルされません.
このため,導入する例を決定するため,make all
やmake check
で(foo.oを含む)他のターゲットをビルドする前にfoo.hを確実
に入手できるよう,BUILT_SOURCES = foo.h
を使用します.
ビルドプロセスの初期に作成する必要があるファイルは,この変数でリストアッ
プすることが可能なので,BUILT_SOURCES
は実際にはちょっと誤った名
称です.さらに,ビルドされたすべてのソースを,BUILT_SOURCES
にリ
ストアップする必要はありません.例えば,生成される.cファイルは,
関連するオブジェクトへの依存性を知っているので,(他のソースからインク
ルードされない限り)BUILT_SOURCES
に書く必要はありません.
BUILT_SOURCES
はmake all
,make check
,そして
make install
だけを尊重するということを強調しておくのが重要かも
しれません.これは,指定したターゲット(例えば,make foo
)が,ビ
ルドソースで依存されていない場合,クリーンなツリーではビルドできないこ
とを意味します.しかし,その前にmake all
を実行している場合,依
存性が既に利用可能なように求まっているので,成功します.
次のセクションでは,ビルドされているソースを処理する簡単な例を説明し, 議論していきます.