• ルールが複雑で見辛い
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に自動生成してもらうべき
      • どうせ自動生成するならninjaで良い
  • NeovimはMakefileをcmakeコマンドのwrapperとして用いており、こういう使い方も悪くないなと思った
    • 同じディレクトリにMakefileとCMakeLists.txtがあるのは混乱の元となりそうだが