2010-02-05 91 views
3

有没有办法指示make/gmake对条件依赖进行操作?使用make/gmake进行条件依赖

我有这样的规则的地方:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CPPC) -c $(FLAGS_DEV) $< -o [email protected] 

在一般情况下,每一个.cpp文件中都有相应的.h文件中;但是有一些例外。有没有办法通过gmake实现“如果存在”取决于此?否则,这种类型的设置是否有最佳做法?

在此先感谢;干杯!

更新:我使用GCC

+0

你使用什么编译器? – 2010-02-05 07:41:51

+0

我正在使用gcc(4.4.1) – 2010-02-05 08:02:54

+0

当我读到这个时,我很高兴我搬到了另一个构建系统......如果你从未尝试过任何东西,试试'SCons',它会改变你的生活。 – 2010-02-05 09:31:38

回答

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 [email protected] 

$(DEP_DIR)/%.P: $(SRC_DIR)/%.cpp 
    $(CPPC) -MM $(FLAGS_DEV) -MT $(OBJ_DIR)/$*.o -MP -MF [email protected] $< 

-include $(DEPS) 
3

你可以通过在你的makefile明智地使用模式规则做到这一点,这要归功于使用gmake模式规则匹配的两个特征。首先,gmake尝试按照它们声明的顺序来匹配模式;第二,当且仅当模式中的所有先决条件都可以满足(或者它们已经作为文件存在,或者有制定它们的规则)时,模式匹配。所以,如果你写你的makefile是这样的:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h 
     $(CPPC) -c $(FLAGS_DEV) $< -o [email protected] 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
     $(CPPC) -c $(FLAGS_DEV) $< -o [email protected] 

gmake命令将匹配那些有相应的.h文件中的文件第一模式,第二个为那些不这样做。当然,最新的检查也会按预期行事(例如,如果“foo.h”存在并且更新,“foo.o”将被认为是过时的)。

您可能想要使用另一个变量来消除这两个规则之间的冗余;例如:

COMPILE=$(CPPC) -c $(FLAGS_DEV) $< -o [email protected] 
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h 
     $(COMPILE) 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
     $(COMPILE) 
0

更健壮的解决方案是让gcc为您生成依赖关系。如果您制定规则以生成(例如).d包含生成的相关性的文件,那么您不必担心对于任何给定的.cpp文件是否存在.h文件,并且您自动为任何.h文件获得每个.cpp文件的正确依存关系它依赖于。

E.g.

DEPFILES=$(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.d,$(wildcard $(SRC_DIR)/*.cpp)) 

$(OBJ_DIR)/%.d: $(SRC_DIR)/%.cpp 
    g++ -MF [email protected] -MM -MT [email protected] -MT $(basename [email protected]).o %< 

include $(DEPFILES) 

注意,我做两个.d和使用-MT选项,这样的依赖关系是否正确重拍以下任何当前依赖任何更改厂名规则的.o目标。