メンテナンスが難しくない単純なプロジェクトをビルドするための単純なMakefileをセットアップしようとしています。Makefileのパターンマッチングが期待通りに機能しない
パターンマッチングルールを使用したいと思います。 %.o : %.c ; g++ ...
私はワイルドカードにマッチしたソースファイルから推測してコンパイルしたいすべてのオブジェクトファイルを持っています。
ディレクトリ構造は、今私の問題は、次のようになります
./src
./include
./build/bin
./build/objs
です。例えば、膨張が./build/objs/a.cc
に依存するが、ソースファイルが./src/a.cc
にあるターゲット・ルール./build/objs/a.o
からなりライン$(OBJS):%.o : %.cc
で
INCL_DIR = ./include
SRC_DIR = ./src
BUILD_DIR = ./build
BIN_DIR = $(BUILD_DIR)/bin
OBJ_DIR = $(BUILD_DIR)/objs
SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc))
OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:%.cc=%.o))
$(BIN_DIR)/program : $(OBJS)
$(CXX) $(CXXFLAGS) -I $(INCL_DIR) $^ -o [email protected]
$(OBJS):%.o : %.cc
$(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o [email protected]
。
./src/a.cc
のように依存関係のフォーマットを取り除くことができましたが、テキスト操作のためのユーティリティはルールの依存関係では動作しないようです。
私は$(*F)
は、前述の例の場合にa
に展開するだろうが、依存関係としてリストされているとき、それは何にも展開されません
$(OBJS):%.o : $(SRC_DIR)/$(notdir %.cc)
または
$(OBJS):%.o : $(SRC_DIR)/$(*F).cc
のようなものを試してみました。
私はMakefilesに慣れていないし、なぜ私の試みがうまくいかないのか分からず、自分の問題を解決する可能性のある解決策を聞いて欲しいと思う。
ありがとうございました。
私には完全にはわかりませんが、あなたが求めていることを理解すれば、このようなパターンマッチングルールを実際に使用することはできません - 依存関係のリストを作成するために組み込みの文字列操作関数を使用する必要があります。私はhttps://latedev.wordpress.com/2014/11/08/generic-makefiles-with-gcc-and-gnu-make/にある一般的なmakefileに関するいくつかの記事を持っています。 –
あなたは '$(OBJ_DIR)/%。o:$(SRC_DIR)/%。c'のようなものを探していますか? – blackghost
@ジョン私は './build/test.o:./src/./ build/test.cc'に展開すると思いますが、'。/ src/test.cc'に依存していたはずです。また、私は '$(OBJS)/%。o:...'を使うことを望んでいます。これは、さらにネストされたディレクトリのファイルをOBJSに追加したいからです。 – jezzi23