代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

与make/gmake的条件依赖关系

  •  3
  • Chris Tonkinson  · 技术社区  · 14 年前

    有没有一种方法可以指导make/gmake根据条件依赖性进行操作?

    我有这个规则:

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

    在一般情况下,每个.cpp文件都有一个对应的.h文件;但是也有一些例外。有没有一种方法可以通过gmake实现“依赖于它,如果它存在”?如果失败,是否存在这种设置的最佳实践?

    事先谢谢,干杯!

    更新: 我在使用GCC

    3 回复  |  直到 14 年前
        1
  •  3
  •   wich    14 年前

    一个更好的方法是确定cpp文件与gcc-mm的依赖关系,并将它们包含在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
  •  3
  •   Eric Melski    14 年前

    您可以通过明智地在makefile中使用模式规则来实现这一点,这要归功于gmake模式规则匹配的两个特性。首先,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文件的文件匹配第一个模式,为那些不具有.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)
    
        3
  •  0
  •   CB Bailey    14 年前

    一个更强大的解决方案是让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)
    

    注意我把两个 .d版 以及 .o 使用生成规则的目标 -MT 选项,以便在对任何当前依赖项进行任何更改之后正确地重新映射依赖项。