Makefile の書き方


make を使用するためには,ファイルの依存関係を書いたファイル Makefile を用意しなければなりません. Makefile は通常,ソースファイルと同じディレクトリに Makefile というファイル名で作成します. これ以外のファイル名にしたい場合は, make の起動時に make -f ファイル名 で指定します. システムによっても異なりますので, 各自の使用するシステムのマニュアルで確認してください.

まず Makefile では,ファイルの依存関係を示す必要があります. 次の行は,ファイル tree を作成するために tree.outil.o が必要なことを示します.

tree: tree.o util.o

このように, 「ターゲット名: 必要なファイル」 という 形式で記述します. 行頭に空白は入れないでください.

コマンドラインから make tree と入力すると tree を作成しようとします. 引数を省いて make だけで実行すると, Makefile の中で最初に現れる規則を実行します. ですから,最終的に必要なファイルの規則を最初に書くのが良いでしょう.

上の例では,tree.outil.o から tree を作る方法は make にまかせていました. これをユーザが定義することもできます. この場合,依存性の定義に続いてタブから始まる行で 動作を記述します.

tree: tree.o util.o
	cc -o tree tree.o util.o

動作定義の行は,スペースではなく必ずタブで始めてください. この動作定義は複数行になっても構いません. 次の依存性定義まではすべて動作定義として扱われます.

ターゲットはファイル名でなくても構いません. 例えばコンパイル前の状態に戻すために, 以下のような clean というターゲットを よく使います.

clean:
	rm -f tree
	rm -f tree.o util.o
distclean: clean
	rm Makefile config.cache

このような記述があれば,make cleantreetree.outil.o の すべてのファイルを消去できます. また make distclean では上記の3ファイルに 加えて Makefileconfig.cache も 消去されます.

Makefile では変数を使うことができます. 最初の例は,変数を用いて以下のように書くことができます.

CC = cc

tree: tree.o util.o
	$(CC) -o tree tree.o util.o

最初の行で変数 CC に 文字列 cc を代入しています. 変数の内容を使うときは,$(CC) です. 変数名をカッコで括っていることに注意してください. カッコで括らない場合,$ に続く 1文字 だけが変数名として扱われます.

変数を使うことのメリットは何でしょう. まず,繰り返し出てくる長い文字列を省略できます. オブジェクトファイルがたくさんある場合, それらを変数 OBJ にでも代入しておけば, 依存性の記述にも clean の動作にも使えます. また make CC=gcc とすれば Makefile で指定した cc ではなく gcc が使用されます (コマンドラインでは = の前後に スペースを入れないでください).

実際,make が最初から持っている規則は, このように変数を使って定義されています. ですから使用する C コンパイラを変えたいときは, 変数 CC にコンパイラの名前を代入すればよいのです.


[Japanese] [English]
[make]
nagae@tk.airnet.ne.jp