差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
linux:gnu_make [2009/02/12 23:27] – ともやん | linux:gnu_make [2019/08/19 06:48] (現在) – ともやん | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== GNU Make ====== | + | ====== GNU make ====== |
最近では、統合開発環境(IDE - Integrated Development Environment)が発達したことにより、規模の大きいプログラムを開発する場合でも、ソースコード群への変更がビルド生成物(実行イメージなど)に漏れなく確実に反映されることが当たり前となっている。\\ | 最近では、統合開発環境(IDE - Integrated Development Environment)が発達したことにより、規模の大きいプログラムを開発する場合でも、ソースコード群への変更がビルド生成物(実行イメージなど)に漏れなく確実に反映されることが当たり前となっている。\\ | ||
+ | \\ | ||
プログラム開発では、ソースコード修正、ビルド、テストを何度も繰り返し行うことになるが、その際に上記に述べたような機能は非常に重要な要素である。\\ | プログラム開発では、ソースコード修正、ビルド、テストを何度も繰り返し行うことになるが、その際に上記に述べたような機能は非常に重要な要素である。\\ | ||
- | Make自体はIDEからも利用されており、上記に述べたことを実現しつつビルドを自動化するために利用される。その他にUnitテストやインストールの実行も自動化することが可能である。\\ | + | \\ |
+ | make | ||
===== 作業を自動化するMakefileの記述 ===== | ===== 作業を自動化するMakefileの記述 ===== | ||
- | makeコマンドを実行すると、カレントフォルダに存在する Makefile もしくは makefile の内容が実行される。\\ | + | make コマンドを実行すると、カレントフォルダに存在する Makefile もしくは makefile の内容が実行される。\\ |
\\ | \\ | ||
- | 例えば、単一のC++ソースをコンパイルするには、以下のコマンドを実行する。\\ | + | 例えば、単一の C++ ソースをコンパイルするには、以下のコマンドを実行する。\\ |
<code bash> | <code bash> | ||
$ g++ -o hellocpp hellomain.cpp | $ g++ -o hellocpp hellomain.cpp | ||
</ | </ | ||
これをMakefileで記述すると以下のようになる。\\ | これをMakefileで記述すると以下のようになる。\\ | ||
- | \\ | + | <file autoconf Makefile> |
- | [Makefile] | + | |
- | <code> | + | |
hellocpp: hellomain.cpp | hellocpp: hellomain.cpp | ||
g++ -o hellocpp hellomain.cpp | g++ -o hellocpp hellomain.cpp | ||
- | </code> | + | </file> |
※注意: | ※注意: | ||
\\ | \\ | ||
行 26: | 行 26: | ||
</ | </ | ||
- | ===== 複数ソースファイルから実行ファイルをビルドするMakefileの記述 ===== | + | ===== 複数ソースファイルから実行ファイルを生成するMakefileの記述 ===== |
プログラム開発を行う場合は、流用性や保守性を向上させたり管理しやすくするために、ソースコードを機能単位に分割することになる。しかし、ソースコードを分割することによってファイル数は増加し、流用することによってファイル間で依存関係が発生するので、修正されたファイルを漏れなく処理することや依存を考慮したビルド順序が複雑になり管理が困難になってくる。\\ | プログラム開発を行う場合は、流用性や保守性を向上させたり管理しやすくするために、ソースコードを機能単位に分割することになる。しかし、ソースコードを分割することによってファイル数は増加し、流用することによってファイル間で依存関係が発生するので、修正されたファイルを漏れなく処理することや依存を考慮したビルド順序が複雑になり管理が困難になってくる。\\ | ||
\\ | \\ | ||
行 34: | 行 34: | ||
\\ | \\ | ||
以下に複数ソースファイルから実行ファイルをビルドする Makefile の例を示す。\\ | 以下に複数ソースファイルから実行ファイルをビルドする Makefile の例を示す。\\ | ||
- | \\ | + | <file autoconf Makefile> |
- | [Makefile] | + | |
- | <code> | + | |
StockPricesImport: | StockPricesImport: | ||
g++ -o StockPricesImport Http.o MySQLDB.o StockPricesImportApp.o | g++ -o StockPricesImport Http.o MySQLDB.o StockPricesImportApp.o | ||
行 45: | 行 43: | ||
StockPricesImportApp.o: | StockPricesImportApp.o: | ||
g++ -c StockPricesImportApp.cpp | g++ -c StockPricesImportApp.cpp | ||
- | </code> | + | </file> |
Makefileの意味は以下の通り。\\ | Makefileの意味は以下の通り。\\ | ||
* StockPricesImport ターゲットは、Http.o、MySQLDB.o、StockPricesImportApp.o の四つのファイルに依存している。 | * StockPricesImport ターゲットは、Http.o、MySQLDB.o、StockPricesImportApp.o の四つのファイルに依存している。 | ||
行 56: | 行 54: | ||
* ターゲットを生成するコマンドは、g++ -c StockPricesImportApp.cpp である。 | * ターゲットを生成するコマンドは、g++ -c StockPricesImportApp.cpp である。 | ||
\\ | \\ | ||
- | 初回ビルド時の実行例は以下のようになる。 | + | 初回ビルド時の実行例は以下のようになる。 |
<code bash> | <code bash> | ||
$ make | $ make | ||
行 64: | 行 62: | ||
g++ -o StockPricesImport Http.o MySQLDB.o StockPricesImportApp.o | g++ -o StockPricesImport Http.o MySQLDB.o StockPricesImportApp.o | ||
</ | </ | ||
- | 例えば MySQLDB.cpp を修正し make を実行すると、以下のように差分のみの処理を自動的に行う。 | + | 例えば MySQLDB.cpp を修正し make を実行すると、以下のように差分のみの処理を自動的に行う。 |
+ | * 依存ファイルに変更が無い限りは処理が行われないことを確認できる。 | ||
<code bash> | <code bash> | ||
$ make | $ make | ||
行 75: | 行 74: | ||
make: ' | make: ' | ||
</ | </ | ||
+ | |||
+ | ===== 偽りのターゲットを使ったテクニック ===== | ||
+ | 準備中... | ||
+ | ===== 参考文献 ===== | ||
+ | この文章を作成するに当たって、以下の文献を参考にさせて頂きました。原文の著者、翻訳者の方々に感謝いたします。\\ | ||
+ | \\ | ||
+ | [[http:// | ||
+ | 著者: | ||
+ | 翻訳者: | ||
+ | |||
+ | |||