【发布时间】:2017-06-14 11:22:33
【问题描述】:
是否可以使用 travis-ci 构建使用 cmake、gcc-6 和 g++-6 的 c++ 应用程序/项目?
【问题讨论】:
-
我有 clang-3.9 和 g++-6 github.com/gelldur/EventBus
-
仅供参考。 blog.lukaspradel.com/…
是否可以使用 travis-ci 构建使用 cmake、gcc-6 和 g++-6 的 c++ 应用程序/项目?
【问题讨论】:
配置 travis 以使用正确的编译器有点棘手。 可以这样做:
首先,您需要将分发设置为 trusty(travis-ci 支持的最新版本的 ubuntu)并需要 sudo。
dist: trusty
sudo: require
接下来我们设置语言和编译器:
language: cpp
compiler: gcc
到目前为止一切顺利。现在我们可以开始设置 apt install 配置了:
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- gcc-6
- g++-6
- cmake
这将为我们的构建工具的较新版本添加 ppa 并安装它们。下一步是设置到新 gcc 和 g++ 的链接。 /usr/local/bin 在 /usr/bin 之前被搜索,因此我们新安装的第 6 版编译器将可以通过 gcc 和 g++ 访问。 script: 的开头应如下所示:
script:
- sudo ln -s /usr/bin/gcc-6 /usr/local/bin/gcc
- sudo ln -s /usr/bin/g++-6 /usr/local/bin/g++
如果您想验证这些工具的版本,也请添加下一行:
- gcc -v && g++ -v && cmake --version
这些命令返回的版本如下:
gcc: 6.2.0
g++: 6.2.0
cmake: 3.2.2
基本上就是这样。完整的 .travis.yml 如下所示:
dist: trusty
sudo: required
language:
- cpp
compiler:
- gcc
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- gcc-6
- g++-6
- cmake
script:
# Link gcc-6 and g++-6 to their standard commands
- ln -s /usr/bin/gcc-6 /usr/local/bin/gcc
- ln -s /usr/bin/g++-6 /usr/local/bin/g++
# Export CC and CXX to tell cmake which compiler to use
- export CC=/usr/bin/gcc-6
- export CXX=/usr/bin/g++-6
# Check versions of gcc, g++ and cmake
- gcc -v && g++ -v && cmake --version
# Run your build commands next
【讨论】:
unlink 但有 i) 通过update-alternatives 和/或 ii) 更多的 Debian/Ubuntu 方式,您可以设置 CXX。
sudo——你是那个脚本的根。最后,另一个技巧是链接到一个新的/usr/local/bin/g++(Debian 不会填充/usr/local/,它保证为空),因为它将在/usr/bin 之前搜索。以防万一构建脚本不尊重CC,CXX,...
我在@henne90gen 的回答中发现了一些错误(或者它们可能刚刚更改)。具体来说:
sudo。gcc-7 没有安装到 /usr/local/bin,它已经在 PATH 中。这应该可行:
dist: trusty
language: cpp
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- gcc-7
- g++-7
script:
- export CC=gcc-7
- export CXX=g++-7
- ...
这是一个较长的示例,其中包括现代版本的 Qt(我正在使用 QtSVG),并且可以在 OSX 和 Linux 上运行。
os:
- linux
- osx
language: cpp
dist: trusty
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- sourceline: "ppa:beineri/opt-qt-5.10.1-trusty"
packages:
- gcc-7
- g++-7
- qt510-meta-minimal
- qt510svg
- qt510imageformats
- qt510tools
before_install:
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
brew update ;
brew install qt5 cmake ;
brew link --force qt ;
fi
script:
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
export CC=gcc-7 ;
export CXX=g++-7 ;
source /opt/qt510/bin/qt510-env.sh ;
fi
- cmake --version
- qmake --version
- ...
【讨论】:
使用dist: bionic。这应该可以满足大多数情况。
【讨论】:
在为此苦苦挣扎了太久之后添加了一个半相关的解决方案。希望它可以帮助其他人避免花费我在更新 travis.yml、提交、等待 Travis 的循环中花费的时间……重复直到它起作用。
我在一个 Python 项目中有一个 C 扩展,它开始在 Travis 中生成失败的测试,但在本地通过。最终,我在 xenial 环境中追踪到了旧版本的gcc。这是最终为我解决问题的 Travis YAML 文件:
dist: xenial
language: python
before_install:
- sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
- sudo apt-get update -q
- sudo apt-get install -y gcc-7
- export CC=/usr/bin/gcc-7
python:
- "3.6"
- "3.7"
install:
- pip install -r requirements.txt
- python setup.py build_ext --inplace
script:
- python run_tests.py
顺便说一句,其他人发现他们想在特定提交上触发 Travis 构建以找出问题的确切开始位置?
【讨论】:
variants 未定义。你知道如何拥有 cmake 或 make 使用 -std=c++17 吗?