初识Fortran程序的makefile 文件

感谢@zoziha 分享的Fortran-Lang官网资源

可结合陈皓的《跟我一起写makefile》看,都是很好的深入学习资料。

Fortran 百科网站 一应俱全,全都有 !!!!

==================================================
makefile文件的显示规则非常简单,形式如下:
-------------------------------
Target ... :prerequisites...
recipe
-------------------------------
即 第一行为编译出的目标文件(.o文件或可执行文件):(英文冒号) 生成目标文件所需的依赖文件(.f90 .mod .o等文件)。第二行 必须用TAB开始编译命令。注意文件的执行顺序为从文件末尾开始逐条执行编译命令。


用makefile文件编译Fortran的前提是 掌握 Fortran程序中源文件的依赖关系。在Fortran程序中常以module的调用来判断依赖关系,即假设源文件common.f90中为module constants , subroutine.f90 中以 use constants 调用了该module,则subroutine.f90 必须依赖constants.mod 生成 subroutine.o 文件。以下面的程序示意makefile文件的书写。图中文件
commons.f90 有两个module。function1.f90和subroutine1.f90分别调用了一个module。

用显示规则书写makefile文件如下:

# 连接object文件生成可执行文件program_main
program_main: main.o function1.o subroutine1.o commons.o
    ifort -o program_main main.o function1.o subroutine1.o commons.o
# 编译源文件生成object文件 
main.o: main.f90
    ifort -c main.f90
function1.o: function1.f90 constants.mod 
   ifort -c function1.f90
subroutine1.o: subroutine1.f90 variables.mod
    ifort -c subroutine1.f90
commons.o constants.mod variables.mod: commons.f90
    ifort -c commons.f90
# 删除object和mod文件
clean:
    rm rf main.o function1.o subroutine1.o commons.o constant.mod variables.mod

用变量表示后书写如下:

# 定义目标变量
TAR = program_main
# 定义object文件的变量
OBJ = main.o function1.o subroutine1.o commons.o
# 定义mod文件的变量
MOD = constant.mod variables.mod
# 定义编译器变量
 FC = ifort
# 执行命令 用 $(变量) 调用变量
 $(TAR): $(OBJ)
    $(FC)  -o $(TAR)  $(OBJ)  # 连接生成可执行文件
main.o: main.f90
    $(FC) -c main.f90
function1.o: function1.f90 $(MOD)
    $(FC) -c function1.f90
subroutine1.o: subroutine1.f90 $(MOD)
    $(FC) -c subroutine1.f90
commons.o constant.mod variables.mod: commons.f90
    $(FC) -c commons.f90
clean:
    rm rf $(OBJ) $(MOD) 

用隐含规则书写如下:

TAR = program_main 
# 获取文件夹中所有.f90文件列表
SRCS = $(wildcard *.f90)
# 替换.f90后缀为.o后缀 得到.o文件列表
OBJ = $(patsubst %.f90,%.o,$(SRCS))
FC = ifort  
# $^ 表示所有依赖文件
$(TAR): $(OBJ)
    $(FC) -o $(TAR) $^ 
# %.o %.f90 %.mod 表示任意文件
%.o:%.f90 %.mod
    $(FC) -c %.f90