makeユーティリティ

ソースファイルがたくさんになって来ると、コンパイル&リンク作業を 行なうのが複雑になって来る。この負担を軽減してくれるのが makeユーティリティである。make はプログラムを作る 過程で必要になったり、作成されたりするファイルの依存関係を元に、 各ファイルの更新時刻に応じて、その場その場で必要なコマンドを起動する。

ファイルの依存関係

2つのソースファイル main.csub.c から、 1つの実行ファイルmainを作るときの依存関係は以下のようになる。

材料となるファイルその成果物
main.cmain.o
sub.csub.o
main.oとsub.omain

文章の形でまとめると、

Makefile

上記の依存関係をmakeに教えておくと、makeを起動したときに適切な処理を 行なってくれる。makeに依存関係を教えるには作業ディレクトリに Makefile というファイルを置き、そこに依存関係を記述する。

Makefile には、依存関係と作り方を以下の様式で列挙する。

ターゲット:	依存ファイル(群…)|
<TAB空白>		それを作るためのコマンドライン

ターゲットとは別のファイルに何かの処理をして作られる目的となる ファイルである。今回の main.c, sub.c からできる依存関係を Makefile に記述すると以下のようになる。

#
# Makefile for main program
#
all:	main

main:	main.o sub.o
	gcc -o main main.o sub.o

main.o:	main.c
	gcc -c main.c
sub.o:	sub.c
	gcc -c sub.c

注意

このような Makefile を用意したら、make コマンドを起動する。make は、

% make ターゲット

という書式で起動する。make は、指定されたターゲット とその右辺に書かれた依存ファイル(群)のどちらが新しい(最近更新された)ファ イルかを調べ、依存ファイルの方が新しい場合、ターゲットも更新が必要だと 判断し、次の行から始まるコマンドラインを起動する。上記の Makefile で例を示すと、

make main

と起動された場合、make は、Makefile

main:	main.o sub.o
	gcc -o main main.o sub.o

の部分に着目する。左辺に書かれたターゲットのmain ファイルよりも、右辺に書かれた main.o sub.o の方が タイムスタンプが新しかったら次の行に書いてある

gcc -o main main.o sub.o

を実行する。ただし、その前に main.o sub.o 自体に関する依存関係も調べる。つまり、

main.o:	main.c
	gcc -c main.c
sub.o:	sub.c
	gcc -c sub.c

の部分を見て、

という処理を適切に判断して行なう。以上のことから、もし sub.c を修正保存した場合に、makeを起動すると

gcc -c sub.c
gcc -o main main.o sub.o

を連続して起動して、実行プログラム main を作成してくれる。

make起動時に、「ターゲット」を省略すると最初に書かれ たターゲットを作るように動作するので、all: ターゲットを 書いておくようにすれば、普段は

make

とだけ打てば必要なコマンドを起動してくれるので楽ができる。

Makefileを作る上での注意

makeでは、デフォルトでは必ず Makefile とい うファイルを依存関係登録ファイルとして参照するので、make を利用してコンパイルを行なう場合には作りたいものに対して一つの ディレクトリを作成するようにする。したがって、今後何かのプログラムを 作るときにはその都度ディレクトリを作成し、そこに Makefile を作成する。

mkdir newProject
cd newProject
(Makefileとソースファイルを作成)
make

以上のような流れで作業することになる。

より進んだMakefileの書き方

ターゲットの右辺に書くべき依存ファイルを省略すると、次の行に書かれた コマンドを必ず起動するようになる。

慣習的に、clean というターゲットを書くことが多い。

main:	main.o sub.o
	gcc -o main main.o sub.o

main.o:	main.c
	gcc -c main.c

sub.o:	sub.c
	gcc -c sub.c

clean:
	rm -f *.o main

上記のような Makefile を用意し、

make clean

と起動すると、必ず rm -f *.o main を起動する。 rm はファイルを消すコマンドで、-f オプションを 付けると、そのファイルがなくても文句をいわず黙って消す。

C言語プログラミングでは、ソースプログラムさえ書いておけば オブジェクトファイル(*.o) や実行ファイルはいつでも作ること ができるので、用が済んだらソース以外のものを消しておく方が節約になる。

そのほか、良く使うコマンドラインを Makefile に 登録しておくと便利である。
例:

backup:
	gtar zcf backup.tar.gz *.c

上記の例では、カレントディレクトリの *.c ファイル全てを 圧縮して backup.tar.gz ファイルにバックアップする。


目次