cdhowie の回答を読んだ後、mkdep を調べ始めましたが、そのようなプログラムは廃止され、同じことを行うコンパイラ フラグに置き換えられたようです。メイン プログラム (srcpath のコード) とテスト (testpath のコード) の両方をコンパイルしてテストを実行するメイクファイルの本体を含めました。この間に、2 つの個別の依存関係ファイルが作成されます。1 つはメイン用、もう 1 つはテスト用です。
src = $(shell cd $(srcpath); find ./ -name "*.cpp")
testsrc = $(shell cd $(testpath); find ./ -name "*.cpp")
obj = $(src:%.cpp=%.o)
testobj = $(testsrc:%.cpp=%.o)
head = $(shell cd $(srcpath); find ./ -name "*.h")
testhead = $(shell cd $(testpath); find ./ -name "*.h")
skip_files = ./main.o
makedep = $(shell $(cpp) $(cflags) -MM -MT '$(patsubst $(srcpath)%.cpp, $(objpath)%.o, $(file))' $(file) >> .depend)
makedeptest = $(shell $(cpp) $(cflags) -MM -MT '$(patsubst $(testpath)%.cpp, $(testobjpath)%.o, $(file))' $(file) >> .dependtest)
all: main Test
Test: .dependtest $(addprefix $(testobjpath),$(testobj))
@echo "Linking Tests"
@$(cpp) $(lflags) -o $(testbin) $(addprefix $(testobjpath), $(testobj)) $(addprefix $(objpath), $(filter-out $(skip_files),$(obj)))
@./$(testbin)
.dependtest: $(addprefix $(testpath), $(testsrc)) $(addprefix $(testpath), $(testhead))
$(shell rm -f .dependtest)
$(foreach file,$(addprefix $(testpath), $(testsrc)), $(makedeptest))
$(addprefix $(testobjpath), %.o): $(addprefix $(testpath), %.cpp)
$(cpp) $(cflags) -c -o $@ $<
main: .depend $(addprefix $(objpath), $(obj))
@echo "Linking Program"
@$(cpp) $(lflags) -o $(bin) $(addprefix $(objpath),$(obj))
.depend: $(addprefix $(srcpath), $(src)) $(addprefix $(srcpath), $(head))
$(shell rm -f .depend)
$(foreach file, $(addprefix $(srcpath), $(src)), $(makedep))
$(addprefix $(objpath), %.o): $(addprefix $(srcpath), %.cpp)
$(cpp) $(cflags) -c -o $@ $<
clean:
-rm $(testbin) $(bin) $(addprefix $(objpath),$(obj)) $(addprefix $(testobjpath),$(testobj))
-include .depend
-include .dependtest