ククログ

株式会社クリアコード > ククログ > Debian GNU/LinuxでWindows用バイナリをビルドする方法

Debian GNU/LinuxでWindows用バイナリをビルドする方法

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 installDESTDIR変数を指定して一時的な場所にインストールしてからアーカイブするとよいでしょう。

% 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用バイナリもビルドできてリリース作業が楽になりますね。