Section Next|Prev|Up|Index|凡例


3.1.2 makefile の基本

ここでは makefile の作り方を簡単に解説します。 例として次のようなプログラムを仮定します。
prog は prog.c, x.c, y.c, z.c の4つのソースファイルからなり、main() 関数は prog.c に定義され、その他のソースは main から呼ばれる関数群が書かれていると します。
また x.c, y.c には次のような include 文があります。
	#include "defs.h"

このとき各ソースファイルの依存関係、実行イメージファイルの生成手順を makefile に記述すると、次のようになります。

	prog: prog.o x.o y.o z.o		# ルール定義
		cc prog.o x.o y.o z.o -o prog	# アクション定義: 先頭はタブ(^I) で始まる。
	prog.o: prog.c
		cc -c prog.c
	x.o: x.c
		cc -c x.c
	y.o: y.c defs.h
		cc -c y.c
	z.o: z.c defs.h
		cc -c z.c
意味は、
  1. プログラム prog はオブジェクト prog.o, x.o, y.o z.o からなり
    prog を作成するには cc prog.o ... -o prog コマンドを用いる

  2. prog.o は prog.c からなり
    prog.o を作成するには cc -c prog.c コマンドを用いる

  3. x.o を作成するには cc -c x.c コマンドを用いる

  4. y.o は y.c と defs.h からなり、cc -c y.c コマンドを用いる。
    (以下同様)
となります。 一連のコマンドを実行し prog を生成するには先の内容をファイル makefile 又は Makefile に保存し、コマンド make(1) を実行します。
	$ make
makefile, Makefile の両方が存在するとき makefile が使用されます。
また明示的にファイルを指定する場合はファイルオプション(-f) を用います。
	$ make -f xxxx

make は、その処理を行う場合は次の3段階のルールに従います。

最後のサフィックス・ルールとは .c のファイルから .o を生成する方法といった 暗黙の規則です。 このサフィックス・ルールを用いれば、先の例は次のように省略した記述となります。
	prog: prog.o x.o y.o z.o
		cc prog.o x.o y.o z.o -o prog
	x.o y.o: defs.h
次の例は、例題の状況で初めて make を実行した時のものです。
	$ make
	cc  -c prog.c
	cc  -c x.c
	cc  -c y.c
	cc  -c z.c
	cc prog.o x.o y.o z.o -o prog
次に x.c を修正した場合(更新日付が変更される)、再度 make を実行すると次のように なります。
	$ touch x.c	# x.c の更新日付を最新に
	$ make
	cc  -c x.c
	cc prog.o x.o y.o z.o -o prog
同様に defs.h を修正すると、上記の例とは影響範囲が異なります。
	$ touch defs.h
	$ make
	cc  -c x.c
	cc  -c y.c
	cc prog.o x.o y.o z.o -o prog
この様に個々のモジュール(ソースやオブジェクト) の依存関係を makefile に定義しておくことで、必要なターゲット(この場合は prog) を 矛盾なく生成することが可能です。

Section Next|Prev|Up|Index|凡例

/body>