QEMU を Mac OS 10.6 にインストールする

(2016.2.6.)

 QEMU 2.4.1 を Mac OS 10.6 にインストールしてみた。2016年2月の時点で、10.6 はすでにサポート終了、過去の遺物だけど、引っかかったところを記録しておけば、何かの役に立つかも。

1. gcc-4.7.1

 qemu を普通に configure しようとすると、こんな風に怒られる。

 新しめの gcc が必要。以前にインストールした gcc-4.7.1 を、objc, obj-c++ を有効にして再インストール。

2. pkg-config

 qemu のビルドを再トライ。

 pkg-config が必要。

 --with-internal-glib をつければいいのか。

 CoreFoundation (CF****) と Carbon (FSFindFolder) をリンクしないといけない模様。

 できた。

3. glib2

 qemu のビルドを再トライ。

 glib2gthread が必要。このへんから後は、/usr/local がごちゃごちゃにならないように、/Applications/QEMU 内にインストールする。(後から考えると、あまり利口な選択ではなかった。/usr/local/ 内で良かった。)

 glib-2.47.5.tar.xz を取得 (http://ftp.gnome.org/pub/gnome/sources/glib/2.47/)。tar.xz ファイルは TheUnarchiver で解凍する。

4. gettext, libxml2

 glib2gettext に依存するので、こちらを先にインストールする。

 gettext-0.19.7.tar.gz を取得 (http://ftp.jaist.ac.jp/pub/GNU/gettext/)。

 libxml2 が必要らしい。

 libxml2-2.9.1 を取得 (http://xmlsoft.org/sources/)。

 できた。

 gettext やり直し。

 先ほどと同じエラーになった。libxml2 を認識してない。

 成功。

5. glib-2.39.2, libffi

 glib2 のビルド。

 やかましいわ。こっちにはこっちの事情があるんじゃい。

 調べてみると、glib-2.39.92 なら 10.9 以上の制約はない模様。

 libffi が必要らしい。

 libffi-3.0.13 を取得 (https://github.com/atgreen/libffi/releases) 。ftp でうまく接続できなかったので、https で取れる github の方からもらってきた。

 成功。

6. glib2 ビルド再挑戦

 glib2 のビルド再挑戦。

 ああ、libffi を見つけてないわ。PREFIX つけてインストールしたからだな。PKG_CONFIG_PATH を設定すればいい?

 今度は gettext か。Stack Overflow の記事を見ると、PATHPREFIX/bin を加えればいいらしい。env コマンドを使ってもいいけど、PATH に入れてしまっても大丈夫そうだから、入れちゃえ。

 あれーだめじゃん。なんでや。config.log 見ると、libintl.h を見つけられなかったらしい。っつうことなら、これでどうだ。

 よし通った。make 行くぞ。

 うわ、何これ? エラーが起きているのは gio/gdummyfile.c の中だが、どう見てもおかしいようには見えない。ネットで探してみると、homebrew の人が議論していた。gio の中で、全部のファイルを Objective-C と見なしてコンパイルしているのが原因らしい。それ雑すぎやろ。

 対処法:gnextstepsettingsbackend.cgnextstepsettingsbackend.m に変更し、Makefile.inMakefile.am 中の gnextstepsettingsbackend.c をすべて gnextstepsettingsbackend.m に変更する。また、Makefile.am の 520 行にある libgio_2_0_la_CFLAGS += -xobjective-c の行頭に # をつけてコメントアウト。

 configure からやり直し。

 うぬー automake 更新しないとだめか。なるべくこれは避けたかったが。

7. autoconf, automake, m4

 autoconf-2.69, automake-1.15, m4-1.4.17/usr/local 以下にインストール。これは普通に ./configure; make && sudo make install で問題なくできた。

 もっかい configure からやり直し。

 えー同じバージョンでないといかんの? なんじゃそれ。これだから automake は嫌いなんや。

 automake-1.13 を入れ直して再トライ。

 ぐぬー、configure 自体作り直しですか。

configure.ac の 114 行目に AC_PROG_OBJC を追加。

 おおー通った。これで最大の難関突破かな。

8. qemu

 qemu ビルド行きます。

 うーん、また autoconf 関連か。autoconf, automake, m4, libtool--prefix=/Applications/QEMU でインストールし直して、もう一度トライ。

 なんだかよくわからないエラーになったぞ。1つ前のバージョンでやってみるか。

 同じだな。何か根本的に問題がある? こんな記事があった。pkg.m4 が読まれていないようだ。なるほど。pkg.m4PREFIX/share/aclocal/pkg.m4 にある。aclocal のサーチパスを設定してみる?

 やっぱり同じエラーが出る。手動で automake してみる?

 さっきのところは通過できたみたい。何だったんだろう?

 今度は別のエラーが発生。

 リンクエラーだな。configure の出力をよく見ると、obj-C コンパイラとして clang を使うことになっている。これが原因か?

 やっぱりだめ。同じエラーが出る。調べてみると、こんな書き込みを見つけた。そもそも Makefile が間違っているらしい。なんでそんなのが放置されてるんかな。pixman/test/Makefile に次のように書き込む(行末に utils.$(OBJEXT) を追加)

 やってみる。

 そうか、Apple 製でない gcc では obj-c 2.0 はコンパイルできないのか。objc だけ他のコンパイラにするのはたぶん無理だと思う。cocoa.m をざっと見た感じでは、obj-c 2.0 の機能を使っているのはここだけっぽい。また、そもそもこの行に問題あり。

 beginSheetModalForWindow:completionHandler: は Mac OS 10.9 以上でないと動作しない。#if で 10.6 以上の場合のみコンパイルするようになっているが、無理でしょ。

 905行の MAC_OS_X_VERSION_10_6MAC_OS_X_VERSION_10_10 に変更。さらに、#else の中にもエラーがあったので、下の行 (913行) の filetypessupportedImageFileTypes に変更。

 この変更で、ここのコンパイルは通るようになった。

 さらに謎のエラーが発生。

 vtable 云々のエラーは C++ のランタイム関係らしい。--cxx=gcc がいかんのか? --cxx=g++ でどうだ。

 ついに通った! やった!

 qemu-* というバイナリが PREFIX/bin の中にできる。Mac のアプリケーションバンドルではなく、コマンドラインから立ち上げたらウィンドウが開くタイプ。リンクしているライブラリは、/usr/lib の中のものを除くと以下の通り。

 実行ファイルに含まれるライブラリのパス名を変えるには install_name_tool を使う。@executable_path を使えば実行ファイルがあるディレクトリからの相対パスで書ける。今のレイアウトだと dylib がごちゃごちゃになっているので、例えば /Applications/QEMU/lib に全部まとめるのがいいかも。

9. おまけ

 Raspberry Pi のエミュレーション実行方法。

 立ち上がったぞ。やったあ。

 残念ながら、このままでは耐えられないぐらい遅いです。いろいろチューニングが必要なのだと思う。なお、CUI タイプの jessie-lite は素のままでも使える速度だった。

10. おまけ2

次のようにすると、Mac 側から ssh で QEMU の中の Raspbian に接続できる(最後に -redir tcp:10022:22 を追加)。

Raspbian が立ち上がったら、Mac のターミナルで別ウィンドウを開いて、次のようにすると、ssh 接続できる。