Makefileの書き方

このサイトがわかりやすい
http://www.ie.u-ryukyu.ac.jp/~e085739/c.makefile.tuts.html
以下、上のサイトのMakefileをコピーしました。サイトがなくなったら嫌なので。

# Makefile_header

# プログラム名とオブジェクトファイル名
PROGRAM = main
OBJS = main.o

# 定義済みマクロの再定義
CC = gcc
CFLAGS = -Wall -O2

# サフィックスルール適用対象の拡張子の定義
.SUFFIXES: .c .o

# プライマリターゲット
.PHONY: all
all: depend $(PROGRAM)

# プログラムの生成ルール
$(PROGRAM): $(OBJS)
	$(CC) -o $(PROGRAM) $^

# サフィックスルール
.c.o:
	$(CC) $(CFLAGS) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
	$(RM) $(PROGRAM) $(OBJS) depend.inc

# ヘッダファイルの依存関係
.PHONY: depend
depend: $(OBJS:.o=.c)
	-@ $(RM) depend.inc
	-@ for i in $^; do cpp -MM $$i | sed "s/\ [_a-zA-Z0-9][_a-zA-Z0-9]*\.c//g" >> depend.inc; done

-include depend.inc

ハイフン「-」の付いたコマンドは、失敗しても次に行けるコマンドです。@の付いたコマンドは標準出力に出力しないコマンドです。