建立 OSX 套件

Meson 本身不支援建置 OSX 套件,但它提供了您自行建立所需的所有工具。原因在於,要撰寫一個適用於所有不同方法的系統是一項非常困難的任務,但針對每個應用程式撰寫簡單的腳本卻非常容易。

此範例程式碼可在 Meson 手動測試套件中找到。

建立應用程式套件

OSX 應用程式套件實際上非常簡單。它們只是一個特定格式的檔案目錄。您需要知道的所有詳細資訊都在這個頁面上,強烈建議您先閱讀它。

假設我們正在將我們的應用程式套件建立到 /tmp/myapp.app。假設我們有一個可執行檔,因此我們需要將其安裝到 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 檔案和一個圖示。對於這些,我們需要以下兩個 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')

安裝腳本會執行兩件事。首先,它會將整個框架複製到我們的套件中。

$ 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 安裝程式放在一起,不同的人會以不同的方式執行。連結的範例程式碼透過使用兩個不同的腳本來執行。這將產生安裝程式的不同部分分成邏輯部分。

install_script.sh 僅處理嵌入相依性並修復函式庫路徑。

build_osx_installer.sh 使用適當的路徑設定建置、編譯、安裝並產生 .dmg 套件。

這裡的主要原因是,為了從原始碼建立完整的 OSX 安裝程式套件,您需要做的就是 cd 到原始碼樹狀結構中並執行 ./build_osx_installer.sh。要在其他平台上建立套件,您將會編寫諸如 build_windows_installer.bat 之類的腳本等等。

搜尋結果為