创建 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 安装包,您需要做的就是进入源代码树并运行 ./build_osx_installer.sh。要构建其他平台上的包,您可以编写诸如 build_windows_installer.bat 等脚本。

搜索结果是