3

make / gmakeに条件付き依存関係に基づいて動作するように指示する方法はありますか?

私はこのルールを設定しています:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
  $(CPPC) -c $(FLAGS_DEV) $< -o $@

一般的なケースでは、すべての.cppファイルに対応する.hファイルがあります。ただし、いくつかの例外があります。gmakeで「これに依存する」を実現する方法はありますか?それができない場合、このタイプのセットアップのベストプラクティスはありますか?

前もって感謝します; 乾杯!

更新: GCCを使用しています

4

3 に答える 3

3

これは、gmakeパターンルールマッチングの2つの機能のおかげで、makefileでパターンルールを適切に使用することで実現できます。まず、gmakeは、宣言された順序でパターンを照合しようとします。次に、パターン内のすべての前提条件が満たされる場合にのみ、パターンが一致します(それらがすでにファイルとして存在するか、それらを作成するルールがあります)。したがって、makefileを次のように作成すると、次のようになります。

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
        $(CPPC) -c $(FLAGS_DEV) $< -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
        $(CPPC) -c $(FLAGS_DEV) $< -o $@

gmakeは、対応する.hファイルがあるファイルの最初のパターンと一致し、ないファイルの2番目のパターンと一致します。もちろん、最新のチェックも期待どおりに動作します(たとえば、「foo.h」が存在し、新しい場合、「foo.o」は古いと見なされます)。

別の変数を使用して、これら2つのルール間の冗長性を排除することもできます。例えば:

COMPILE=$(CPPC) -c $(FLAGS_DEV) $< -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
        $(COMPILE)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
        $(COMPILE)
于 2010-02-05T08:03:42.037 に答える
3

これを行うためのより良い方法は、gcc -MM を使用して cpp ファイルの依存関係を実際に判断し、それらを makefile に含めることです。

SRCS = main.cpp other.cpp
DEPS = $(SRCS:%.cpp=$(DEP_DIR)/%.P)

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
  $(CPPC) -c $(FLAGS_DEV) $< -o $@

$(DEP_DIR)/%.P: $(SRC_DIR)/%.cpp
  $(CPPC) -MM $(FLAGS_DEV) -MT $(OBJ_DIR)/$*.o -MP -MF $@ $<

-include $(DEPS)
于 2010-02-05T08:12:13.150 に答える
0

より堅牢なソリューションは、gcc に依存関係を生成させることです。生成された依存関係を含む(たとえば) ファイルを生成するルールを作成すると、特定のファイルにファイルが存在する.dかどうかを心配する必要がなくなり、ファイルが依存するすべてのファイルについて、各ファイルの正しい依存関係が自動的に取得されます。.h.cpp.cpp.h

例えば

DEPFILES=$(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.d,$(wildcard $(SRC_DIR)/*.cpp))

$(OBJ_DIR)/%.d: $(SRC_DIR)/%.cpp
    g++ -MF $@ -MM -MT $@ -MT $(basename $@).o %<

include $(DEPFILES)

現在の依存関係の変更に続いて依存関係が正しく再作成されるように、オプションを使用して make ルール.dの と.oターゲットの両方を作成していることに注意してください。-MT

于 2010-02-05T08:24:49.230 に答える