make

makeってすごいなぁ。odawara的、今のMakefile
debugとreleaseを引数で切り分け、フォルダに入れる。何も入れないときはどっちも。wildcardを使って強引にすべてのソースを対象にしてしまう。

#
# Makefile
#

C_FLAGS += -Wall

COMPILE.c = gcc $(C_FLAGS) -c
LINK.c = gcc $(LD_FLAGS)

TARGET = sample
DBGTARGET = debug/$(TARGET)d
RELTARGET = release/$(TARGET)

DBGCFLAGS = -g -D__DEBUG
RELCFLAGS = -O2 -fno-strict-aliasing

SOURCES = $(wildcard *.c)
HEADERS = $(wildcard *.h)

DBGOBJFILES = $(SOURCES:%.c=debug/%.o)
RELOBJFILES = $(SOURCES:%.c=release/%.o)

.PHONY: clean debug release

all:    debug release

release:    $(RELTARGET)

debug:      $(DBGTARGET)

$(RELTARGET):   $(RELOBJFILES)
    $(LINK.c) -o $@ $^ $(RELLDFLAGS)

$(DBGTARGET):   $(DBGOBJFILES)
    $(LINK.c) -o $@ $^ $(DBGLDFLAGS)

$(RELOBJFILES): release/%.o: %.c $(HEADERS)
    @mkdir -p release
    $(COMPILE.c) $(RELCFLAGS) -o $@ $<

$(DBGOBJFILES): debug/%.o: %.c $(HEADERS)
    @mkdir -p debug
    $(COMPILE.c) $(DBGCFLAGS) -o $@ $<

clean::
    -$(RM) -rf release debug *~ *.d