使文件的目标相同,但依赖关系不同



我有一堆fortran文件,我正试图用makefile编译,其中一部分makefile看起来像这个

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f  | $(OBJ_DIR)
$(F90) -c -o $@ $< $(FFLAGS) -J $(OBJ_DIR) -I $(OBJ_DIR)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f90  | $(OBJ_DIR)
$(F90) -c -o $@ $< $(FFLAGS) -J $(OBJ_DIR) -I $(OBJ_DIR)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.F90  | $(OBJ_DIR)
$(F90) -c -o $@ $< $(FFLAGS) -J $(OBJ_DIR) -I $(OBJ_DIR)

你可以看到,这是非常重复的,因为我必须编译*.f*.f90*.F90,但编译命令对所有这些都是完全相同的。有没有将它们合并到一个规则中的wat?

否。

你可以把规则放在这样一个变量里:

COMPILE.f90 = $(F90) -c -o $@ $< $(FFLAGS) -J $(OBJ_DIR) -I $(OBJ_DIR)

但你仍然需要写三条规则,比如:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f  | $(OBJ_DIR)
$(COMPILE.f90)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.f90  | $(OBJ_DIR)
$(COMPILE.f90)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.F90  | $(OBJ_DIR)
$(COMPILE.f90)

如果你有很多这样的规则,你可以创建一个规则,然后多次评估:

define COMPILE.f90
$$(OBJ_DIR)/%.o: $$(SRC_DIR)/%.$(SUFFIX) | $$(OBJ_DIR)
$$(F90) -c -o $$@ $$< $$(FFLAGS) -J $$(OBJ_DIR) -I $$(OBJ_DIR)
endef
$(foreach SUFFIX,f f90 F90,$(eval $(COMPILE.f90)))

但在我看来,仅仅为了三条规则而增加复杂性是不值得的。

最新更新