td2sk の日記

技術メモとかゲームとか

【Makefile】依存関係を自動生成する試み2014

かつて書いたMakefile、改めて見なおしてみるとどうにも醜い。
10分ほど試行錯誤したら、汚いハックをあっさり取り除けたので訂正して公開。
2年前の自分は何考えてたんだ……。

以下、パブリックドメインとするので、煮るなり焼くなり好きにしてください。

PROGRAM_NAME := $(shell basename `pwd`)
 
# compiler
CXX := clang++
CXXFLAGS := -O2 -Wextra
LIBS :=
 
# out
OUT_DIR := out
 
# program
PROGRAM_DIR := $(OUT_DIR)/bin
PROGRAM := $(PROGRAM_DIR)/$(PROGRAM_NAME)
 
# sources
SOURCE_DIR := src
SOURCES := $(wildcard $(SOURCE_DIR)/*.cpp)
SOURCE_NAMES = $(notdir $(SOURCES))
 
# headers
HEADER_DIR := include
HEADERS := $(wildcard $(HEADER_DIR)/*.hpp)
 
# objs
OBJ_DIR := $(OUT_DIR)/obj
OBJS := $(addprefix $(OBJ_DIR)/,$(SOURCE_NAMES:.cpp=.o))
 
# dependencies
DEPEND_DIR := $(OUT_DIR)/depend
DEPENDS := $(addprefix $(DEPEND_DIR)/,$(SOURCE_NAMES:.cpp=.depend))
 
.PHONY: all
all: $(DEPENDS) $(PROGRAM)
$(PROGRAM): $(OBJS)
        @mkdir -p $(PROGRAM_DIR)
        $(CXX) $(CXXFLAGS) $(LIBS) $^ -o $(PROGRAM)
 
$(DEPEND_DIR)/%.depend: $(SOURCE_DIR)/%.cpp $(HEADERS)
        @echo "generating $@"
        @mkdir -p $(DEPEND_DIR)
        @$(CXX) $(CXXFLAGS) $(LIBS) -I$(HEADER_DIR) -MM $< > $@
 
$(OBJ_DIR)/%.o: $(SOURCE_DIR)/%.cpp
        @mkdir -p $(OBJ_DIR)
        $(CXX) $(CXXFLAGS) $(LIBS) -I$(HEADER_DIR) -c $^ -o $@
 
 
ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEPENDS)
endif
 
.PHONY : clean
clean:
        $(RM) -r $(OUT_DIR)

makedepend? なにそれおいしいの?