Last modified: Thu Apr 10 09:24:57 JST 2008
[top | back | next]
プログラムが複雑化すると,機能ごとの関数に分割し開発した方が、 全体の見通しがよく,効率的である. さらに,開発するシステムが複雑なものとなると,全体を機能別に分類し, 複数のファイルに分けて開発することになる. 複数のメンバーからなるチームでの開発では,このことは不可避である.
プログラムの開発過程で、 複数のソースファイルをファイルごとにコンパイルする分割コンパイルや それらを1つに統合し,実行ファイルにまとめる操作を毎回 繰り返したのでは、手数が複雑化する. そこで、この工程を自動化するツールが不可欠となる. unix/linuxでは、このような機能として make コマンドが用意されている.
makeコマンド を利用するには,開発するファイルの依存関係を記述した ファイル(Makefile)を用意しておく必要がある.

makeはMakefileに記述された内容を生成ルールとして ファイルを生成する工程を理解する. そして,各ファイルのタイムスタンプを調べ, 最小限の作業工程で目的のファイルを生成する.
$ man make
$ cat Makefile
exec1: prog1.o prog2.o exec1はprog1.oとprog2.oに依存する
cc -o exec1 prog1.o prog2.o このコマンドを実行してexec1を生成する
prog1.o: prog1.c inc1.h prog1.oはprog1.cとinc1.hに依存
cc -c prog1.c prog1.oを生成するコマンド
prog2.o: prog2.c prog2.oはprog2.cに依存
cc -c prog2.c prog2.oを生成するコマンド
このMakefileに記述されたルールから,makeは次のような動作をする
makeコマンドの実行例
ファイルの一覧とタイムスタンプ
$ ls -l
-rw-rw-r-- 1 user1 user1 123 4月10日 12:06 Makefile
-rwxrwxr-x 1 user1 user1 5022 4月11日 10:10 exec1
-rw-rw-r-- 1 user1 user1 44 4月11日 10:04 inc1.h
-rw-rw-r-- 1 user1 user1 131 4月12日 16:20 prog1.c
-rw-rw-r-- 1 user1 user1 1032 4月11日 10:10 prog1.o
-rw-rw-r-- 1 user1 user1 78 4月11日 10:00 prog2.c
-rw-rw-r-- 1 user1 user1 715 4月11日 10:05 prog2.o
makeコマンドの実行
$ make
cc -c prog1.c
cc -o exec1 prog1.o prog2.o
生成するファイル: 生成に必要なファイルを空白で区切って並べる
「TAB」コマンド
とペアで記述する.
ここで,コマンド行は,必ず,タブ(TAB)
で始める必要がある.
make コマンドにより生成するファイルなどをターゲットと呼ぶ. 以下,例をもとに Makefileでの生成規則の記述例を述べる.
exec1: file1.c
cc -o exec1 file1.c -lm
この記述は次のように解釈される.
exec0: prog1.o prog2.o prog3.o
cc -o exec0 prog1.o prog2.o prog3.o
prog1.o: prog1.c
cc -c prog1.c
prog2.o: prog2.c
cc -c prog2.c
prog3.o: prog3.c
cc -c prog3.c
この記述はmakeにより次のように解釈される.