【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)