現在、適切な Makefile を作成しようとしています。
私が望んでいるのは、何が起こっているかを完全に制御することなので、サードパーティのソフトウェアは必要ありません。
私の現在の試みは理にかなっているように思えますが、依存関係の生成が有効ではないため、行き詰まっています。
読みやすくするために、完全な Makefile は小さな断片に分割されています。改善すべき点があれば、どのセクションについてもコメントをいただければ幸いです。
まず、次の静的定義があります
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
これで問題ないはずです。プロファイリング フラグをオプションにできれば完璧ですが、それは重要ではありません。
SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o
TARGET = ./bin/my_target
SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
基本的に、これはすべての*.cpp
ファイルをサブフォルダーから抽出し、さらにオブジェクトの名前としておよびにsrc
置き換えます。./src
./obj
.cpp
.o
.PHONY: clean all depend
all: $(TARGET)
$(TARGET): $(OBJS)
@echo "-> linking $@"
@$(CXX) $^ $(LDFLAGS) -o $@
$(OBJ_DIR)/%.$(EXT_OBJ):
@echo "-> compiling $@"
@$(CXX) $(CXXFLAGS) -c $< -o $@
Afaik、このブロック (有効な依存関係ファイルが存在する場合) は、必要なすべてのコンパイルとリンクを実行する必要があります。
clean:
@echo "removing objects and main file"
@rm -f $(OBJS) $(TARGET)
自明で正しいはずですか、それともここで何か不足していますか?
$(SRC_DIR)/%.$(SRC_EXT):
$(CXX) $(DEPFLAGS) -MT \
"$(subst $(SRC_DIR),$(OBJ_DIR),$(subst $(SRC_EXT),$(OBJ_EXT),$@))" \
$(addprefix ,$@) >> $(DEP);
clear_dependencies:
@echo "-> (re-)building dependencies";
@$(RM) $(DEP)
depend: clear_dependencies $(SRCS)
これは非機能部分です。私がやろうとしているのは、g++
Compiler フラグ-MM
を使用して依存関係を自動作成し-MT
、デフォルトとは異なるパスを使用することです。結果の依存関係は次のようになります
./obj/main.o: ./src/main.cpp ./src/some_header_file.h
残念ながら、これが呼び出されることはありません。なぜそうなのか、私にはわかりません。同様の質問で、ベータ版ユーザーはaを追加することで一時的な解決策を喜んで提供しました.Phony
が、これには変更を加えずにすべてのオブジェクトを再構築するという副作用があります。
最後に、1行だけです
-include $(DEP)
一度作成された依存関係ファイルを含めます。
任意の部分に関するヒントを提供する回答は大歓迎です。だから私の質問は次のとおりです。どうすればもっとうまくできるか、おそらく「よりクリーン」になり、依存関係の生成が機能しないのはなぜですか?