2017-03-23 13 views
0

メンテナンスが難しくない単純なプロジェクトをビルドするための単純な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に慣れていないし、なぜ私の試みがうまくいかないのか分からず、自分の問題を解決する可能性のある解決策を聞いて欲しいと思う。

ありがとうございました。

+0

私には完全にはわかりませんが、あなたが求めていることを理解すれば、このようなパターンマッチングルールを実際に使用することはできません - 依存関係のリストを作成するために組み込みの文字列操作関数を使用する必要があります。私はhttps://latedev.wordpress.com/2014/11/08/generic-makefiles-with-gcc-and-gnu-make/にある一般的なmakefileに関するいくつかの記事を持っています。 –

+2

あなたは '$(OBJ_DIR)/%。o:$(SRC_DIR)/%。c'のようなものを探していますか? – blackghost

+0

@ジョン私は './build/test.o:./src/./ build/test.cc'に展開すると思いますが、'。/ src/test.cc'に依存していたはずです。また、私は '$(OBJS)/%。o:...'を使うことを望んでいます。これは、さらにネストされたディレクトリのファイルをOBJSに追加したいからです。 – jezzi23

答えて

0

解決策はすでに@ Johnのコメントにあります。私は少し詳しく説明しようとします。 hello.ccという例をフォルダsrcに使用します。

パターンルールは、パターンを%シンボルで保持します。メイクファイルにパターンルール:build/objs/%.o : src/%.ccがあり、ファイルbuild/objs/hello.oの作成を依頼した場合、%は値helloを持ちます。しかし、パターンルールが$(OBJS):%.o : %.ccの場合、パターン%build/objs/helloになり、依存ファイルbuild/objs/hello.ccは(ではなく、srcに保存されているため)、存在しません。

だから、あなたのためのソリューションは、次のようになります。

$(OBJS):$(OBJ_DIR)%.o : $(SRC_DIR)%.cc 
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o [email protected] 

あなたはパターンがどのように機能するかを確認するには、あなたがレシピにライン@echo $*を追加することで、パターンの内容を印刷することができます。

関連する問題