複数の実行ファイルを一発make

AtCoderに参加してるときとか、AOJの問題を解いてる時は
今まではこういうmakefileを書いてmakeしてました*1

all: prog1 prog2 prog3...

prog1: prog1.o
    gcc -Wall -o prog1 prog1.c

prog2: prog2.o
    gcc -Wall -o prog2 prog2.c

prog3: prog3.o
    gcc -Wall -o prog3 prog3.c
...

そう、新しくファイルを作る度に書きたしてました。
実に効率が悪い。そして美しくないなと。
プログラミングコンテストとかだと、基本的に実行ファイルは単一のソースファイルからコンパイルするので、
なんとかmake一発で通るようにしたいなーと思ってました。
http://osima.jp/blog/makefile-and-wildcard/
を参考にmakefileを書いてみるとうまくいきました。

CC=g++
CFLAGS=-Wall
.SUFFIXES = .cpp
objs:=$(wildcard *.cpp)
targets:=$(objs:.cpp= )

.PHONY:all
all: $(targets)
.cpp:
	$(CC) $(CFLAGS) -o $@ $<

これで新しくファイルを.cppファイルを作成しても、それに対応する実行ファイルを一発で作成できるようにったよやったね!

*1:makefile書かずに直接コマンドを打ち込むことも多い