【问题标题】:Change C++ compiler for cmake under TravisCI在 TravisCI 下为 cmake 更改 C++ 编译器
【发布时间】:2014-10-23 09:55:02
【问题描述】:

据我所知,更改 cmake 使用的目标 C++ 编译器的最佳方法是在调用 cmake 之前更改 CXX 环境变量:

$ export CXX="clang++" && cmake --build

Travis CI 构建会根据构建的设置设置 CXXCC。因此,如果您的 .travis.yml 中有此内容:

language: cpp
compiler: 
  - gcc
  - clang

script:
  - cmake --build
  - ./bin/foo

cmake 第一次应该在后者上使用 GCC 和 Clang 不是吗?

相反,GCC 构建编译得很好(它是 cmake 使用的默认编译器),但 Clang 版本也使用 GCC:

0.01s$ echo $CC $CXX
叮当++
命令“echo $CC $CXX”以 0 退出。

0.02s$ $CXX --version
clang version 3.4 (tags/RELEASE_34/final) 目标:x86_64-unknown-linux-gnu 线程模型:posix

运行:cmake -G "Unix Makefiles" -Wno-dev ../cmake
-- C 编译器标识是 GNU
-- CXX 编译器标识为 GNU
-- 检查工作的 C 编译器:/usr/bin/gcc
-- 检查工作的 C 编译器:/usr/bin/gcc -- 工作
-- 检测 C 编译器 ABI 信息
-- 检测 C 编译器 ABI 信息 - 完成
-- 检查工作的 CXX 编译器:/usr/bin/c++
-- 检查工作的 CXX 编译器:/usr/bin/c++ -- 工作
-- 检测 CXX 编译器 ABI 信息
-- 检测 CXX 编译器 ABI 信息 - 完成

我什至尝试在通话前再次设置这些变量:

- if [ "$CXX" == "clang++" ]; then export CXX="clang++" && cmake --build; fi
- if [ "$CXX" == "g++" ];     then export CXX="g++"     && cmake --build; fi

我觉得这没什么意义……

Here 是使用 GCC 成功构建,here 是(应该是)clang 构建。

我的问题是:如何更改 Travis CI 下 cmake 使用的编译器?

Here 是我的 .travis.yml。

【问题讨论】:

  • The first time cmake should use GCC and Clang on the latter isn't? 这种方法应该可以正常工作。但是我更喜欢使用 cmake 工具链,它更灵活。示例:linuxmac
  • @ruslo 但不起作用。如您所见here,cmake完全摆脱了CXX的值,即clang++

标签: c++ cmake travis-ci biicode


【解决方案1】:

说明

在您的.travis.yml 我们看到:

- if [ "$CXX" == "clang++" ]; then export CXX="clang++" && bii cpp:build; fi
- if [ "$CXX" == "g++" ];     then export CXX="g++"     && bii cpp:build; fi

biicode 的命令bii cpp:build 使用biicode 的默认生成器运行CMake,该生成器是"Unix Makefiles" 用于UNIX 平台(GNU 工具链)。阅读:Biicode C++ documentation - Generators and IDEs

在您的日志中可以看到此行为:Running: cmake -G "Unix Makefiles" -Wno-dev ../cmakehttps://travis-ci.org/Manu343726/Turbo/jobs/33889114,第 257 行)

CMake 并不总是寻找环境变量CXX/CC(如CMake FAQ 中所述)。这取决于选择的发电机。当我在没有生成器的情况下调用 CMake 时,它​​对我有用(我的 travis 文件:https://github.com/quepas/Graph-ene/blob/master/.travis.yml)。

解决方案

【讨论】:

    【解决方案2】:

    您可以使用矩阵。如果您有许多不同的编译器(例如 gcc5、gcc6、clang3.7、clang3.8),这将特别有用:

    language: generic # Works better in most cases
    
    matrix:
        include:
        - env: CXX=g++ CC=gcc
          # additional apt settings if needed
        - env: CXX=clang++ CC=clang
    
    script:
        - ...
    

    如果你有不同版本的编译器,这可以扩展:

    […]
    matrix:
        include:
        - env: CXX=g++-5 CC=gcc-5
        - env: CXX=g++-6 CC=gcc-6
        - env: CXX=clang++-3.8 CC=clang-3.8
    […]
    

    它也不会重复脚本步骤并保持文件清洁 if... else... 部分。

    https://travis-ci.org/RhysU/descendu/builds/158055261

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多