你可以通过在你的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)
你使用什么编译器? – 2010-02-05 07:41:51
我正在使用gcc(4.4.1) – 2010-02-05 08:02:54
当我读到这个时,我很高兴我搬到了另一个构建系统......如果你从未尝试过任何东西,试试'SCons',它会改变你的生活。 – 2010-02-05 09:31:38