Как использовать travis-ci для создания современного С++ с использованием современного cmake?

Можно ли использовать travis-ci для создания приложения/проекта С++, использующего cmake, gcc-6 и g++ - 6?

Ответ 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. Это должно соответствовать большинству случаев.