Travis CI上で、g++とclang++の複数バージョンでビルドする
C++でライブラリを作っていて、それをTravisCI上でテストします。そのとき、GCCとClangの両方でテストしたっかったのですが、いろいろ面倒だったのでメモです。
基本的には、Travis CIのmatrixという機能を使って様々なバージョンのコンパイラを使ったテストを独立・並行に立ち上げることができます(GCCとClangの複数バージョンをテストしたいので、単にcompiler
を設定するだけでは不足です)。
以下が面倒なポイントです
- GCC, Clangのそれぞれについて、バージョンに応じたリポジトリを追加・パッケージを入れる必要がある
- GCC:
apt / source
に、ubuntu-toolchain-r-test
を加える - Clang: それに加え、
3.8
までと3.9
以降で追加リポジトリが違う。Clangのバージョンに応じてllvm-toolchain-precise-X.Y
もしくはllvm-toolchain-trusty-X.Y
を加える
- GCC:
- Clangの注意:
- C++11/14以降を使うためには
libc++
が必要なので、libc++-dev
,libc++abi-dev
をインストールする - C++で書かれた依存ライブラリが必要な場合は、それも
libc++
でビルドする必要がある。(C++ のABIが違うので)。aptパッケージなどのビルド済みバイナリは使えない -stdlib=libc++
をCMAKE_CXX_FLAGS
に加えた状態でビルド
- C++11/14以降を使うためには
といったあたりがややこしいポイントです。
自分が現在開発しているucx-playgroundというライブラリでは、以上の試行錯誤を全部詰め込んだ結果、無事に動きました(ライブラリというよりは実験コード置き場ですが)
GitHub - keisukefukuda/ucx-playground
Travis CI - Test and Deploy Your Code with Confidence
そのときに使った .travis.yml
は、
これです。リポジトリ内にある travis/gen_yaml.py
というPythonスクリプトで自動生成しています。