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.omakeコマンドの実行
$ 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により次のように解釈される.