0

私は過去に問題なくメイクファイルを生成するためにqmakeandを使用してきました。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))ますか?

4

1 に答える 1

1

1)ルールの-include $(DEPS)下に移動します。最初のルールはデフォルトのルールallです (特別な変数を意図的に設定しない限り) 。includeall:

.foo.d2)「それらを非表示にする」とは、の代わりに欲しいという意味だと思いますfoo.d。それらを作成するルールを変更する必要があります。

$(OBJS_DIR)/%.o: %.cpp
    @echo " compiling source file:   $< ..."
    $(CXX) -c $(CXXFLAGS) -I$(INCLUDE_PATH) -MM $< -o $@
    @mv $(OBJS_DIR)/$*.d $(OBJS_DIR)/.$*.d

そして、それらを見つける変数:

DEPS := $(patsubst %.cpp,$(OBJS_DIR)/.%.d,$(SRCS))

3) 再帰呼び出し ( ) を取り除き$(MAKE) ...ますが、最初に他のすべてが正しく機能していることを確認する必要があります。そして、$(OBJS_DIR)/%.oルールが入らないことに驚いていcommon.mkます。それ以外はかなり良さそうです。

$(OBJS_DIR)/%.o4(?))ルールのコンパイラ コマンドは-MMフラグを使用するため、コンパイラは依存関係ファイルを副作用として生成します。

于 2012-09-05T19:33:24.820 に答える