社内では共同編集ツールとして Gobby を使っているわけですが、今の案件では別会社の Mac ユーザと一緒に作業することになって。Gobby 0.5 系は Mac 用のバイナリが無いようなので、Mac OS 用にクロスコンパイルできないかなと調べていると、
という Linux 上で Windows や Mac OS 用のバイナリをビルドするためのクロスコンパイル環境構築ツールを見かけたので、とりあえずサンプル動かすところまでやってみました。
IMCROSS について
クロスコンパイル環境を構築するのは何かと面倒なわけですが、必要なバイナリやらヘッダファイルやらを ~/IMCROSS に集めてくれるツールです。いちおう GTK+ にも対応しているので Gobby のビルドに繋がるかなと期待もできます。
最終更新は 2009-04-26 と、ちょっと古いのが心配です。
使用 OS について
テスト結果 を見た感じだと Mac OS X でテストが通っているのは Fedora Core 5、Fedora 7、Fedora 8、OpenSUSE 10.3、(K)ubuntu 8.04 の 32 bit 版だけのようで。この中ではいくらか慣れている Ubuntu 8.04 を使おう、ということで
の VMware イメージをそのまんま使いました。
IMCROSS の make
make というと IMCROSS 自体をビルドするイメージがありそうですが、クロスコンパイル用のファイルをダウンロード&ビルドするための Makefile になっています。
各コマンドは sudo -s してから実行しています。
IMCROSS のダウンロード&展開
とりあえず /usr/local/src/IMCROSS に置くことにします。
cd /usr/local/src wget http://www.sandroid.org/imcross/IMCROSS-20090426.tar.gz tar xvzf IMCROSS-20090426.tar.gz
XCode の入手
Windows 用のバイナリを生成したい場合は不要ですが、Mac 用のバイナリをビルドするには XCode 中に含まれる SDK を入れておく必要があります。ここはライセンスの関係で自分で入手する必要があるようです。
Firefox 等で http://developer.apple.com/tools/download/ にアクセス&ユーザ登録(無料)して Xcode 3.2.6 and iOS SDK 4.3 をダウンロードします。動作確認がとれているバージョンは 3.1.2 らしいんですが、現在ではこれしかされていないようなので。
ファイルは 4.1 GB くらいあるのでちょっと容量が心配したんですが、この VMware イメージはディスクが 20 GB くらい用意されているので大丈夫でした。
以降の説明はダウンロードしたファイルを ~/xcode_3.2.6_and_ios_sdk_4.3.dmg に置いたものとして進めます。
XCode から SDK を抽出
dmg2img で .dmg を .img に変換後、マウントしてファイルを取り出す手順が紹介されていますが、Ubuntu 8.04 ではこの方法ではマウントできませんでした。後で出てくる gtk-osx の .dmg ファイルはマウントできたので、どうもパーティションが分かれている HFS+ のイメージがマウントできないようで。
参考までに、エラーメッセージはこんなでした。
mount: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or sodmesg にはこんなエラーが出ていました。
[ 8955.030018] hfs: unable to find HFS+ superblock
仕方がないので、HFS+ の読み書きは
で行うことにします。まず HFSExplorer をダウンロード。
cd /usr/local/src wget http://downloads.sourceforge.net/catacombae/hfsexplorer-0_21-bin.zip unzip -d hfsexplorer hfsexplorer-0_21-bin.zip
HFSExplorer を動作させるために Java が必要です。OpenJDK だと動作しなかった気がしたので Sun の Java を入れましたが、当初 update-java-alternatives を実行していなかったりしたので、その辺りが原因かもしれません。(参考: Ubuntu 8.10 で Sun-Java を標準にする - アーキテクト見習い日記)
aptitude install sun-java6-jdk update-java-alternatives -s java-6-sun
HFSExplorer を使ってファイルを取り出します。添付の .sh は相対パスで .jar ファイル等を指定しているので、.sh があるパスまで移動して実行する必要があります。
cd /usr/local/src/hfsexplorer ./unhfs.sh -o ~ -fsroot /Packages/MacOSX10.4.Universal.pkg ~/xcode_3.2.6_and_ios_sdk_4.3.dmg
GUI で取り出したい場合は
- ./runfsb.sh ~/xcode_3.2.6_and_ios_sdk_4.3.dmg のようにしてファイルを開く
- パーティションは "disk image" (Apple_HFS) を選択
- /Packages/MacOSX10.4.Universal.pkg を Extract
- symbolic link を辿るか聞かれますが、単独ファイルなのでたぶんどちらでも OK
というような手順で行えます。(最初は unhfs.sh の使い方がわからずにこの手順でやってました。)
ということで ~/MacOSX10.4.Universal.pkg が抽出されましたが、この .pkg からさらに SDK を取り出します。
aptitude install xar
で xar をインストールして、
cd ~ mkdir MacOSX10.4.Universal cd MacOSX10.4.Universal xar -xv -f ../MacOSX10.4.Universal.pkg
のようにして空ディレクトリに展開します。
展開された Payload ファイルをさらに展開して、取り出した SDK を .tar.bz2 として固めます。
zcat Payload | cpio -id tar --bzip2 -cf macosx-headers-10.4u-3.2.6.tar.bz2 SDKs/MacOSX10.4u.sdk
出来上がった .tar.bz2 を IMCROSS の make 用ディレクトリに移動しておきます。
mv macosx-headers-10.4u-3.2.6.tar.bz2 /usr/local/src/IMCROSS
環境変数の設定
クロスコンパイルに必要なファイルは ~/IMCROSS にインストールされますが、この中の bin を PATH に追加しておく必要があります。
export PATH=$PATH:/home/miau/IMCROSS/bin
また、Mac 用のバイナリを構築するには、
export LANG=C
も設定しておく必要があります。というのも、gcc のバージョンが 4 以降かのチェックを
if grep -c "gcc version [4-9]" $GCCINFO &>/dev/null
みたいな感じで行っているんですが、日本語環境だと
$ gcc -v (中略) gcc バージョン 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
必要なモジュールのインストール
もろもろのビルドで必要なモジュールを apt で入れます。
dmg2img の make に zlib.h、bzlib.h が必要だったのでまず以下のモジュールを入れました。結局 dmg2img は使いませんでしたが、移行のコンパイル時に使われているかもしれないので一応書いておきます。
aptitude install zlib1g-dev libbz2-dev libssl-dev
make するとまず「入っていない」と怒られるモジュールたちをインストールします。
aptitude install autoconf bison flex
Mac 用のビルドが有効にならなかったので、ためしに Objective C も入れました。(前述したように日本語環境が問題だったんですが。)このときに gcc もアップデートされました。
aptitude install gobjc
Mac のビルドが可能になると(?)依存モジュールに subversion が増えていたので、これも入れてしまいます。
aptitude install subversion
GTK+ のビルドを行えるようにするには以下も必要です。
aptitude install libgtk2.0-dev aptitude install pax
また、make の最中に
make: /home/miau/IMCROSS/i386-mingw32/bin/wx-config: コマンドが見つかりませんでした
のような警告が出て邪魔だったので、
aptitude install libwxbase2.8-dev
して wxWidgets 関係のファイルもインストールしました。ただこれをやると wxWidgets 用のクロスコンパイル環境もビルドされるので make にさらに時間かかります。
パッチの適用
make するとクロスコンパイルに必要なファイルを色々と集めてくるわけですが、ライブラリの配布バージョンが変わっていたり、配布されなくなっていたりするので、もろもろ変更しました。パッチを gist に置いています。
パッチを適用するには、
curl https://gist.github.com/raw/939000/efca27371a144fc090dc162adf7eb8575e7b5de1/imcross.diff | patch -p1
とすれば大丈夫です。たぶん。
変更内容は、
- XCode 3.2.6 で使えるように記述を変更
- ファイルで指定されているバージョンが配布されているなっているようであれば、配布されている一番古いバージョンに変更
- ただし zlib は 1.2.3 を 1.2.5 に変更すると make が通らないので、URL を 1.2.3 が配布されている sourceforge.net のほうに変更。このバージョンには脆弱性あるので一応注意。
- libpng については Contributed/Qt/Makefile.qt4 にもバージョンの記載があったけど、Qt 使ってないのでとりあえず放置
- それ以外もところどころディレクトリやファイル名が変更していたので対応
- libiconv は配布元が変更されているので URL を変更
- dirent は最新版が見つからなかったけど、mingw-runtime に添付されるようになったとのこと(参考: GcLでMGWx/GxCRgh/BXEnv/ライブラリのインストール - |▽ ̄)ノ なページ再帰 - livedoor Wiki(ウィキ))なのでコメントアウトして対応
- gtk-osx の .dmg は配布されなくなっているので、mokoi ってプロジェクトで使っている .dmg ファイルを利用する形に変更
という感じです。
ちなみに、Makefile.default-settings を変更せずに Makefile.override-settings に変更点のみを書くのが行儀がいいみたいですが、変更点がわかりやすいように直接書き換えてしまっています。配布されていないバージョンの情報を残しても意味ないですしね。
あと make を走らせると、配布ファイルに含まれる Samples/wxWidgets-2.8/Makefile、SetupLog.txt、empty.o、gtk_setups も変更されます。Git とかで管理するときに面倒だから、この辺は配布ファイルに入れないでほしいなぁ。
IMCROSS の make
ようやく make の準備が整ったので make できます。
make
必要なライブラリ等をがんばってビルドするので、これだけで 2〜3 時間時間かかってしまいます。wxWidgets がなければもう少し速く終わると思います。
サンプルの make
make samples
すれば作られるはずですが・・・wxWidgets まわりでエラーになるので、個別にコンパイルします。
コマンドラインのサンプル(Linux、Windows、Mac)をビルドするには、
make -f Makefile.samples sample_CommandLine sample_CommandLine.exe sample_CommandLine_macosx_fat
GTK+ のサンプル(Linux、Windows、Mac)をビルドするには、
make -f Makefile.samples sample_gtk sample_gtk_dynamic.exe sample_gtk_macosx_i386 sample_gtk_installer.exe
という感じです。
いちおう各 OS で動作を確認してみます。
Windows XP(32 bit)
こちらも 2 つのサンプルはあっさり動作しました。
インストーラのサンプルについては、インストールはうまくいくのですが、起動すると
libpng14-14.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。
というエラーになってしまいました。libcairo-2.dll が libpng14-14.dll を利用する前提になっているけど、実際に配置されている DLL は libpng_1.2.37-1_win32.zip に含まれる libpng12-0.dll で・・・という感じでバージョンの組み合わせが悪そうです。CAIRO のバージョンを 1.8.6-1 から 1.8.8-4 に変えた関係かもしれません。
Mac OS X 10.5.4
GTK-OSX が入っていない状態で GTK+ のサンプルを動作させると、
dyld: Library not loaded: /Library/Frameworks/Gtk.framework/Gtk
のようなエラーになってしまうので、http://sourceforge.jp/projects/sfnet_mokoi/downloads/Third%20Party/Gtk-Framework-2.14-LATEST.dmg/ から Gtk-Framework-2.14-LATEST.dmg をダウンロード→インストールしました。
この状態でサンプルを動かすと、ちゃんと動作しました。
使ってみた感想とか
たぶん 2009 年時点ではちゃんと動いていたんでしょうけど、今動かそうとするとライブラリが配布されなくなっていたり、配布 URL が変わっていたりでちょっと大変でした。
Gobby のビルドがもともとの目的だったわけですが、IMCROSS で用意されていないライブラリを使おうとすると、IMCROSS/Contributed にそれぞれの OS 用の設定を配置する必要があるようで。ふつうにクロスコンパイル用の環境を整えるよりも大変なことになりそうなので、複数のツールをビルドする人でないとメリットは得られにくいかもしれません。
今の案件では共同編集ツールとして EtherPad を使う流れになって Mac 用の Gobby ビルドは特にがんばらなくてよくなりましたし、私はしばらくは触らないと思います。Gobby の対応言語を増やすときに Windows 用に自前でビルドしたいというのはありますし、Mac のひとと Gobby を使いたくなる機会もあるかもしれないので、もしかしたら将来また触るかも、くらいです。


