仕組みが判ってしまえば Makefile は簡潔に書けます.$(CC) とか $@ とか $< なんて変数は使ったら負けです.
基本(その1)
ソースコード hoge.c から 実行形式のバイナリ hoge を生成するMakefileは,以下のように書きましょう
all: hoge
これだけです.これで
$ make all
とすると hoge が生成されます
重要な点は,間違っても
all: hoge hoge: hoge.c $(CC) hoge.c -o hoge
のようなMakefileを書かないことです.このようなMakefileでは
#!/bin/sh CC=gcc $CC hoge.c -o hoge
というようなシェルスクリプトと同程度の使い勝手しかありません.
基本(その2)
ここで例えば-O3 を付けてコンパイルしたい場合や,-lm を付けてリンクしたい場合は以下のようにします.
CFLAGS += -O3 LDFLAGS += -lm all: hoge
基本(その3)
ソースコードを hoge.c と fuga.c に分割している場合,つまり
場合は Makefile は以下のようになります
all: hoge hoge: hoge.o fuga.o
基本(その4)
一時的に -Wall を付けてコンパイルしたい場合などは, Makefile を書き換えずに
$ make CFLAGS=-Wall
とすることも出来ます.同様にたとえばコンパイラを gcc から gcc-3.1 に替えたい時も
$ make CC=gcc-3.1
と出来ます.
毎回引数を与えるのが面倒な場合は,環境変数で設定することも出来ます.
$ export CC=gcc-3.1 $ make
なぜこのような簡潔なmakefileで ビルドできるのか?それを理解するためには make の動作原理を理解する必要があります.動作原理については次のアーティクルをご覧下さいhttp://d.hatena.ne.jp/pyopyopyo/20070218/p2.
また以下の本を読むこともおすすめします.