サンプルのmycatは、3つのファイル、mycat.c、getline.c、 copy.cから出来ていて、これらから実行ファイルmycatを作るには
$ gcc -c mycat.c
$ gcc -c getline.c
$ gcc -c copy.c
$ gcc mycat.o getline.o copy.o -o mycat
とするのでした。
これを良くみて、各ファイル間の依存関係 を考えましょう。
ターゲット: ソース
です。
ターゲットがソースに依存し、そのソースによりターゲットが生成されるということを表わします。
具体例では次のようになります。
mycat: mycat.o getline.o copy.o
mycat.o: mycat.c
getline.o: getline.c
copy.o: copy.c
これらをMakefileに書き込んでmakeを実行します。
(注: あとで省略記法を説明します!)
必要ならばCCやCFLAGSなどの設定も書きこんでおきましょう。
$ make
gcc -Wall -O2 -c mycat.c -o mycat.o
gcc -Wall -O2 -c getline.c -o getline.o
gcc -Wall -O2 -c copy.c -o copy.o
gcc mycat.o getline.o copy.o -o mycat
$ ls
Makefile copy.c copy.o getline.c getline.o mycat mycat.c mycat.o
mycatが出来ていますね。
なお、引数なしでmakeを実行すると、makeは最初に書かれたターゲット(例ではmycat:)を生成することを目標に動きます。 他のターゲットは、その過程で必要がなければ生成されません。
実は、上で書いたMakefileの後半の3行、
mycat.o: mycat.c
getline.o: getline.c
copy.o: copy.c
は不要です。 というのは、makeは、mycat.oはmycat.cから作るもの、getline.oはgetline.cから作るもの、、、と知っているのです。 これはファイル名のサッフィクス(.oや.c)から判断しています。 だから
mycat: mycat.o getline.o copy.o
とだけMakefileに書いておけばよく、複数ファイルの場合もたった一行で十分なのです。
この一行だけのMakefileでの、makeの動作を追ってみましょ
う。
最終的なMakefileは
CC = gcc
CFLAGS = -Wall -O2
mycat: mycat.o getline.o copy.o
となります。 この最終版ではオプションも指定しています。 見てのとおり、CCはコンパイラの指定、CFLAGSはCCへ与えるオプションです。 これらCCやCFLAGSをマクロといいます。