cmake 不会(总是)正确地订购 Fortran 模块
cmake does not (always) order Fortran modules correctly
我有一个使用 Fort运行 模块的代码。在正常情况下,我可以毫无问题地构建它。 CMake 负责模块文件的排序。
然而,使用 gitlab 运行ner,有时会发生 cmake 不按依赖项排序 Fort运行 模块,而是按字母顺序排列,这会导致构建失败。
问题似乎出现在 运行dom。我有一个内置于 CI 中的 b运行ch。添加一个提交后,修改了一个不以任何方式参与构建的实用程序脚本,我 运行 陷入了这个问题。 cmake配置步骤的输出没有区别。
我使用 CI 的矩阵配置来测试不同的配置。我发现,我可以通过添加另一个 mpi 版本(例如 openmpi/4.1.6)来触发它。没有那个版本,它就建立了。将它添加到矩阵中后,所有配置都显示了问题。
stages:
- configure
- build
- test
.basic_config:
tags:
- hpc_runner
variables:
# load submodules
GIT_SUBMODULE_STRATEGY: recursive
.config_matrix:
extends: .basic_config
# define job matrix
parallel:
matrix:
- COMPILER: [gcc/9.4.0]
PARALLELIZATION: [serial, openmpi/3.1.6]
TYPE: [option1, option2]
BUILD_TYPE: [debug, release]
- COMPILER: [gcc/10.3.0, intel/19.0.5]
PARALLELIZATION: [serial]
TYPE: [option2]
BUILD_TYPE: [debug]
###############################################################################
# setup script
# These commands will run before each job.
before_script:
- set -e
- uname -a
- |
if [[ "$(uname)" = "Linux" ]]; then
export THREADS=$(nproc --all)
elif [[ "$(uname)" = "Darwin" ]]; then
export THREADS=$(sysctl -n hw.ncpu)
else
echo "Unknown platform. Setting THREADS to 1."
export THREADS=1
fi
# load environment
- source scripts/build/load_environment $COMPILER $BUILD_TYPE $TYPE $PARALLELIZATION
# set path for build folder
- build_path=build/$COMPILER/$PARALLELIZATION/$TYPE/$BUILD_TYPE
configure:
stage: configure
extends: .config_matrix
script:
- mkdir -p $build_path
- cd $build_path
- $CMAKE_COMMAND
artifacts:
paths:
- build
expire_in: 1 days
###############################################################################
# build script
build:
stage: build
extends: .config_matrix
script:
- cd $build_path
- make
artifacts:
paths:
- build
expire_in: 1 days
needs:
- configure
###############################################################################
# test
test:
stage: test
extends: .config_matrix
script:
- cd $build_path
- ctest --output-on-failure
needs:
- build
HPC 机器上的 运行ner 运行s 是一个复杂的设置,我不熟悉确切的配置。我就这个问题联系了管理员,但想看看是否有人 运行 之前遇到过这个问题,并有解决方案或提示发生了什么。
在我们管理员的帮助下,我弄明白了。
问题来自cmake 使用绝对路径。 运行ner 实际上有几个 运行ners 用于并行作业,每个使用不同的前缀路径,例如/runner/001/
或 /runner/012/
。因此,当我 运行 在特定的 运行 上配置时,cmake 将该前缀路径保存到配置中。
现在处于构建阶段,无法保证在同一个 运行 用户上具有相同的配置 运行。但是,由于 make 文件中存在绝对路径,因此 make 会尝试访问配置 运行ner 前缀中的文件夹。现在,这可以是任何东西,从不存在的、来自以前管道的旧文件到另一个案例下载的正确文件。
我目前能看到的唯一修复方法是 运行 同一阶段的所有内容 运行,以避免前缀路径的轮盘赌。如果有人有不同的想法,或者如果有办法将特定的矩阵案例修复为特定的 运行ner 前缀,请发表评论。
我有一个使用 Fort运行 模块的代码。在正常情况下,我可以毫无问题地构建它。 CMake 负责模块文件的排序。
然而,使用 gitlab 运行ner,有时会发生 cmake 不按依赖项排序 Fort运行 模块,而是按字母顺序排列,这会导致构建失败。
问题似乎出现在 运行dom。我有一个内置于 CI 中的 b运行ch。添加一个提交后,修改了一个不以任何方式参与构建的实用程序脚本,我 运行 陷入了这个问题。 cmake配置步骤的输出没有区别。
我使用 CI 的矩阵配置来测试不同的配置。我发现,我可以通过添加另一个 mpi 版本(例如 openmpi/4.1.6)来触发它。没有那个版本,它就建立了。将它添加到矩阵中后,所有配置都显示了问题。
stages:
- configure
- build
- test
.basic_config:
tags:
- hpc_runner
variables:
# load submodules
GIT_SUBMODULE_STRATEGY: recursive
.config_matrix:
extends: .basic_config
# define job matrix
parallel:
matrix:
- COMPILER: [gcc/9.4.0]
PARALLELIZATION: [serial, openmpi/3.1.6]
TYPE: [option1, option2]
BUILD_TYPE: [debug, release]
- COMPILER: [gcc/10.3.0, intel/19.0.5]
PARALLELIZATION: [serial]
TYPE: [option2]
BUILD_TYPE: [debug]
###############################################################################
# setup script
# These commands will run before each job.
before_script:
- set -e
- uname -a
- |
if [[ "$(uname)" = "Linux" ]]; then
export THREADS=$(nproc --all)
elif [[ "$(uname)" = "Darwin" ]]; then
export THREADS=$(sysctl -n hw.ncpu)
else
echo "Unknown platform. Setting THREADS to 1."
export THREADS=1
fi
# load environment
- source scripts/build/load_environment $COMPILER $BUILD_TYPE $TYPE $PARALLELIZATION
# set path for build folder
- build_path=build/$COMPILER/$PARALLELIZATION/$TYPE/$BUILD_TYPE
configure:
stage: configure
extends: .config_matrix
script:
- mkdir -p $build_path
- cd $build_path
- $CMAKE_COMMAND
artifacts:
paths:
- build
expire_in: 1 days
###############################################################################
# build script
build:
stage: build
extends: .config_matrix
script:
- cd $build_path
- make
artifacts:
paths:
- build
expire_in: 1 days
needs:
- configure
###############################################################################
# test
test:
stage: test
extends: .config_matrix
script:
- cd $build_path
- ctest --output-on-failure
needs:
- build
HPC 机器上的 运行ner 运行s 是一个复杂的设置,我不熟悉确切的配置。我就这个问题联系了管理员,但想看看是否有人 运行 之前遇到过这个问题,并有解决方案或提示发生了什么。
在我们管理员的帮助下,我弄明白了。
问题来自cmake 使用绝对路径。 运行ner 实际上有几个 运行ners 用于并行作业,每个使用不同的前缀路径,例如/runner/001/
或 /runner/012/
。因此,当我 运行 在特定的 运行 上配置时,cmake 将该前缀路径保存到配置中。
现在处于构建阶段,无法保证在同一个 运行 用户上具有相同的配置 运行。但是,由于 make 文件中存在绝对路径,因此 make 会尝试访问配置 运行ner 前缀中的文件夹。现在,这可以是任何东西,从不存在的、来自以前管道的旧文件到另一个案例下载的正确文件。
我目前能看到的唯一修复方法是 运行 同一阶段的所有内容 运行,以避免前缀路径的轮盘赌。如果有人有不同的想法,或者如果有办法将特定的矩阵案例修复为特定的 运行ner 前缀,请发表评论。