FindEnvModules

版本 3.15 新增。

查找一个 Environment Modules 实现,并提供用于 CMake 脚本的命令

find_package(EnvModules [...])

Environment Modules 系统是一个命令行工具,它通过动态修改环境变量来管理类 Unix 的 shell 环境。它通常在高性能计算 (HPC) 环境中使用,以支持多种软件版本或配置。

此模块兼容两种最常见的实现

  • 基于 Lua 的 Lmod

  • 基于 TCL 的 Environment Modules

此模块主要用于在 CTest 脚本ctest -S)中设置编译器和库环境。它也可以在 CMake 脚本cmake -P)中使用。

注意

加载的环境不会在调用进程结束时保留。请勿在 CMake 项目代码(如 CMakeLists.txt)中使用此模块加载编译器环境,因为在构建阶段将无法获得环境更改。在这种情况下,请在调用 CMake 或生成的构建系统之前加载所需的环境。

结果变量

此模块定义了以下变量

EnvModules_FOUND

一个布尔值,指示是否找到了兼容的 Environment Modules 框架。

缓存变量

以下缓存变量也可以设置

EnvModules_COMMAND

用于低级模块命令的路径。

提示

此模块在调用 find_package(EnvModules) 之前接受以下变量

ENV{MODULESHOME}

此环境变量通常由 Environment Modules 实现设置,可用作查找要执行的模块命令的提示。

命令

如果找到 Environment Modules 系统,此模块提供以下命令与之交互

env_module

执行任意模块命令

env_module(<command> <args>...)
env_module(
  COMMAND <command> <args>...
  [OUTPUT_VARIABLE <out-var>]
  [RESULT_VARIABLE <ret-var>]
)

选项包括

COMMAND <command> <args>...

要执行的模块子命令和参数,就好像它们直接传递给 shell 环境中的 module 命令一样。

OUTPUT_VARIABLE <out-var>

将已执行模块命令的标准输出存储在指定的变量中。

RESULT_VARIABLE <ret-var>

将已执行模块命令的返回代码存储在指定的变量中。

env_module_swap

交换一个模块为另一个模块

env_module_swap(
  <out-mod>
  <in-mod>
  [OUTPUT_VARIABLE <out-var>]
  [RESULT_VARIABLE <ret-var>]
)

这在功能上等同于 module swap <out-mod> <in-mod> shell 命令。

选项包括

OUTPUT_VARIABLE <out-var>

将已执行模块命令的标准输出存储在指定的变量中。

RESULT_VARIABLE <ret-var>

将已执行模块命令的返回代码存储在指定的变量中。

env_module_list

检索当前已加载模块的列表

env_module_list(<out-var>)

这在功能上等同于 module list shell 命令。结果将以正确格式化的 CMake 分号分隔列表变量的形式存储在 <out-var> 中。

env_module_avail

检索可用模块的列表

env_module_avail([<mod-prefix>] <out-var>)

这在功能上等同于 module avail <mod-prefix> shell 命令。结果将以正确格式化的 CMake 分号分隔列表变量的形式存储在 <out-var> 中。

示例

在下面的示例中,此模块在 CTest 脚本中用于配置 Cray Programming Environment 的编译器和库。找到 Environment Modules 系统后,env_module() 命令用于加载必要的编译器、MPI 和科学库来设置构建环境。环境变量 CRAYPE_LINK_TYPE 被设置为 dynamic 以指定动态链接。这指示 Cray Linux Environment 编译器驱动程序在运行时链接到动态库,而不是在编译时链接静态库。结果是,编译器生成动态链接的可执行文件。

example-script.cmake
set(CTEST_BUILD_NAME "CrayLinux-CrayPE-Cray-dynamic")
set(CTEST_BUILD_CONFIGURATION Release)
set(CTEST_BUILD_FLAGS "-k -j8")
set(CTEST_CMAKE_GENERATOR "Unix Makefiles")

# ...

find_package(EnvModules REQUIRED)

# Clear all currently loaded Environment Modules to start with a clean state
env_module(purge)

# Load the base module-handling system to use other modules
env_module(load modules)

# Load Cray Programming Environment (Cray PE) support, which manages
# platform-specific optimizations and architecture selection
env_module(load craype)

# Load the Cray programming environment
env_module(load PrgEnv-cray)

# Load settings targeting the Intel Knights Landing (KNL) CPU architecture
env_module(load craype-knl)

# Load the Cray MPI (Message Passing Interface) library, needed for
# distributed computing
env_module(load cray-mpich)

# Load Cray's scientific library package, which includes optimized math
# libraries (like BLAS, LAPACK)
env_module(load cray-libsci)

set(ENV{CRAYPE_LINK_TYPE} dynamic)

# ...