2017-07-09 17 views
0

I持って、次のMakefile(無関係なものを無視するように減少):Makefileはすべてのものを毎回作成します

BUILD_DIR=./build 
OBJS = \ 
    $(BUILD_DIR)/main.o \ 
    $(BUILD_DIR)/common.o \ 
    ... 

roo: $(OBJS) 
    $(CXX) -o [email protected] $(OBJS) $(LFLAGS) 

.PHONY: $(BUILD_DIR) 
$(BUILD_DIR): 
    mkdir -p $(BUILD_DIR)/passes 

$(BUILD_DIR)/%.o: src/%.cpp $(BUILD_DIR) 
    $(CXX) -o [email protected] -c $< $(CFLAGS) 

ただし、すべてのオブジェクトファイルが毎回再コンパイルされ、でも私は直接[email protected]を使用するために、ルールを以下のよと思いましたそれぞれの非偽のターゲットで

私はレシピではなくルールにサブディレクトリを適用しているので、これはthisと重複しているとは思わないが、間違っている可能性がありますか?ビルドディレクトリの依存関係を正しく追跡するにはどうすればよいですか?

答えて

1

$(BUILD_DIR)/%.o$(BUILD_DIR)に依存していますが、そのディレクトリにファイルが追加されるたびに(たとえばこのルール自体によって)そのディレクトリに触れます。つまり、$(BUILD_DIR)となり、常にはそのターゲットより新しいものになります。

ビルドディレクトリを自動的に作成したいようです。それを行う最善の方法は、私が思うに、

$(BUILD_DIR)/%.o: src/%.cpp 
    mkdir -p $(BUILD_DIR)/passes 
    $(CXX) -o [email protected] -c $< $(CFLAGS) 
+0

ありがとう;完全に修正しました –

+0

または 'create-dir:' PHONY-targetを作成することができます。このターゲットでは、 'mkdir -p $ {BUILD_DIR}/passes'を実行することができ、' $ {BUILD_DIR} /%。o'の依存関係は 'create-dir'となり、必要に応じて再利用することができます。 – uzsolt

+0

テストを行うことに意味はありません。 'mdir -p'を実行するだけでもいいかもしれません。ディレクトリがすでに存在する場合は、それはno-opになります。 – MadScientist

関連する問題