gyp でネイティブコードプロジェクトのビルドを多環境に対応させる

今回は「gyp でネイティブコードプロジェクトのビルドを多環境に対応させる」です。私がやっていることをメモしておきます。

背景

私は Windows のコードをよく書いていました。ある時から Android、Windows Mobile、Linux、Mac OS X、iOS でも動くように意識して書くようになりました。すぐに、コードをビルドするための各種設定ファイルを用意するのが面倒になりました。Visual Studio、Xcode、Makefile、Android NDK 用 Makefile・・・やっていられませんね。

ビルドツール巡り・・・cmake、scons、waf、そして gyp へ

ビルド設定ファイルを自動生成するためのビルドツールを探してみるとすぐにいくつか出てきました。半年ほど cmake と scons を並行運用していましたが、その中で気に入らない点が出てきました。

  1. ビルドはできるが Visual Studio、Xcode などのプロジェクトファイルが生成できない
    1. scons、waf などはこれ
  2. Visual Studio、Xcode のプロジェクトファイルが生成できるが中身がイマイチ
    1. cmake では、include ディレクトリがなぜか絶対パスだったりした
  3. プロジェクト間の設定の共有がイマイチ
    1. Android NDK の export の概念に相当するものがあったりなかったり
  4. Android NDK に対応していない
    1. 当時は cmake、scons、waf どれも対応してませんでした

この辺をすべてうまく対応してくれたのが、gyp*1 です。gyp は Google Chrome をはじめとした Google 製クライアントプログラムを中心に利用実績があります*2。Google 日本語入力のベースである mozc なんかもそうですね。node.js*3、その中で動いている v8*4、libuv なんかも gyp でビルドされるようになっています。ただし、gyp のスクリプトはPython 2.4 だと動かない*5ので、Cent OS など Python 2.4 が既定の環境では地味に辛いのですが、手でビルド設定ファイルを書くことに比べればささいな問題です。

gyp をプロジェクトに配置する

gyp はただの Python スクリプト群です。New BSD ライセンスなので、自分のプロジェクトに組み込んでしまうのが楽かもしれません。私の場合は、node.js を参考に以下のようにして運用しています。

  1. $PROJECT_ROOT/tools/gyp
    1. gyp 一式を配置する
  2. $PROJECT_ROOT/build/common.gypi
    1. 各プロジェクトの共通設定を書く
      1. Visual Studio のプロジェクト設定、Xcode のプロジェクト設定など
  3. $PROJECT_ROOT/configure.py
    1. gyp を呼び出してプロジェクトファイルを生成するスクリプトを書く
  4. $PROJECT_ROOT/README.md
    1. ビルド手順を書く

Android NDK 向けのテコ入れ

gyp が生成した Android NDK 用の Makefile でビルドすると、やたらと長いファイル名になってしまうので、私は以下のファイルを一部修正してファイル名が短くなるようにしています。

  1. $PROJECT_ROOT/tools/gyp/pylib/gyp/generator/android.py
    1. ComputeAndroidModule で return self.target するようにしている

まとめ

この記事には具体例がありませんが、Github の node.js のコードが何よりも雄弁です。

*1:https://code.google.com/p/gyp/

*2:gyp は Google Chrome などを他環境でビルドするための作られたもので、以前は scons でビルドされていました

*3:以前は waf でビルドされていました

*4:以前は scons でビルドされていました

*5:with など新しい構文を使っているため