Meson 包裹指南
来自 Meson 官方网站
- Meson 是一个开源构建系统,旨在兼顾极快的速度和最重要的用户友好性。
Meson 使用 Python 编写,支持多平台、多种编程语言、交叉编译等。
Meson 不直接构建软件,而是设置一个后端构建系统。虽然它通常与 ninja 一起使用,但也可以使用其他构建系统。它常用于替代 GNU Build System。
本文档涵盖了为使用 Meson 的软件编写 PKGBUILD 的标准和指南。
用法
需求
meson 必须包含在 PKGBUILD 的 makedepends 数组中。
makedepends=(meson other_deps)
prepare()
Meson 有一个用于管理子项目的实用程序,可以提前下载所有子项目。在 prepare() 阶段运行此命令,可以使 build() 和其他阶段完全离线执行。
示例
prepare() {
meson subprojects download --sourcedir=source
}
build()
配置和构建通常是 通过使用 meson 二进制文件 完成的,但也可以通过 使用 Arch Linux 的 arch-meson 包装脚本 完成。
meson 和 arch-meson 命令都在用法语法中包含了 **选项**、**源目录** 和 **构建目录**。
- **选项**:必须至少包含
--prefix /usr,但请务必使用meson setup --help检查其他选项;另请参阅 软件特定的构建选项。 - **源目录**(或“sourcedir”):软件源代码存储的位置,例如
.、$pkgname或$pkgname-$pkgver。 - **构建目录**(或“builddir”):Meson 将构建文件存储在此处;通常命名为
build或_build,但这是可自行决定的。
直接使用 meson 二进制文件
此方法使用 meson setup,这类似于 GNU Build System 使用的 ./configure 命令。
根据 Arch 打包指南#打包礼仪,必须始终将 --prefix=/usr 命令行标志传递给 meson setup,因为 Arch Linux 包不得将文件安装到 /usr/local。如果明白自己在做什么,可以将 --buildtype=plain 内置选项设置为其他值。
示例
build() {
meson setup --prefix=/usr --buildtype=plain source build
meson compile -C build
}
meson compile 是一个支持的后端构建系统的包装器,目前默认为 ninja[1]
meson ... 默认等同于 meson setup ...,但是自 Meson 0.64 起,它会发出警告:Running the setup command as meson [options] instead of meson setup [options] is ambiguous and deprecated。使用 arch-meson 包装脚本
arch-meson 是 meson 包中包含的一个包装脚本,其优点是可以设置一些 Meson 的内置选项,这些选项很可能在 Arch 包中使用,从而为打包者节省了 PKGBUILD 中的时间和代码。引用 arch-meson 中的描述,它是一个“为 Arch Linux 打包高度定制的包装器”。
示例
build() {
arch-meson source build
meson compile -C build
}
设置软件特定的构建选项
虽然 Meson 包含一些 内置构建选项(例如 --prefix),但正在打包的软件可能还有其他 构建选项,打包者应予以考虑。如果存在有效的软件特定构建选项,通常可以在名为 meson.options(自 Meson 1.1 起支持)或 meson_options.txt 的文件中找到。在这些文件中查找 option(settings),然后阅读 settings。
要使用软件特定的构建选项,请使用 -D key=value 的表示法,其中 key 是项目中设置的构建选项名称,value 是一个有效值,例如 true。
例如,gtranslator 具有以下构建选项
meson_options.txt
option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')
因此,要构建其文档,必须运行 Meson 并附加 -D gtk_doc=true 构建选项,从而得到类似如下的命令行:
arch-meson $pkgname-$pkgver build -Dgtk_doc=true
check()
如果正在打包的软件提供了测试套件,请考虑在 PKGBUILD 的 check() 函数中运行它。这可以通过 meson test 命令来实现。
示例
check() {
meson test -C build
}
其中 build 是与上面 #build() 步骤中使用的构建目录名称相同的名称。
meson test 中添加 --print-errorlogs 参数,以便报告失败测试产生的输出以及其他有用的信息,例如环境变量。有关更多信息,请参阅 meson test --help 和 Meson 文档中的单元测试。
package()
打包通常只需要运行 meson install,但请检查是否需要其他安装命令(例如,不常见的许可证)。使用与上面相同的构建目录,并设置 --destdir 标志。
package() {
meson install -C build --destdir "$pkgdir"
}
故障排除
错误:函数不接受位置参数
错误输出示例
data/meson.build:21:5: ERROR: Function does not take positional arguments.
此错误自 Meson 0.60 起就存在,该版本将使用位置参数的行为从警告提升为错误。一个非常常见的例子是在 i18n.merge_file() 中添加无效参数。例如,aisleriot 曾有过
i18n.merge_file( 'sol.metainfo.xml', input: desktop_in, output: '@BASENAME@', type: 'desktop', po_dir: po_dir, install: true, install_dir: desktopdatadir, )
其中 'sol.metainfo.xml' 是现在无效的参数,应将其删除。有关上游已应用的修复,请参阅 此提交。
在这种情况下应采取的措施
- 修补错误报告的 meson.build 文件以修复构建,并在(如果是这种情况)发布更新的 PKGBUILD。
- 向上游存储库贡献您的补丁,为所有人修复它,并在下一版本中避免在 source 数组中包含补丁。
模板
为了总结以上说明并提供一个可复制粘贴的点,请参阅下面的模板。
makedepends=(meson)
build() {
arch-meson $pkgname-$pkgver build
meson compile -C build
}
check() {
meson test -C build --print-errorlogs
}
package() {
meson install -C build --destdir "$pkgdir"
}
示例包
这是一个使用 Meson 的软件包的简短列表。在 Meson 包页面上的“Required by”列表中可以看到其他软件包。