Safari 4 Betaをなんとかして共存させたい
ずいぶん前だけどSafari 4 Betaが公開された。
いろいろな機能が追加され動作も高速になっているけれど、英語版のみの提供だし、ベータ版なので通常は3を使ったり使わせたりしたい。でも、検証作業なんかは3と4の両方でやりたいので、なんとかして共存させたい。
共存の方法としては、4をインストールした上で3を単独起動するようにする方法と、その逆でインストールをせずに4を単独起動させる方法があるけれども、インストールが必要ない後者の方法でなんとかする。
システムに異常が発生する可能性があるので、以下自己責任で。なお、Mac OS X 10.5(Leopard)以外は未検証。
ファイルの取り出し
Safari 4 Betaのインストールディスクイメージをダウンロード。マウントするとインストーラ(Safari4.0BetaLeo.pkg)が出てくるので、適当な場所にコピー。
コピーしたインストーラからUnpkgとかでデータを取り出す。中身はこんな感じ。
ファイルのコピー
まずはデータ/Applications/Safari.app を適当な場所にコピーして、名前を Safari 4.app とかにしておく。
パッケージの中にフレームワークとライブラリをコピー。具体的にはデータ/System/Library/Frameworksの中身と、データ/System/Library/PrivateFrameworksの中身を、Safari 4.app/Contents/frameworksフォルダを作ってその中にコピー。同様にデータ/usr/libの中身を、Safari 4.app/Contents/libフォルダを作ってその中にコピー。libxml2.dylibはエイリアスなので作り直しておく。
ブートスクリプトの作成
コピーしたフレームワークとライブラリを参照するように、環境変数DYLD_FRAMEWORK_PATHとDYLD_LIBRARY_PATHをセットした状態でSafari 4.app/Contents/Safariが実行されるようにする。
環境変数をセットするにはInfo.plistにLSEnvironmentを作ればいいのだけれども、この方法だと絶対パスしか指定できないっぽい。できればSafari 4.app/Contents/Safariからの相対パスにしたいので、ブート用のシェルスクリプトで環境変数をセットするようにする。
まず、Safari 4.app/Contents/Safariの名前をSafari 4に変更。続いてSafari 4.app/Contents/Safariに以下みたいな内容のシェルスクリプトを置く。要実行権限。
#!/bin/sh APPROOT=${0}/../.. export DYLD_LIBRARY_PATH="$APPROOT/lib" export DYLD_FRAMEWORK_PATH="$APPROOT/frameworks" exec "$APPROOT/MacOS/Safari 4" "$@"
起動テスト
だいたい作業完了したので、Safari 4.appをダブルクリックして起動してみるが、エラー。
Referenced from: /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore
Expected in: /Users/***/Desktop/Safari 4/Safari4.0BetaLeo/Applications/Safari 4.app/Contents/MacOS/Safari/../../frameworks/JavaScriptCore.framework/Versions/A/JavaScriptCore
Safari 4.app/Contents/frameworks/WebKit.framework/Versions/A/FrameworksにあるWebCore.frameworkを、Safari 4.app/Contents/frameworksに移動してやればよさそう。
再度起動テストすると見事起動成功。