私は過去に問題なくメイクファイルを生成するためにqmake
andを使用してきました。CMake
ただし、最近、コードを実行するクラスターのいくつかについて、これらのツールを見つけたりインストールしたりするのが難しいと考えたので、裸の Makefile を作成することにしました。それに加えて、Makefile についても 1 つまたは 2 つ学ぶことができました ;)
私のプロジェクトには、内部にソース/ヘッダー ファイルを含むいくつかのディレクトリが含まれており、ほとんどの場合、それらの間の相互依存関係があります。私は SO を通じて、-MM
フラグを使用して依存関係情報を自動的に生成することを学びました。私のメイクファイルは次のようになります
include $(HEAD_DIR)/common.mk
OBJS_DIR = objs
LIBS_DIR = libs
SRCS = Matrix.cpp MatrixFull.cpp
OBJS = $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.o))
LIB_0 = $(patsubst %, $(LIBS_DIR)/%,libalgebra.a)
DEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
-include $(DEPS)
.PHONY: all
all:
@echo " ===== Building dependencies in lib/algebra ===== "
@$(MKDIR) $(OBJS_DIR)
@$(MAKE) $(OBJS)
@$(MKDIR) $(LIBS_DIR)
@$(MAKE) $(LIB_0)
@echo " ===================== done ===================== "
$(OBJS_DIR)/%.o: %.cpp
@echo " compiling source file: $< ..."
$(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
$(LIB_0): $($(OBJS_DIR)/%.o)
@echo " generating library file: $(@F) ..."
@$(AR) $(AR_FLAGS) $@ $^
.PHONY: clean
clean:
@$(RM) $(OBJS_DIR) $(LIBS_DIR)
make
これは通常は問題なく動作しますが、いくつかのことを改善したいと思いall
ますDEPS
。これは、このメイクファイルで発生するはずですか? all
デフォルトのルールを作成するにはどうすればよいですか? 2) 依存ファイルを非表示にするにはどうすればよいですか? 試してみDEPS := $(patsubst %,$(OBJS_DIR)/.%,$(SRCS:.cpp=.d))
ましたが、役に立ちませんでした。 3) この Makefile を他の方法で改善できると思われる場合、具体的な提案はありますか?
編集:正直なところ、make がどのようにコンパイラを呼び出して依存関係を生成するのかさえわかりません :p ... これに関する明示的な規則は見当たりません。それはどういうわけかに隠されていDEPS := $(patsubst %,$(OBJS_DIR)/%,$(SRCS:.cpp=.d))
ますか?