ホームページへ戻る
 

上へ戻る
 

             make 入門   
by H.Y
3月 3 11:12:38 JST 2002
目次


1。make と makefile
2。makefile の構成
2ー1。ターゲットと依存記述行、ルール
1)依存記述行
2)ルール
3)コンパイルとリンクの分離
4)マクロ(macro)
5)複数の依存記述行
6)動的マクロ
(1) $*
(2) $<
(3) $@
7)複数のターゲット
8)暗黙ルール(implicit rule)

------------------------------------------------------------

1。make と makefile
make はプ ログラム群を管理するための GNU make ユーティリティである。

make ユーティリティの目的は、大きなプログラムの中の再コンパイルする
必要がある部分を自動的に決定し、再コンパイルのためのコマンドを実行す
ることである。
make は、シェルコマンドからコンパイラを起動できるどんなプログラミン
グ言語とでも組み合わせて使用できる。 make の利用対象はプログラムだけ
に限られない。
make を使う準備をするためには、まず makefile と呼 ば れ るファイルを
書かなければならない。このファイルは、プログラムを構成するファイル間
の関係と各ファイルを更新するためのプログラムを記述したものである。

書式 make [ -f makefile ] [ option ] ... target ...

ファイル名が Makefieもしくは makefile を用いる場合は, -f オプション
はいらない。
自前の makefile を用いる場合は -f のあとにその名前を指定する。
-f を指定しない場合は make は Makefie makefiel の順に探して作業を開
始する。

2。makefile の構成
2ー1。ターゲットと依存記述行、ルール
make により、依存ファイル(dependencies)をもとにして、ターゲット
(target)が作成される。
1)依存記述行
ターゲットと依存ファイルの関係は' : ' で用いて表す。
例) sample.o : main.c sub.c
ターゲットは sample.o
依存ファイルは main.c sub.c
依存記述行は、タイムスタンプを比較する関係を記述したものである。
即ち上の例では、sample.o のタイムスタンプが main.o, sub.o より
も古い場合には、この行が実行される。
2)ルール
make が実行する処理をコマンドと呼び、コマンドを記述した行がコマ
ンド行である。
(1)依存記述行とコマンド行の間には、空行をおいてはいけない。
(2)コマンド行の先頭にはかならず タブ を置く。
(3)同一ターゲットに対して複数のルールコマンド行は書けない。
依存記述行とコマンド行を合わせてルール(rule)と呼ぶ。
例)
sample.o : main.c sub.c
gcc -c main.c sub.c #先頭は タブ
3)コンパイルとリンクの分離
例)
sample : main.o sub.o
gcc main.o sub.o -o sample
main.o : main.c sample.h
gcc -c main.c -o main.o
sub.o : sub.c sample.h
gcc -c sub.c -o sub.o

sub.c のみが変更された場合は、main.o のルールは実行されない。
実行されるのは、sub.o と sample のルール。

make は makefile のターゲットを更新するため、必要に応じてそ
の他のルールも調べて依存関係のあるターゲットも更新する。
4)マクロ(macro)
マクロは同じものを複数回書く手間を省く。
マクロ参照は $(マクロ名)。マクロ名が1文字の場合は () は不要。
例1)
OBJS = main.o sub.o
sample : $(OBJS)
gcc $(OBJS) -o sample
例2)
CC = gcc
OBJ = main.o sub.o
sample : $(OBJS)
$(CC) $(OBJ) -o sample
5)複数の依存記述行
同一のターゲットに対して複数の依存記述行をかける。
ただし、複数のコマンド行は書けない。
例)
sub.o : sub.c
gcc -c sub.c -o sub.o
sub.o : sample.h
6)動的マクロ
(1) $*
ターゲットから拡張しを取り除いたものを表す。
(2) $<
最初の依存ファイルのファイル名。
(3) $@
ターゲットのファイル名。
7)複数のターゲット
1つの依存記述行が複数のターゲットを持つことができる。
例) main.o sub.o : sample.h
gcc -c $*.c

この例を書きなおすと次と同じになる。
main.o : smple.h
gcc -c main.c
sub.o : sample.h
gcc -c sub.c
この意味は sample.h が main.o や sub.o よりも新しい場合に
コンパイルをやり直すことになる。
8)暗黙ルール(implicit rule)
暗黙ルールが適用されるのは、makefile 中にターゲットと依存
ファイルの組み合わせに対して依存記述行だけがあって、コマンド行
がない場合にである。
コマンド行がある場合はそのコマンド行が用いられる。
例)
main.o : main.c

この場合は
gcc -c main.c -o main.o
が暗黙ルールとして実行される。これは、
----------------------------------
main.o : main.c
$(CC) -c $< #暗黙ルール
-----------------------------------
と等価である。