mattintosh note

Hello Raspberry Pi!

MacPorts の Wine で MikuInstaller は動くのか

また Wine ネタです。

現在でも主流の(?) MikuInstaller。今では iNSTANTWiNE なんて作ってますが自分も昔はお世話になりました。で、その MikuInstaller に含まれている Wine のアップグレードについてです。とあるブログで見かけた「MacPorts で Wine をインストールしたあとに Wine.bundle/SharedSupport にコピーすればいいよ」っていうのがちょっと気になったので試してみた。

MacPorts と併用して使うならシンボリックリンクでいいんじゃないのか?

そもそも MacPorts で Wine をインストールしているのにコピーする必要があるのか?と思った。例えば /Applications/MikuInstaller.app があるとして、MacPorts を使ってるなら

cd /Applications/MikuInstaller.app/Contents/Resources/Wine.bundle/Contents
rm -rf SharedFrameworks SharedSupport
ln -s /opt/local SharedFrameworks
ln -s /opt/local SharedSupport

で、こうした方が楽だと思う。

MikuInstaller

Wine.bundle/Contents の中の SharedSupportSharedFrameworksMacPorts で言えば /opt/local 以下の内容なので名前を変えてリダイレクトするだけで済む。こうしておけば MacPorts で Wine を更新しても MikuInstaller にも反映される(同じもの使っているんだから当たり前だけど)。

MacPorts/opt/local/bin/wineDYLD_FALLBACK_LIBRARY_PATH を追加しているだけのシェルスクリプトで Wine の実行プログラムは /opt/local/libexec/wine/wine。なので、この辺をちょっと書き換える必要があるかと思ったけどこれはしなくてもいいっぽいんだけど MacPorts のファイルをコピーした人って SharedSupport/bin/wine から /opt/local/libexec/wine/wine を呼び出していてコピーした意味ないんじゃないかなぁと思ったり。MikuInstaller のソースをちゃんと読んでないからわからんけど。

とりあえず新しい Wine で動くけどバンドル化の処理はライブラリが古いせいかエラーになるのでオフにしておいた方が良さげ。

コピーは可能か?

MacPorts でインストールしたパッケージの関連ファイルは port content [portname] で出力できる。これを cp しようとすると階層を維持するのが難しい(と思う)ので ditto コマンドがおすすめ。例えば wine-devel のファイルを階層を維持して /tmp 以下に複製する場合、

port content wine-devel | tail +2 | while read f; do
  ditto "$f" /tmp/"$f"
done

となる。ポート名は複数指定することも可能(その場合は各リストの先頭にメッセージが入るため何かしらの方法で取り除く必要がある)。あとは /tmp/opt/local 以下を Wine.bundle にコピーしていく。最初から SharedSupport に上書きしようとするならパスの接頭辞を変数に登録して置換展開を使うと楽。

prefix=/opt/local
SharedSupport=/Applications/MikuInstaller.app/Contents/Resources/Wine.bundle/Contents/SharedSupport
port content wine-devel | tail +2 | while read f; do
  ditto "$f" "${f/${prefix}/${SharedSupport}}"
done

SharedFrameworks には libpng、jpeg、tiff、lcms のライブラリが収録されていて、これらも上の方法で複製は可能。試してみたところ、同様の階層は維持できたものの、MacPorts 版の Wine は libX11 や libGL なども MacPorts でインストールされたものを使っているため、上記4つのライブラリだけでは足りない。多分、port deps wine-devel で表示されるポートをコピーすることになるけどものすごい容量になると思われる(大半は GStreamer のせいだろうけど)。他にも上に書いた /opt/local/libexec/wine/wine のこともあるので単純に MacPorts 版の Wine で置き換えるっていうのは難しいと思う。あと、wine-devel の Portfile を見てみるとソースビルドは @executable_path を使ってるっぽけど、バイナリビルドは @loader_path@rpath を使っているのでこれもまた問題になりそう(LIBRARY_PATH 系でどうにかるかもだけど)。

あと MIKUBUNDLE の変数を $TMPDIR あたりに書いているのか知らないけど非常に使いづらい…。「MikuInstaller が使えない!」って言ってるあいだに Homebrew なり MacPorts で Wine をインストールした方が早いと思う。

広告を非表示にする