BUILD_DIR := ./build
OBJ_DIR := $(BUILD_DIR)/obj
SOURCES := $(wildcard src/*.cpp)
OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst src/%.cpp, %.o, $(SOURCES)))
$(OBJ_DIR)/%.o: src/%.cpp
[ -e $(dir $@) ] || mkdir $(dir $@)
clang++ $(CXXFLAGS) -o $@ -c $<
$(OBJ_DIR)/%.d: src/%.cpp
[ -e $(dir $@) ] || mkdir $(dir $@)
clang++ $(CXXFLAGS) -MM $< > $@
$(eval OBJ = $(@:.d=.o))
sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@
- 多分これが一番いいと思います
- このルールはコンパイルしかしてくれない(リンクコマンド省略)
これを書いて半年、mesonを知ったりMakefileを書いたりCMakeListsを書いたりしてちょっと変わった
- ビルド自動化ツールとしてのMakefileは、人間が手書きするものではない気がする
- 人間が書くMakefileはせいぜい便利コマンドまとめ程度で良い
- CMakeやmesonに自動生成してもらうべき
- NeovimはMakefileをcmakeコマンドのwrapperとして用いており、こういう使い方も悪くないなと思った
- 同じディレクトリにMakefileとCMakeLists.txtがあるのは混乱の元となりそうだが