2011/10/13時点でのDebian GNU/Linux sidでの話です。
Debian GNU/Linux上では、KVMやXenなどの仮想マシンを使わなくてもDeiban GNU/LinuxやUbuntu用のパッケージのビルドをできますし、CentOSやFedora用のパッケージのビルドもできます。Windows用のバイナリもDebian GNU/Linux上でビルドできると1台のマシンですべてのパッケージをビルドできるのでgroongaのようにたくさんの環境向けのパッケージを用意する場合に便利です。
以前、Rubyではrake-compilerを使ってWindows用のバイナリ入りgemをビルドできることを紹介しましたが、ここで紹介するのはrake-compilerが中で何をしているかについてです。rake-compilerがやっていることがわかると、rake-compilerなしでも同じことができるため、Rubyの拡張ライブラリ以外でもDebian GNU/Linux上でWindows用バイナリをビルドできるようになります。
用意するもの
Debian GNU/Linux上でWindows用バイナリをビルドするためにはクロスコンパイラする必要があります。そのために、x86(32bit版Windows)にもx64(64bit版Windows)にも対応したMinGW-w64を使います。MinGW-w64はGCCでWindows用バイナリをビルドするために必要なヘッダーファイルやライブラリなど一式を提供します。
mingw-w64パッケージをインストールしてMinGW-w64環境を作ります。
% sudo aptitude -V -D -y install mingw-w64
準備はこれで完了です。
クロスコンパイルしやすいソフトウェア
./configure; make; make install
でビルドするGNUビルドシステムを使っているソフトウェアはクロスコンパイルしやすいです。これは、configure
内にクロスコンパイル用の処理が含まれているからです。
ここでは、GNUビルドシステムを使っているgroongaを使って、どのようにビルドするかを紹介します。ソースコードをダウンロードして展開しておきましょう。
% wget http://packages.groonga.org/source/groonga/groonga-1.2.6.tar.gz
% tar xvzf groonga-1.2.6.tar.gz
% cd groonga-1.2.6
ビルド
クロスコンパイルするときに一番大事なのがconfigure
のところです。むしろ、configure
をうまくやれたら後はmake; make install
するだけなので違いはconfigure
だけになるべきです。
configure
を実行するときのポイントは--host
オプションです。ここにビルド対象のプラットフォームを指定します。x64用にビルドするときは以下のように--host=x86_64-w64-mingw32
を指定します。
% ./configure --host=x86_64-w64-mingw32
もし、システムにlibmecab-devパッケージがあるとLinux用のMeCabが使われてしまいます。libglib2.0-devパッケージも同様です。そのような場合は、以下のようにconfigure
で自動検出している部分を無効にしてください。
% ./configure --host=x86_64-w64-mingw32 --without-mecab --disable-benchmark
configure
が成功したらいつも通りmake
します。
% make
パッケージを作るときはmake install
にDESTDIR
変数を指定して一時的な場所にインストールしてからアーカイブするとよいでしょう。
% make install DESTDIR=/tmp/groonga
% cd /tmp/groonga/
% mv usr/local groonga-1.2.6
% zip -r groonga-1.2.6.zip groonga-1.2.6
簡単ですね。
なお、x86用にビルドする場合は--host=i686-w64-mingw32
を指定してください。
システムにインストールされているMinGWを確認する(つまり、--host
に指定できる値を調べる)には以下のようにします。
% (cd /usr; echo *mingw*)
i686-w64-mingw32/ x86_64-w64-mingw32/
この場合は--host=i686-w64-mingw32
または--host=x86_64-w64-mingw32
を指定できます。
まとめ
groongaを例にしてDebian GNU/Linux上でWindows用のバイナリをビルドする方法を紹介しました。これで、Debian GNU/Linux上でDebianパッケージもRPMもWindows用バイナリもビルドできてリリース作業が楽になりますね。