io.js on Travis-CIでNode.jsのC++アドオンのビルドが失敗する件

Node.jsのC++アドオンをTravis-CIでテストする際に、io.js@v3の環境でのみビルドエラーが発生していたので原因と対策を記録しておく。

※バージョン等の情報は2015-08-19時点のものである。

事象

io.js@v3.0.0の環境で以下のようなビルドエラーが発生する。

/home/travis/.node-gyp/3.0.0/include/node/v8.h:336:1: error: expected unqualified-id before ‘using’
/home/travis/.node-gyp/3.0.0/include/node/v8.h:468:1: error: expected unqualified-id before ‘using’
/home/travis/.node-gyp/3.0.0/include/node/v8.h:499:48: error: ‘Handle’ does not name a type
/home/travis/.node-gyp/3.0.0/include/node/v8.h:499:48: error: ISO C++ forbids declaration of ‘parameter’ with no type [-fpermissive]
/home/travis/.node-gyp/3.0.0/include/node/v8.h:499:54: error: expected ‘,’ or ‘...’ before ‘<’ token
...

原因

Travis-CIのデフォルトのGCCが古い。

Travis-CI(Node向け)のGCCのバージョンは以下であった。

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

io.js@v3用のC++アドオンをコンパイルするためにはC++11に対応したコンパイラが必要であるが*1GCC 4.6.3はC++11に対応していないためエラーとなっていた。

対策

暫定対処として、io.js用のテスト環境ではビルド前にGCCのバージョンを4.8.xに上げることによりエラーを回避した。
以下が対処を行った.travis.ymlである。

language: "node_js"
node_js:
  - "0.8"
  - "0.10"
  - "0.12"
  - "iojs"
before_install:
  - if [ "$TRAVIS_NODE_VERSION" == "iojs" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
  - if [ "$TRAVIS_NODE_VERSION" == "iojs" ]; then sudo apt-get update -qq; fi
  - if [ "$TRAVIS_NODE_VERSION" == "iojs" ]; then sudo apt-get install -qq g++-4.8; fi
  - if [ "$TRAVIS_NODE_VERSION" == "iojs" ]; then export CXX="g++-4.8"; fi
追記

" container based infrastructure"(sudo:falseを指定)では上記の方法は使用できないが、以下の設定でできた。

language: "node_js"
node_js:
  - "0.8"
  - "0.10"
  - "0.12"
matrix:
  include:
    - node_js: "iojs"
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-4.8
      before_install:
          - export CXX="g++-4.8"
sudo: false

Redirecting…

*1:というかio.jsで使用するバージョンのV8がGCC >= 4.8を要求している