Можно ли использовать travis-ci для создания приложения/проекта С++, использующего cmake, gcc-6 и g++ - 6?
Как использовать travis-ci для создания современного С++ с использованием современного cmake?
Ответ 1
Настройка travis для использования правильного компилятора немного сложна. Вот как это можно сделать:
Прежде всего вам нужно настроить дистрибутив на верную (новейшую версию ubuntu, поддерживаемую travis-ci) и потребовать 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
Ответ 2
Я нашел некоторые ошибки в ответе @henne90gen (или, может быть, они только что изменились). В частности:
- Вам не нужно
sudo
. - Вам не нужно устанавливать CMake из apt. Это установит старую версию CMake 2.8 от Trusty. К счастью, образ сборки уже поставляется с CMake 3.9.2 (на данный момент).
-
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
- ...
Ответ 3
Добавление полусвязанного решения после долгой борьбы с этим. Надеюсь, это поможет кому-то другому избежать затрат времени, которое я потратил на прохождение цикла обновления travis.yml, фиксации, ожидания Трэвиса... повторите, пока это не сработает.
У меня было расширение C в проекте Python, которое начало производить неудачные тесты в Travis, но проходило локально. В конце концов я отследил его до старой версии gcc
в среде xenial. Вот файл 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 на конкретном коммите, чтобы выяснить, где именно возникла проблема?
Ответ 4
Используйте dist: bionic
. Это должно соответствовать большинству случаев.