我有以下 Makefile 示例:
BUILD = build
PATH_POT3 = src/pot/pot3/
MPIFC = mpiifort
FFLAGS = -O3
MOL_LIST = $(shell find $(PATH_POT3) -mindepth 1 -maxdepth 1 -type d)
$(foreach MOL,$(MOL_LIST), \
$(eval LIST_MOL := $(shell find $(MOL) -name "*.f90")) \
$(info Fortran files: $(LIST_MOL)) \
$(foreach SRC,$(LIST_MOL), \
$(eval OBJ := $(BUILD)/$(notdir $(SRC:.f90=.o))) \
$(OBJ): $(SRC) ; \
$(info Compiling: $(SRC)) \
$(info Output: $(OBJ)) \
$(MPIFC) $(FFLAGS) -c $(SRC) -o $(OBJ) \
) \
)
all: $(foreach MOL,$(MOL_LIST),\
$(foreach SRC,$(shell find $(MOL) -name "*.f90"),\
$(BUILD)/$(notdir $(SRC:.f90=.o))\
)\
)
这里我想PATH_POT3
以顺序的方式(一个接一个地)编译每个子目录的(递归)内容。遗憾的是,这种构造并没有提供预期的结果,因为它只编译列表中的第一个目标文件,而跳过了所有其他目标文件。Makefile 为我的测试用例打印了以下信息:
Fortran files: src/pot/pot3/ar3/pot_ar3.f90 src/pot/pot3/ar3/ar43/pot_ar43.f90
Compiling: mpiifort -O3 -c src/pot/pot3/ar3/pot_ar3.f90 -o build/pot_ar3.o
Output: build/pot_ar3.o
Compiling: mpiifort -O3 -c src/pot/pot3/ar3/ar43/pot_ar43.f90 -o build/pot_ar43.o
Output: build/pot_ar43.o
Fortran files: src/pot/pot3/ar33/pot_ar33.f90 src/pot/pot3/ar33/pot_ar333.f90 src/pot/pot3/ar33/ar53/pot_ar53.f90
Compiling: mpiifort -O3 -c src/pot/pot3/ar33/pot_ar33.f90 -o build/pot_ar33.o
Output: build/pot_ar33.o
Compiling: mpiifort -O3 -c src/pot/pot3/ar33/pot_ar333.f90 -o build/pot_ar333.o
Output: build/pot_ar333.o
Compiling: mpiifort -O3 -c src/pot/pot3/ar33/ar53/pot_ar53.f90 -o build/pot_ar53.o
Output: build/pot_ar53.o
make: 'build/pot_ar3.o' is up to date.
一切似乎都设置正确,但编译仅针对执行build/pot_ar3.o
。
我应该如何更改此文件以获得所需的行为?