OSXパッケージの作成
Mesonは、OSXパッケージのビルドをネイティブにサポートしていませんが、自分で作成するために必要なすべてのツールを提供しています。これは、さまざまな方法をすべて提供するシステムを記述することが非常に困難であるためですが、各アプリケーションに対して単純なスクリプトを作成することは非常に簡単であるためです。
このサンプルコードは、Mesonのマニュアルテストスイートにあります。
アプリバンドルの作成
OSXアプリバンドルは、実際には非常にシンプルです。特定の形式のファイルのディレクトリにすぎません。知っておく必要のあるすべての詳細はこのページにあり、最初に読むことを強くお勧めします。
/tmp/myapp.app
にアプリバンドルを作成すると仮定しましょう。実行可能ファイルが1つあると仮定して、それをContents/MacOS
にインストールする必要があります。実行可能ファイルをこのように定義する場合
executable('myapp', 'foo1.c', ..., install : true)
次に、このコマンドでビルドツリーを初期化する必要があります
$ meson --prefix=/tmp/myapp.app \
--bindir=Contents/MacOS \
builddir \
<other flags you might need>
これで、meson install
を実行すると、バンドルは適切にステージングされます。リソースファイルまたはデータがある場合は、カスタムインストールコマンドを使用するか、Mesonコマンドに追加のインストールパスを指定して、それらをContents/Resources
にインストールする必要があります。
次に、Info.plist
ファイルとアイコンをインストールする必要があります。これらには、次の2つのMeson定義が必要です。
install_data('myapp.icns', install_dir : 'Contents/Resources')
install_data('Info.plist', install_dir : 'Contents')
Info.plist
の形式は、上記のリンクまたはサンプルプロジェクトにあります。icns
形式でアイコンを取得する最も簡単な方法は、画像をtiffとして保存し、XCodeに付属のtiff2icns
ヘルパーアプリケーションを使用することです。
一部のアプリケーションでは、アプリプロセスの作業ディレクトリは、バイナリ実行可能ファイルと同じであると想定しています。これに該当する場合は、次のようなラッパースクリプトを作成する必要があります。
#!/bin/bash
cd "${0%/*}"
./myapp
これをインストールします
install_data('myapp.sh', install_dir : 'Contents/MacOS')
そして、Info.plist
で実行する実行可能ファイルとしてmyapp.sh
を指定していることを確認してください。
外部ライブラリを使用していない場合は、これで完了です。これで、使用できる/tmp/myapp.app
に完全なアプリバンドルができました。
外部ライブラリ
ほとんどのアプリケーションは、サードパーティのフレームワークとライブラリを使用します。プロジェクトに該当する場合は、他の人のマシンで動作するように、それらをバンドルに追加する必要があります。
例として、SDL2フレームワークを使用します。アプリにバンドルするには、最初に実行するインストーラースクリプトを指定します。
meson.add_install_script('install_script.sh')
インストールスクリプトは2つのことを行います。まず、フレームワーク全体をバンドルにコピーします。
$ mkdir -p ${MESON_INSTALL_PREFIX}/Contents/Frameworks
$ cp -R /Library/Frameworks/SDL2.framework \
${MESON_INSTALL_PREFIX}/Contents/Frameworks
次に、実行可能ファイルのライブラリ検索パスを変更する必要があります。これにより、アプリに必要なライブラリがバンドル内にあることをOSXに通知します。SDL2の場合、呼び出しは次のようになります
$ install_name_tool -change @rpath/SDL2.framework/Versions/A/SDL2 \
@executable_path/../FrameWorks/SDL2.framework/Versions/A/SDL2 \
${MESON_INSTALL_PREFIX}/Contents/MacOS/myapp
これは、OSXアプリのバンドルで常に手動で行う必要がある部分です。OSXの依存関係にはさまざまな形状と形式があり、残念ながら、各依存関係をどのように処理する必要があるかを判断するための信頼できる自動的な方法はありません。フレームワークはFrameworks
ディレクトリに移動しますが、プレーンな.dylib
ファイルは通常Contents/Resources/lib
に移動します(ただし、好きな場所に配置できます)。これを完了するには、otool -L /path/to/binary
でプログラムが何に対してリンクしているかを確認し、コピーと修正の手順をインストールスクリプトに手動で追加する必要があります。ただし、システムライブラリをバンドル内にコピーしないでください。
この後、配布可能な完全に動作する自己完結型OSXアプリバンドルが完成します。
Qt
Qtは、macdeployqt
と呼ばれるデプロイツールを提供しており、Qtのライブラリをアプリケーションフォルダーにバンドルし、オプションで最終的な.dmg
インストーラーを作成します。
# cd into the folder that contains the `myapp.app` folder
macdeployqt myapp.app -executable=myapp.app/Contents/MacOS/myapp
これにより、必要なQtライブラリがmyapp.app
内の正しいサブフォルダーにコピーされます。-executable=myapp.app/Contents/MacOS/myapp
引数は、実行可能ファイルmyapp.app/Contents/MacOS/myapp
のQtライブラリの検索パスを自動的に変更するためのものです。-dmg
引数を渡して、更新されたmyapp.app
フォルダーから.dmg
インストーラーを作成することもできます。詳細については、ツールのドキュメントページを参照してください。
.dmgインストーラーの作成
.dmgインストーラーも同様に非常にシンプルで、そのコアでは基本的に凝った圧縮アーカイブです。詳細な説明はこのページにあります。それを読んで、その指示に従ってテンプレートイメージファイルを作成してください。
インストーラーを作成する実際のプロセスは非常に簡単です。テンプレートイメージをマウントし、アプリバンドルをその中にコピーして、マウントを解除し、イメージを圧縮アーカイブに変換します。これを行うための実際のコマンドは特に興味深いものではありません。上記のリンク先のページ、またはMesonのテストスイートのサンプルスクリプトから自由に盗んでください。
すべてをまとめる
.dmgインストーラーをまとめる方法はたくさんあり、人によって異なる方法で行われます。リンクされたサンプルコードでは、2つの異なるスクリプトを使用しています。これにより、インストーラーを生成するさまざまな部分が論理的な部分に分離されます。
install_script.sh
は、依存関係の埋め込みとライブラリパスの修正のみを処理します。
build_osx_installer.sh
は、適切なパスでビルドを設定し、コンパイル、インストール、.dmgパッケージを生成します。
ここでの主な理由は、ソースから完全なOSXインストーラーパッケージをビルドするには、ソースツリーにcdして./build_osx_installer.sh
を実行するだけでよいということです。他のプラットフォームでパッケージをビルドするには、build_windows_installer.bat
などのスクリプトを作成します。
検索結果は次のとおりです