本当は怖い情報科学

HPC屋の趣味&実益ブログ

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を加える
  • Clangの注意:
    • C++11/14以降を使うためにはlibc++が必要なので、 libc++-dev, libc++abi-dev をインストールする
    • C++で書かれた依存ライブラリが必要な場合は、それも libc++ でビルドする必要がある。(C++ のABIが違うので)。aptパッケージなどのビルド済みバイナリは使えない
    • -stdlib=libc++CMAKE_CXX_FLAGS に加えた状態でビルド

といったあたりがややこしいポイントです。

自分が現在開発しているucx-playgroundというライブラリでは、以上の試行錯誤を全部詰め込んだ結果、無事に動きました(ライブラリというよりは実験コード置き場ですが)

GitHub - keisukefukuda/ucx-playground

Travis CI - Test and Deploy Your Code with Confidence

そのときに使った .travis.yml は、

ucx-playground/.travis.yml at d4102355079e3998e16977369076166afa5526cf · keisukefukuda/ucx-playground · GitHub

これです。リポジトリ内にある travis/gen_yaml.py というPythonスクリプトで自動生成しています。

【広告】