首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmake无法(总是)正确地对Fortran模块进行排序

cmake无法(总是)正确地对Fortran模块进行排序
EN

Stack Overflow用户
提问于 2021-11-15 16:04:19
回答 1查看 78关注 0票数 0

我有一个使用Fortran模块的代码。在正常情况下,我可以毫无问题地构建它。CMake负责模块文件的排序。

然而,使用gitlab运行器时,有时会发生cmake不按依赖项而是按字母顺序对Fortran模块进行排序的情况,这会导致构建失败。

这个问题似乎是随机出现的。我有一个分支机构内建的线人。在添加了一个commit之后,我遇到了这个问题。这个提交修改了一个在构建中没有以任何方式参与的实用程序脚本。cmake配置步骤的输出没有区别。

我使用CI的矩阵配置来测试不同的配置。我发现,我可以通过添加另一个mpi版本(例如openmpi/4.1.6)来触发此操作。没有这个版本,它就构建了。将其添加到矩阵中后,所有配置都显示了问题。

代码语言:javascript
复制
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

runner运行在HPC机器上,这是一个复杂的设置,我不熟悉确切的配置。我用这个问题联系了管理员,但想看看以前是否有人遇到过这个问题,并对正在发生的事情有解决方案或提示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 21:57:16

在管理员的帮助下,我把它弄清楚了。

问题来自使用绝对路径的cmake。runner实际上有几个用于并行作业的runner,每个runner使用不同的前缀路径,例如/runner/001//runner/012/。因此,当我在特定runner上运行configure时,cmake会将前缀路径保存到配置中。

现在在构建阶段,不能保证在同一个runner上运行相同的配置。但是,由于make文件中有绝对路径,make会尝试访问configure runner前缀中的文件夹。现在,这可以是任何东西,从不存在的旧文件,从以前的管道到由另一个案例下载的正确文件。

我目前能看到的唯一修复方法是在一个阶段中在同一个跑步者上运行所有东西,以避免前缀路径的轮盘赌。如果任何人有不同的想法,或者如果有方法可以将特定的矩阵案例修复为特定的runner前缀,请发表评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69977351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档