Трэвис CI с Clang 3.4 и C++11

Можно ли заставить Travis CI работать с Clang, поддерживающим C++11? (Я хочу Clang, а не GCC, у меня уже есть GCC 4.8, работающий в Travis CI.) Похоже, что предустановленная версия не поддерживает C++11. Все мои попытки установить любую более новую версию заканчиваются неудачными из-за этого:

In file included from /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/move.h:57:   
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:269:39: error:
use of undeclared identifier '__float128'
struct __is_floating_point_helper<__float128>

Я видел трюк -D__STRICT_ANSI__, но для меня он противоречит другим вещам.

Можно ли заставить его работать? См. также мой .travis.yml.


person wilx    schedule 01.03.2014    source источник
comment
здорово, если у вас получится =). кстати, другие люди начинают использовать BuildHive, возможно, он дружелюбнее для C++   -  person pepper_chico    schedule 02.03.2014
comment
Лично я хотел бы знать, как, если вы поняли это. Отвечая на свой собственный ответ, возможно.   -  person pepper_chico    schedule 03.03.2014
comment
Связанные вопросы: github.com/travis-ci/travis-ci/issues/1379, github.com/travis-ci/travis-ci/issues /979   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 18.04.2015


Ответы (3)


Вот часть моих файлов .travis.yml (в основном взяты из этого файла).

language: cpp

compiler:
  - clang
  - gcc

