有没有办法让make / gmake对条件依赖进行操作?
我有这条规则:
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CPPC) -c $(FLAGS_DEV) $< -o $@
在一般情况下,每个.cpp文件都有一个相应的.h文件;但是有一些例外。有没有办法用gmake实现“依赖于它,如果它存在”?如果不这样做,这种设置是否有最佳实践?
提前致谢;干杯!
更新:我正在使用GCC
答案 0 :(得分:3)
由于gmake模式规则匹配的两个特性,您可以通过在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文件的文件的第一个模式,第二个模式匹配那些没有的文件。当然,最新的检查也会按预期运行(例如,如果“foo.h”存在且更新,则“foo.o”将被视为过时。)
您可能希望使用另一个变量来消除这两个规则之间的冗余;例如:
COMPILE=$(CPPC) -c $(FLAGS_DEV) $< -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
$(COMPILE)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(COMPILE)
答案 1 :(得分: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)
答案 2 :(得分:0)
更强大的解决方案是让gcc为您生成依赖项。如果您制定规则来生成包含生成的依赖项的(例如).d
文件,那么您不必担心任何给定的.h
文件是否存在.cpp
文件而您自动为每个.cpp
文件获取所依赖的任何.h
文件的正确依赖关系。
E.g。
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)
请注意,我使用.d
选项同时生成make规则的.o
和-MT
目标,以便在对任何当前依赖项进行任何更改后正确地重新生成依赖项