td2sk の日記

技術メモとかゲームとか

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

この記事の内容は古くなっています。

をどうぞ

かつて書いたMakefileの自動生成にはいろいろと不具合があったため、修正を試みた。

C++で適当なプログラムを書くときにどうぞ。

  • src/ : *.cpp, *.hppを置く
  • Makefile : 以下
PROGRAM_NAME := out

# out
OUT_DIR := out
PROGRAM := $(OUT_DIR)/$(PROGRAM_NAME)

# sources
SOURCE_DIR := src
SOURCES := $(notdir $(wildcard $(SOURCE_DIR)/*.cpp))

# headers
HEADER_DIR := src
HEADERS := $(wildcard $(HEADER_DIR)/*.hpp)

# objs
OBJ_DIR := obj
OBJS := $(addprefix $(OBJ_DIR)/,$(SOURCES:.cpp=.o))

# dependencies
DEPEND_DIR := depend
DEPENDS := $(addprefix $(DEPEND_DIR)/,$(SOURCES:.cpp=.depend))

# compiler
CXX := g++
CXXFLAGS := -O2 #$(shell pkg-config gtkmm-3.0 --cflags)
LIBS := #$(shell pkg-config gtkmm-3.0 --libs)

vpath %.cpp src
vpath %.hpp src

.PHONY: all
all: $(DEPENDS) $(PROGRAM)
$(PROGRAM): $(OBJS)
	@mkdir -p $(OUT_DIR)
	$(CXX) $(CXXFLAGS) -o $(PROGRAM) $^ $(LIBS)

$(DEPEND_DIR)/%.depend: %.cpp $(HEADERS)
	@echo generating $@
	@mkdir -p $(DEPEND_DIR)
	@$(SHELL) -ec '$(CXX) $(CXXFLAGS) $(LIBS) -MM $< | tr "\\\\\n" " " | sed -e "s/^\(.*\)$$/$(OBJ_DIR)\/\1\n\t@mkdir -p $$\(OBJ_DIR\)\n\t$$\(CXX\) $$\(CXXFLAGS\) -c $$< -o $$\@ $$\(LIBS\)/g" > $(DEPEND_DIR)/$(notdir $@)'

ifneq "$(MAKECMDGOALS)" "clean"
-include $(DEPENDS)
endif

.PHONY : clean
clean:
	rm -fr $(OUT_DIR)
	rm -fr $(OBJ_DIR)
	rm -rf $(DEPEND_DIR)

問題点/雑記

  • ヘッダを弄るとdependがすべて再生成される
  • sed汚い
  • Haskellならこんなことしなくていいのに……*1

*1:コンパイラに--makeという素晴らしいオプションがある