makefile

makefileを整備したので公開する。要点は

  • ソースやヘッダーだけでなく一時ファイルも専用ディレクトリに入れる。
  • make cleanをしたら一時ファイルが全て消える。
  • ソースだけでなくヘッダーが変更された場合にもそれに依存するオブジェクトファイルを更新する。
  • make dependは面倒だから自動化する。

という感じ。

SUFFIX = .hpp .cpp .o

CXX = g++

TARGET = a.out
SRCDIR  = source
INCDIR  = include
DEPDIR  = depend
OBJDIR  = object
SOURCES = ${shell ls ${SRCDIR}/*.cpp}
HEADERS = ${shell ls ${INCDIR}/*.hpp}
DEPENDS = ${patsubst ${SRCDIR}/%.cpp, ${DEPDIR}/%.lo, ${SOURCES}}
OBJECTS = ${patsubst ${SRCDIR}/%.cpp, ${OBJDIR}/%.o, ${SOURCES}}
INCLUDE = -I${INCDIR}
CFLAGS = -O0 -Wall -DDEBUG
#CFLAGS = -O3
LIBRARY = 

all:${DEPENDS}
	make ${TARGET}
	#テストをここに書く。

clean:
	${RM} ${TARGET}
	${RM} -r ${OBJDIR}
	${RM} -r ${DEPDIR}
	${RM} ${shell find . -name "*~"}

.PHONY: all clean

${TARGET}:${OBJECTS}
	${CXX} ${CFLAGS} ${LIBRARY} -o ${TARGET} ${OBJECTS}

${OBJECTS}: ${OBJDIR}/%.o: ${SRCDIR}/%.cpp ${DEPDIR}/%.lo
	mkdir -p ${OBJDIR}
	${CXX} ${CFLAGS} ${INCLUDE} -c -o $@ $<

${DEPDIR}/%.lo: ${SRCDIR}/%.cpp Makefile
	mkdir -p ${DEPDIR}
	${CXX} ${INCLUDE} -MM $< | sed -e 's/\(.*\)\.o/${DEPDIR}\/\1.lo/g' > $@

include .empty ${shell find . -name "*.lo"}