跳转至内容

Meson 包裹指南

来自 ArchWiki
Arch 软件包指南

32 位CLRCMake交叉编译DKMSEclipse 插件Electron字体Free PascalGNOMEGoHaskellJavaKDE内核模块LispMesonMinGWNode.js非自由软件OCamlPerlPHPPythonRRubyRust - 安全ShellVCSWeb 应用Wine

来自 Meson 官方网站

Meson 是一个开源的构建系统,旨在兼顾极高的速度和更重要的用户友好性。

Meson 使用 Python 编写,支持多平台、多种编程语言、交叉编译等功能。

Meson 本身不直接构建软件,而是设置一个后端构建系统。虽然它通常与 ninja 一起使用,但也可以使用其他构建系统。它通常用于替代 GNU 构建系统

本文档涵盖了为使用 Meson 的软件编写 PKGBUILD 的标准和指南。

用法

需求

meson 必须包含在 PKGBUILDmakedepends 数组中。

makedepends=(meson other_deps)

prepare()

Meson 有一个用于管理子项目的实用工具,可以提前下载所有子项目。在 prepare() 阶段运行此命令,可以让 build() 和其他阶段完全离线执行。

示例

prepare() {
  meson subprojects download --sourcedir=source
}
注意 仅当项目包含可下载的子项目时才需要此步骤,如果这些子项目仅作为系统库的回退,则无需执行。

build()

配置和构建通常是 使用 meson 二进制文件完成的,但也可以通过 使用 Arch Linux 的 arch-meson 包装器脚本来完成。

mesonarch-meson 命令在其使用语法中都包含 **选项**、**源目录** 和 **构建目录**。

  • **选项**:至少必须包含 --prefix /usr,但请务必使用 meson setup --help 检查其他选项;另请参阅 设置特定于软件的构建选项
  • **源目录** (或 "sourcedir"):软件源代码存储的位置,例如 .$pkgname$pkgname-$pkgver
  • **构建目录** (或 "builddir"):Meson 将在此处存储构建文件;通常命名为 build_build,但这是可自由决定的。
注意 源目录是否在构建目录之前传递给 meson,反之亦然,这并不重要,因为 Meson 会知道哪个是哪个并正确设置环境。

直接使用 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() 步骤中使用的构建目录名称。

提示 可以在 meson test 中添加 --print-errorlogs 参数,以报告失败测试产生的输出以及其他有用信息,例如环境变量。

有关更多信息,请参阅 meson test --helpMeson 文档中的单元测试

package()

打包通常只需要运行 meson install,但请检查是否需要其他安装命令 (例如 非标准许可证)。使用与上面相同的构建目录,并设置 --destdir 标志

package() {
  meson install -C build --destdir "$pkgdir"
}
注意 添加 DESTDIR="$pkgdir" 也是 --destdir 的有效替代方法。[2]

故障排除

错误:函数不接受位置参数

错误输出示例

 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' 是现在无效的参数,应该被删除。有关上游应用的修复,请参阅 此提交

在这种情况下应采取的措施

  1. 修补错误报告中的 meson.build 文件以修复构建,并发布更新后的 PKGBUILD (如果是这种情况)。
  2. 向上游仓库贡献您的补丁,为所有人修复它,并避免在后续版本中将补丁放在 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”列表中的其他包。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.