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などのスクリプトを作成します。

検索結果は次のとおりです