build 和 arch 配置链
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\arch
LMDZ.COMMON-6.3\LMDZ.COMMON\makelmdz
LMDZ.COMMON-6.3\LMDZ.COMMON\makelmdz_fcm
LMDZ.COMMON-6.3\LMDZ.COMMON\create_make_gcm
LMDZ.COMMON-6.3\LMDZ.COMMON\build_gcm
LMDZ.COMMON-6.3\LMDZ.COMMON\bld.cfg
Mars 运行参与度:构建期必经/条件经过。Mars 可执行文件本身运行时不经过这些脚本;但编译 Mars 目标、选择 phymars、并行宏、IOIPSL/XIOS、NetCDF 和 FFT/MKL 等能力时,这些配置决定源码如何预处理、编译和链接。
顶层文件
| 文件 | 作用 |
|---|---|
makelmdz |
旧 makefile 构建入口:解析维度、物理包、并行、I/O 和 CPP key,生成源码列表和 makefile,再调用 make。 |
create_make_gcm |
扫描传入源码目录,生成 makefile 规则、库依赖、include 路径和主程序链接规则。 |
makelmdz_fcm |
主构建入口:解析选项,支持 -clean,生成 FCM config,生成 libf/misc/version_control.F90,并驱动 bld.cfg。 |
bld.cfg |
FCM build 配置模板,声明 source groups、toolchain、CPP/FPP keys、外部依赖排除和输出。 |
build_gcm |
简短 bash wrapper,检查 dimensions.h 防止并发编译冲突后调用构建。 |
arch 目录约定
arch/ 下每个目标平台通常有同名前缀的三类文件:
| 后缀 | 内容 |
|---|---|
.fcm |
FCM/编译变量:%COMPILER、%LINK、%MAKE、%CPP_FLAGS、%CPP_DEF、%BASE_FFLAGS、%PROD_FFLAGS、%DEBUG_FFLAGS、%MPI_FFLAGS、%OMP_FFLAGS、link flags 等。 |
.path |
环境路径:NETCDF_*、IOIPSL_*、XIOS_* include/lib 路径和库名。 |
.env |
机器环境初始化,如 module load 或导出 NetCDF/HDF5 路径;不是每个 arch 都有。 |
例如 arch-gfortran.fcm 使用 gfortran/gcc/make,定义 CPP_DEF LAPACK、FPP_DEF NC_DOUBLE 和 real*8 默认编译参数;arch-gfortran.path 从 $NETCDF、$PWD/ioipsl 和 ../XIOS 组织库路径。
makelmdz 旧构建链
- 解析
-d维度、-p物理包、-parallel none/mpi/omp/mpi_omp、-io ioipsl/mix/xios、-cpp、-arch等选项。 - 依据物理包名计算
phys_root,例如mars归为 Mars 物理根。 - 根据物理包和选项追加
CPP_PHYS、CPP_EARTH、CPP_PARA、CPP_MPI、CPP_OMP、CPP_IOIPSL、CPP_XIOS等 key。 - 对
newstart/start2archive禁止并行编译;对 1D 目标禁止并行。 - 调用
grid/dimension/makdim生成dimensions.h,可对某些物理包生成 bands/scatterers include。 - 按维度选择
dyn3d或dyn3dpar、dyn3d_common、filtrez、phy_common、phy<physique>等源码目录。 - 若配置或源码列表变化,调用
./create_make_gcm $src_dirs重新生成 makefile。 - 将
CPP_KEY转成-D...加入编译 flag,调用 make 构建目标主程序或库。
create_make_gcm
create_make_gcm 从传入目录扫描 .F/.F90/.h,生成静态库和可执行文件规则。它设置:
GCM=$(pwd),LIBF=$(GCM)/libf,LIBO=$(GCM)/libo。DIRMAIN=dyn$(DIM)d$(FLAG_PARA)。- 动力库组合:
-ldyn$(DIM)d$(FLAG_PARA) -ldyn3d_common。 dyn3d目标依赖libdyn*d*、滤波库和libdyn3d_common.a。- include 搜索会覆盖
dyn3d/grid/misc等目录,源码同名时按层级规则取最后匹配。
FCM 构建链
makelmdz_fcm 和 bld.cfg 使用 FCM 配置:
makelmdz_fcm -arch <name>将arch/arch-<name>.path、.env、.fcm链接为当前工作目录的arch.path/env/fcm。- source
arch.env和arch.path,得到 NetCDF、IOIPSL、XIOS 等路径。 - 解析物理、并行、I/O、维度和 CPP key,生成
config.fcm、arch.opt等 FCM 输入。 bld.cfgincludearch.fcm和config.fcm,声明%LIBF下的 source groups:dyn、phys、dyn_phys、grid、filtrez、misc、dyn3d_common、phy_common、aerono等;当前源码已移除src::evolution %EVOLUTION。bld.cfg指定bld::tool::fc/cc/ld/ar/make、cppflags/fppflags、cppkeys/fppkeys,并排除外部依赖如netcdf、ioipsl、xios、mpif.h。
Mars 相关选择点
-p mars或 Mars 物理包名决定phy<physique>、dynphy_lonlat/phy<phys_root>和 Mars 专属辅助目录是否进入源码集合。-parallel mpi/omp/mpi_omp决定dyn3dpar、CPP_PARA、CPP_MPI、CPP_OMP和 MPI/OMP flags。-io xios会追加CPP_IOIPSL CPP_XIOS CPP_IOIPSL_NO_OUTPUT;-io mix追加CPP_IOIPSL CPP_XIOS。- NetCDF、IOIPSL 和 XIOS 的 include/lib 路径来自
arch.path,不是源码内硬编码。
复现要点
- 构建脚本会创建/删除
libf/grid/dimensions.h;并发编译会被dimensions.h存在检查拦截。 makelmdz缓存.makelmdz和源码列表,只有配置或列表变化时重建 makefile。- FCM 路径下
bld.cfg把.inc扩展名当作 CPP include 处理,避免 include 依赖漏扫。
待确认
- 实际生产平台使用哪个
arch-*需由用户运行环境或 Mars workflow 配置确定。