Подтвердить что ты не робот

Travis CI с Clang 3.4 и С++ 11

Можно ли заставить Travis CI работать с Clang, который способен на С++ 11? (Я хочу, чтобы Clang, а не GCC, у меня уже есть GCC 4.8, работающий в Travis CI.) Похоже, что версия, которая предварительно установлена, не поддерживает С++ 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.

4b9b3361

Ответ 1

Вот часть моих .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

РЕДАКТИРОВАТЬ, потому что может быть очень полезно добавить libС++ для travis. Насколько мне известно, для libС++ нет пакета Linux, поэтому его нужно скомпилировать "вручную". Не забывайте -stdlib = libС++ в 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

Ответ 2

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

sudo: false
language: cpp
compiler:
  - gcc
  - clang
install:
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi
addons:
  apt:
    sources:
    - ubuntu-toolchain-r-test
    packages:
    - gcc-4.8
    - g++-4.8
    - clang

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

Благодаря solarce в сервисе Travis для уведомления о моей ошибке и фиксации документов.