before_install:
  # g++4.8.1
  - if [ "$CXX" == "g++" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi

  # clang 3.4
  - if [ "$CXX" == "clang++" ]; then sudo add-apt-repository -y ppa:h-rayflood/llvm; fi

  - sudo apt-get update -qq

install:
  # g++4.8.1
  - if [ "$CXX" = "g++" ]; then sudo apt-get install -qq g++-4.8; fi
  - if [ "$CXX" = "g++" ]; then export CXX="g++-4.8"; fi

  # clang 3.4
  - if [ "$CXX" == "clang++" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.4; fi
  - if [ "$CXX" == "clang++" ]; then export CXX="clang++-3.4"; fi

script: 
  - $CXX --version

ИЗМЕНИТЬ, потому что может быть очень полезно добавить libc++ для travis. Насколько мне известно, в Linux нет пакета для libc++, поэтому его приходится компилировать "вручную". Не забывайте -stdlib=libc++ в CXXFLAGS при компиляции с clang.

install:
  # clang 3.4
  - if [ "$CXX" == "clang++" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.4; fi
  - if [ "$CXX" == "clang++" ]; then export CXXFLAGS="-std=c++0x -stdlib=libc++"; fi
  - if [ "$CXX" == "clang++" ]; then svn co --quiet http://llvm.org/svn/llvm-project/libcxx/trunk libcxx; fi

  - if [ "$CXX" == "clang++" ]; then cd libcxx/lib && bash buildit; fi
  - if [ "$CXX" == "clang++" ]; then sudo cp ./libc++.so.1.0 /usr/lib/; fi
  - if [ "$CXX" == "clang++" ]; then sudo mkdir /usr/include/c++/v1; fi
  - if [ "$CXX" == "clang++" ]; then cd .. && sudo cp -r include/* /usr/include/c++/v1/; fi
  - if [ "$CXX" == "clang++" ]; then cd /usr/lib && sudo ln -sf libc++.so.1.0 libc++.so; fi
  - if [ "$CXX" == "clang++" ]; then sudo ln -sf libc++.so.1.0 libc++.so.1 && cd $cwd; fi

  - if [ "$CXX" == "clang++" ]; then export CXX="clang++-3.4"; fi
person Florian Richoux    schedule 08.03.2014
comment
Это все еще работает для вас? Что бы я ни пытался, моя сборка не работает на Трэвисе с 'iostream' file not found. - person Jared Burrows; 10.05.2015
comment
@JaredBurrows Я не прикасался к Трэвису 9 месяцев, но я только что провел тест, и да, он все еще работает сегодня. travis-ci.org/richoux/Wall-in/jobs/61990830 Вы уверены, что указали следующую опцию clang -stdlib=libc++ - person Florian Richoux; 10.05.2015
comment
Спасибо за публикацию. Я сравню вашу сборку со своей. - person Jared Burrows; 10.05.2015

Теперь есть лучший способ сделать это.

sudo: false
dist: trusty
language: cpp
os:
  - linux
compiler:
  - gcc
  - clang
install:
# /usr/bin/gcc is 4.6 always, but gcc-X.Y is available.
- if [[ $CXX = g++ ]]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
# /usr/bin/clang has a conflict with gcc, so use clang-X.Y.
- if [[ $CXX = clang++ ]]; then export CXX="clang++-3.5" CC="clang-3.5"; fi
addons:
  apt:
    sources:
    - ubuntu-toolchain-r-test
    - llvm-toolchain-precise-3.5 # not sure why we needed this
  packages:
    - gcc-4.9
    - g++-4.9
    - clang-3.5

(По словам службы поддержки Travis, явный sudo: false позволит ему собираться в Docker (для скорости), даже если у вас есть репозиторий до Docker.)

Благодаря solarce в Поддержка Travis за то, что заметили мою ошибку и исправили документы.

person cdunn2001    schedule 18.06.2015
comment
Как насчет clang++ с поддержкой C++11? - person Jared Burrows; 27.06.2015
comment
comment
Спасибо. Я вижу, что в белом списке нет clang++. Итак, я предполагаю, что С++ 11 с clang недоступен для travisci? Я вручную настраиваю libc++. - person Jared Burrows; 28.06.2015
comment
Мы используем C++11 и строим как для g++, так и для clang++. См. -std=c++11 в одной из наших сборок Travis. Верхняя строка журнала Travis указывает на докеризованную сборку. Вы также можете изучить .travis.yml для этой сборки. - person cdunn2001; 29.06.2015
comment
Большое спасибо, что поделились. Думаю, мне нужно будет снова обновить мои файлы .travis.yml. - person Jared Burrows; 29.06.2015
comment
эй, спасибо за вашу помощь. Я заработал. Я надеюсь, что они продолжат свою умелую поддержку. - person Jared Burrows; 06.07.2015
comment
Ну, у меня только clang-3.0 работает с gcc-x.y в Travis через APT. Я не могу выбрать версию clang без ошибок. Но я думаю, что докеризированная сборка того стоит. @JaredBurrows, если у вас работает другая версия clang, опубликуйте свою последнюю сборку Travis. - person cdunn2001; 12.07.2015
comment
При ручной установке у меня работают gcc 5 и clang 3.6: github.com/ jaredsburrows/OpenVirus/blob/master/.travis.yml. - person Jared Burrows; 12.07.2015
comment
О, вы потеряли докеризованную сборку. sudo: required. Да, есть много способов с sudo. Посмотрите на верхнюю часть вашего вывода Трэвиса. Вы не увидите «докер» в имени машины для сборки. - person cdunn2001; 12.07.2015
comment
Моей целью было просто скомпилировать его с помощью gcc и clang с включенным C++11. С вашими изменениями он у меня есть в другой ветке: github.com/jaredsburrows /OpenVirus/blob/test/.travis.yml - person Jared Burrows; 12.07.2015
comment
Установите флаги CC и CPP в случае before_install: в таких случаях, как node_js, чтобы избежать перезаписи стандартных команд install:. Сэкономлен день для тестирования github.com/audreyt/node-webworker-threads на Node. 4.х. - person brodybits; 13.10.2015

Похоже, что разработчики clang исправили это при сборке в режиме -std=gnu++11.

Вы можете строить с этим флагом вместо __STRICT_ANSI__?

person Bill Lynch    schedule 08.03.2014
comment
То есть вместо -std=c++11 -stdlib=libc++ мы можем использовать -std=gnu++11 или -std=gnu++11 -stdlib=libc++? - person Jared Burrows; 10.05.2015
comment
@JaredBurrows: Если вы используете libc++, вы вообще не увидите эту ошибку. Эта ошибка связана с конфликтом между clang и libstdc++. - person Bill Lynch; 10.05.2015
comment
Я пытаюсь построить проект на TravisCI, который использует C и C++. Он отлично компилируется с помощью gcc и clang (локально), но не на TravisCI, clang не работает. Я использую cmake. Судя по ответу Флориана, для TravisCI не хватает библиотек. - person Jared Burrows; 10.05.2015