我有一堆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)))
但在我看来,仅仅为了三条规则而增加复杂性是不值得的。