MacOSXでアプリバンドルを作成するには、EasyとUglyの2つの方法があります。
簡単な方法は、XCodeを使用することです。完了。
問題は時々あなたができないことです。
私の場合、他のアプリを構築するアプリを構築しています。ユーザーがXCodeをインストールしているとは思いません。また、MacPortsを使用して、アプリが依存するライブラリを構築しています。配布する前に、これらのdylibがアプリにバンドルされていることを確認する必要があります。
免責事項:私はこの投稿を書く資格がまったくありません。すべてがAppleのドキュメントから集められており、既存のアプリと試行錯誤を分解しています。それは私にとってはうまくいきますが、おそらく間違っています。訂正があれば私にメールしてください。
最初に知っておくべきことは、アプリバンドルは単なるディレクトリであるということです。
架空のfoo.appの構造を調べてみましょう。
foo.app/
内容/
Info.plist
マックOS/
foo
リソース/
foo.icns
Info.plistはプレーンなXMLファイルです。テキストエディタまたはXCodeにバンドルされているプロパティリストエディタアプリを使用して編集できます。(/ Developer / Applications / Utilities /ディレクトリにあります)。
含める必要がある重要なものは次のとおりです。
CFBundleName-アプリの名前。
CFBundleIcon -Contents / Resourcesディレクトリにあると想定されるアイコンファイル。IconComposerアプリを使用してアイコンを作成します。(これは/ Developer / Applications / Utilities /ディレクトリにもあります)pngをウィンドウにドラッグアンドドロップするだけで、ミップレベルが自動的に生成されます。
CFBundleExecutable -Contents / MacOS /サブフォルダーにあると想定される実行可能ファイルの名前。
他にもたくさんのオプションがありますが、上記のオプションは最低限のものにすぎません。Info.plist
ファイルと
AppBundleの構造に関するAppleのドキュメントを次に示し
ます。
また、これがサンプルのInfo.plistです。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE plist PUBLIC "-// Apple Computer // DTD PLIST 1.0 // EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version = "1.0">
<辞書>
<key> CFBundleGetInfoString </ key>
<string> Foo </ string>
<key> CFBundleExecutable </ key>
<string> foo </ string>
<key> CFBundleIdentifier </ key>
<string> com.your-company-name.www </ string>
<key> CFBundleName </ key>
<string> foo </ string>
<key> CFBundleIconFile </ key>
<string> foo.icns </ string>
<key> CFBundleShortVersionString </ key>
<string> 0.01 </ string>
<key> CFBundleInfoDictionaryVersion </ key>
<string> 6.0 </ string>
<key> CFBundlePackageType </ key>
<string> APPL </ string>
<key> IFMajorVersion </ key>
<integer> 0 </ integer>
<key> IFMinorVersion </ key>
<integer> 1 </ integer>
</ dict>
</ plist>
完璧な世界では、実行可能ファイルをContents / MacOS / dirにドロップするだけで完了できます。ただし、アプリに非標準のdylib依存関係がある場合は、機能しません。Windowsと同様に、MacOSには独自の特別な種類のDLLHellが付属しています。
MacPortsを
使用してリンク先のライブラリを構築している場合、dylibの場所は実行可能ファイルにハードコードされます。dylibがまったく同じ場所にあるマシンでアプリを実行すると、正常に実行されます。ただし、ほとんどのユーザーはそれらをインストールしません。彼らがあなたのアプリをダブルクリックすると、それはただクラッシュするでしょう。
実行可能ファイルを配布する前に、実行可能ファイルがロードするすべてのdylibを収集し、アプリバンドルにコピーする必要があります。また、実行可能ファイルを編集して、正しい場所でdylibを検索するようにする必要があります。つまり、それらをコピーした場所です。
実行可能ファイルを手作業で編集するのは危険ですね。幸いなことに、役立つコマンドラインツールがあります。
otool-L実行可能ファイル名
このコマンドは、アプリが依存するすべてのdylibを一覧表示します。System / Libraryフォルダーまたはusr / libフォルダーにないものがある場合は、それらをアプリバンドルにコピーする必要があります。それらを/ Contents / MacOS /フォルダーにコピーします。次に、新しいdylibを使用するように実行可能ファイルを編集する必要があります。
まず、-headerpad_max_install_namesフラグを使用してリンクしていることを確認する必要があります。これにより、新しいdylibパスが前のパスよりも長い場合、そのための余地があることが保証されます。
次に、install_name_toolを使用して各dylibパスを変更します。
install_name_tool-既存の_path_to_dylibを変更@executable_path /blah.dylib実行可能ファイル名
実際の例として、アプリがlibSDLを使用し、otoolがその場所を「/opt/local/lib/libSDL-1.2.0.dylib」としてリストしているとします。
まず、アプリバンドルにコピーします。
cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/
次に、実行可能ファイルを編集して新しい場所を使用します(注:-headerpad_max_install_namesフラグを使用してビルドしたことを確認してください)
install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @ executeable_path / libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo
ふぅ、ほぼ完了です。現在の作業ディレクトリに小さな問題があります。
アプリを起動すると、現在のディレクトリは、アプリケーションが配置されている場所の上のディレクトリになります。次に例を示します。foo.appを/ Applcationsフォルダーに配置すると、アプリを起動したときの現在のディレクトリは/ Applicationsフォルダーになります。ご想像のとおり、/ Applications / foo.app / Contents / MacOS /ではありません。
これを考慮してアプリを変更することも、現在のディレクトリを変更してアプリを起動するこの魔法の小さなランチャースクリプトを使用することもできます。
#!/ bin / bash
cd "$ {0%/ *}"
./foo
CFBundleExecutableが前の実行可能ファイルではなく起動スクリプトを指す
ように、Info.plistファイルを調整してください。
はい、すべて完了しました。幸いなことに、これらすべてを理解したら、ビルドスクリプトに埋め込みます。