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 前缀,请发表评论。