Mac OS X (El Capitan) 上で Windowsのバイナリをビルドする案件のために、MXE (M cross environment) でクロスコンパイル環境を構築したので、メモしておく。
準備
homebrewはインストール済みとする。MXEに必要なパッケージをインストールする。
brew install autoconf automake coreutils gdk-pixbuf gettext gnu-sed intltool libtool p7zip wget xz
keg-onlyのパッケージは手動でbrew link
する必要があるかもしれない。例えば、
brew link gettext
インストール
git clone https://github.com/mxe/mxe.git
このままmakeするとすべてのパッケージをビルドしてしまう。もしWindows 64bit用のgccのみが必要ならば、mxe/settings.mkを以下のように設定する。
MXE_TARGETS := x86_64-w64-mingw32.static
LOCAL_PKG_LIST := gcc
.DEFAULT local-pkg-list:
local-pkg-list: $(LOCAL_PKG_LIST)
Windows 32bitだったら、x86_64-w64-mingw32.staticの代わりにi686-w64-mingw32.staticとする。
そしてビルドする。
cd mxe
make
その他に必要なパッケージがあれば、
make boost
のような感じでビルドすることができる。
クロスコンパイル
コンパイラのPATHを設定する。
export PATH=/path/to/mxe/usr/bin:$PATH
configureを使ってビルドする場合には、
./configure --host=x86_64-w64-mingw32.static
make
でビルドできる。
よくあるエラー
他の環境だと起きないが、mingwだと起こるエラーがいくつかある。
undefined reference to `rpl_malloc'
とか言われてしまう場合には、
export ac_cv_func_realloc_0_nonnull=yes
export ac_cv_func_malloc_0_nonnull=yes
として configure からやり直しすれば良い。
テスト環境
出来上がったバイナリはwineで実行できる。homebrewなら
brew install wine winetricks
で一発インストールが可能。ただし、Mac OS Xでは32bitのバイナリしか実行できない。