これは、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)