Makefile って何? シンプルな使い方と依存関係

Makefile って何? シンプルな使い方と依存関係

Makefileって何だっけ??
というところから端を発し、ちょっと調べ直したので備忘録。

Makefileって何??

Makefile(コマンドでいうところのmake)とは、大体の場合GNUというオペレーティングシステムにおけるmakeコマンドを指します。
ファイルに複数のコマンドや依存関係を記載しmakeコマンドを実行する事で、コンパイルの作業を容易にしてくれます。
また更新されたファイルの内、関連のあるものだけを更新する事ができるのでコンパイル時間が短くなります。
本来makeはコンパイル作業を効率化するためのコマンドですが、「OSに依存しずらい」という観点から、環境構築のためのコマンドまとめとしても利用できます。

GNU (Windows, UNIX系) 以外のmakeコマンド
Microsoft nmake (Windows)
Borland make (Windows)
Solaris make (Solaris)

 

make コマンドの使い方

まず実行したいコマンドを記載した Makefile という名前のファイルを作りましょう。
以下がMakefileの記載の仕方です。

実際にコードを書くと下記のようになります。

上記では hello.cを依存ファイルとして指定しているので、hello.cというファイルに変更が加えられていれば、gcc -o hello hello.cが実行されます。

gcc -o hello hello.cの処理内容は 「hello.cをコンパイルしてhelloというファイルを書き出す」 という処理になりますが、makeが実行された際には、依存ファイルとして指定されているhello.cの更新日付がhelloターゲットの実行日付より新しければgcc -o hello hello.cが実行される仕組みとなります。

もう一つ依存関係の影響を理解するために、サンプルを記載します。

上記helloターゲットでは hello.chi.oを依存ファイルとして指定しています。
つまり、hello.cが変更された場合と、hi.oが変更された場合にgcc -o hello hello.c hi.o others.oというコマンドが走ります。

そしてhiターゲットhi.cが変更されていた場合gcc -o hi.o hi.cを走らせます。
これが走るとhi.oが更新されることになるので、芋づる式にhi.oを依存ファイルとして指定しているhelloターゲットも走ることになります。

またhelloターゲットではothers.oもコンパイルに含めていますが、これは依存ファイルとして指定されていません
なので、others.cに変更が入り、othersターゲットが実行されてothers.oが更新されても、helloターゲットは走らないことになります。

 

make コマンドの別の使い方

冒頭に書いたように、makeコマンドはGNUオペレーションシステムが導入されている環境であれば実行する事ができます。
なので、OSによる依存を防ぐ事ができ、様々な環境で実行が可能です。

そこで、Makefileを含んだ環境構築用のディレクトリを作成しておく事で、様々なOS下で環境構築をする事ができます。

 

make コマンドのターゲット指定

make コマンドは下記の様に実行するターゲットを指定できます

指定せずに

と実行した場合、Makefile に記載された最初のターゲットが実行されます。
make コマンドの別の使い方 に記載した例だと、$ make の実行で init のターゲットが実行されます。

 

参考サイト

下記参考にさせて頂いたサイトです。

http://objectclub.jp/community/memorial/homepage3.nifty.com/masarl/article/gnu-make.html