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に対応したコンパイラが必要であるが*1、GCC 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