Previous: Data, Up: Other objects


8.4 ビルドされているソース

Automakeの自動的な依存性追跡は,コンパイルの副作用として働くので (see Dependencies),ブートストラップで問題があります.ターゲットは, 依存性が作成されるまでコンパイルされるべきではありませんが,これらの依 存性は最初にコンパイルされるまで知ることができません.

通常,依存性は配布されているソースにあるので,これは問題になりません. それらは既に存在し,ビルドする必要はありません.foo.cfoo.hをインクルードしていると仮定します.最初にfoo.oにコ ンパイルするとき,makefoo.ofoo.cに依存する ことを知っています.このコンパイルの副作用として,それ以降の makeの呼び出しで尊重されるように,depcompfoo.hの依存性を記録します.この条件では,問題がないことが明らか です.つまり,foo.oが存在せずビルドされていない(依存性には影響 されない),または,正確な依存性が存在しfoo.oをリビルドすべきか どうかを決定するために使用することが可能であるという,いずれかの状態に なっています.

最初にmakeを実行するときfoo.hが存在しない場合は,別の 話になります.例えば,foo.hをビルドするルールがあると仮定します. このとき,コンパイラがfoo.hを見つけることができないので, file.oのビルドは失敗します.makeは,依存性の情報が足 りないため,最初にfoo.hをビルドするルールを開始することができま せん.

BUILT_SOURCES変数でこの問題を回避します.BUILT_SOURCESで リストアップされているファイルは,他のターゲットを処理する前に, make allmake check(または,make installでも)作 成されます.しかし,そのようなソースファイルは,明示的に他の ‘_SOURCES’で記述し,要求していない限りコンパイルされません.

このため,導入する例を決定するため,make allmake check で(foo.oを含む)他のターゲットをビルドする前にfoo.hを確実 に入手できるよう,BUILT_SOURCES = foo.hを使用します.

ビルドプロセスの初期に作成する必要があるファイルは,この変数でリストアッ プすることが可能なので,BUILT_SOURCESは実際にはちょっと誤った名 称です.さらに,ビルドされたすべてのソースを,BUILT_SOURCESにリ ストアップする必要はありません.例えば,生成される.cファイルは, 関連するオブジェクトへの依存性を知っているので,(他のソースからインク ルードされない限り)BUILT_SOURCESに書く必要はありません.

BUILT_SOURCESmake allmake check,そして make installだけを尊重するということを強調しておくのが重要かも しれません.これは,指定したターゲット(例えば,make foo)が,ビ ルドソースで依存されていない場合,クリーンなツリーではビルドできないこ とを意味します.しかし,その前にmake allを実行している場合,依 存性が既に利用可能なように求まっているので,成功します.

次のセクションでは,ビルドされているソースを処理する簡単な例を説明し, 議論していきます.