与make / gmake的条件依赖

时间:2010-02-05 07:21:59

标签: c++ dependencies makefile gnu-make

有没有办法让make / gmake对条件依赖进行操作?

我有这条规则:

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

在一般情况下,每个.cpp文件都有一个相应的.h文件;但是有一些例外。有没有办法用gmake实现“依赖于它,如果它存在”?如果不这样做,这种设置是否有最佳实践?

提前致谢;干杯!

更新:我正在使用GCC

3 个答案:

答案 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目标,以便在对任何当前依赖项进行任何更改后正确地重新生成依赖项