Meson 软件包指南
32 位 – CLR – CMake – 交叉编译 – DKMS – Eclipse – Electron – 字体 – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由软件 – OCaml – Perl – PHP – Python – R – Ruby – Rust - 安全 – Shell – VCS – Web – Wine
来自 Meson 官方网站
- Meson 是一个开源构建系统,旨在做到极速,更重要的是,尽可能地用户友好。
Meson 使用 Python 编写,具有多平台支持、多种编程语言支持、交叉编译等特性。
Meson 不直接构建软件,而是设置后端构建系统。虽然它通常与 ninja 一起使用,但也可以使用其他构建系统。它通常用于替代 GNU 构建系统。
本文档涵盖了关于为使用 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 构建系统 使用的 ./configure
命令。
--prefix=/usr
命令行标志必须始终传递给 meson setup
,因为根据 Arch 软件包指南#软件包礼仪,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() 步骤中使用的相同构建目录名称。
--print-errorlogs
参数添加到 meson test
中,以便报告失败测试产生的输出以及其他有用信息,如环境变量。有关更多信息,请参阅 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(如果情况如此)
- 向 上游存储库 贡献您的补丁,以修复所有人的问题,并避免在后续版本中在源数组中包含补丁。
模板
为了总结以上说明并提供一个方便复制粘贴的要点,请参阅以下模板
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”列表中的其他软件包。