Makefile-recompile
提供:Dev Guides
Makefile-再コンパイル
*make* プログラムはインテリジェントなユーティリティであり、ソースファイルで行った変更に基づいて機能します。 main.cpp、hello.cpp、factorial.cpp、およびfunctions.hの4つのファイルがある場合、残りのすべてのファイルはfunctions.hに依存し、main.cppはhello.cppとfactorial.cppの両方に依存します。 したがって、functions.hに変更を加えると、 *make* はすべてのソースファイルを再コンパイルして新しいオブジェクトファイルを生成します。 ただし、main.cppを変更すると、これは他のファイルに依存しないため、main.cppファイルのみが再コンパイルされ、help.cppとfactorial.cppは変更されません。
ファイルのコンパイル中、 make はオブジェクトファイルをチェックし、タイムスタンプを比較します。 ソースファイルにオブジェクトファイルより新しいタイムスタンプがある場合、ソースファイルが変更されたと仮定して、新しいオブジェクトファイルを生成します。
再コンパイルの回避
数千のファイルで構成されるプロジェクトが存在する場合があります。 ソースファイルを変更した場合でも、それに依存するすべてのファイルを再コンパイルしたくない場合があります。 たとえば、他のファイルが依存するヘッダーファイルにマクロまたは宣言を追加するとします。 保守的であるため、 make はヘッダーファイルの変更にはすべての依存ファイルの再コンパイルが必要であることを前提としていますが、再コンパイルが不要であり、コンパイルを待つ時間を無駄にしないことを知っています。
ヘッダーファイルを変更する前に問題を予測した場合は、-tフラグを使用できます。 このフラグは、ルール内のコマンドを実行するのではなく、最終変更日を変更してターゲットを最新の状態にマークするように make に指示します。 あなたはこの手順に従う必要があります-
- コマンド `make 'を使用して、本当に再コンパイルが必要なソースファイルを再コンパイルします。
- ヘッダーファイルに変更を加えます。
- コマンド `make -t 'を使用して、すべてのオブジェクトファイルを最新としてマークします。 次回makeを実行すると、ヘッダーファイルの変更によって再コンパイルは発生しません。
一部のファイルが再コンパイルを必要とするときにヘッダーファイルを既に変更している場合、これを行うには遅すぎます。 代わりに、指定されたファイルを「古い」としてマークする「-o file」フラグを使用できます。 つまり、ファイル自体は再作成されず、そのアカウントでは他の何も再作成されません。 あなたはこの手順に従う必要があります-
- `make -o header file 'を使用して、特定のヘッダーファイルとは無関係の理由でコンパイルが必要なソースファイルを再コンパイルします。 複数のヘッダーファイルが関係している場合は、ヘッダーファイルごとに個別の「-o」オプションを使用します。
- すべてのオブジェクトファイルを「make -t」で更新します。