我有一个使用Fortran模块的代码。在正常情况下,我可以毫无问题地构建它。CMake负责模块文件的排序。
然而,使用gitlab运行器时,有时会发生cmake不按依赖项而是按字母顺序对Fortran模块进行排序的情况,这会导致构建失败。
这个问题似乎是随机出现的。我有一个分支机构内建的线人。在添加了一个commit之后,我遇到了这个问题。这个提交修改了一个在构建中没有以任何方式参与的实用程序脚本。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:
- buildrunner运行在HPC机器上,这是一个复杂的设置,我不熟悉确切的配置。我用这个问题联系了管理员,但想看看以前是否有人遇到过这个问题,并对正在发生的事情有解决方案或提示。
发布于 2021-11-15 21:57:16
在管理员的帮助下,我把它弄清楚了。
问题来自使用绝对路径的cmake。runner实际上有几个用于并行作业的runner,每个runner使用不同的前缀路径,例如/runner/001/或/runner/012/。因此,当我在特定runner上运行configure时,cmake会将前缀路径保存到配置中。
现在在构建阶段,不能保证在同一个runner上运行相同的配置。但是,由于make文件中有绝对路径,make会尝试访问configure runner前缀中的文件夹。现在,这可以是任何东西,从不存在的旧文件,从以前的管道到由另一个案例下载的正确文件。
我目前能看到的唯一修复方法是在一个阶段中在同一个跑步者上运行所有东西,以避免前缀路径的轮盘赌。如果任何人有不同的想法,或者如果有方法可以将特定的矩阵案例修复为特定的runner前缀,请发表评论。
https://stackoverflow.com/questions/69977351
复制相似问题