JHBuild
- JHBuild 允许您构建和运行 GNOME 平台和应用程序,并在沙箱环境中构建所需的模块,隔离安装;因此无需在虚拟机中构建和运行 GNOME。
JHBuild 是一个工具,允许您自动下载和编译“模块”(即源代码包)。它可以从各种来源(CVS、Subversion、Git、Bazaar、tarballs 等)拉取模块并处理依赖项。您还可以选择要构建的特定模块,而不是构建整个项目。
JHBuild 最初是为构建 GNOME 而编写的,但后来扩展到可用于其他项目。
安装
配置
有两个配置文件:jhbuildAUR 软件包安装的默认配置文件,以及用户创建的用户特定配置文件。
默认情况下,JHBuild 使用已安装的配置文件。如果用户特定配置文件存在,则其配置将覆盖已安装配置文件的配置。
这些文件使用 Python 语法。有关更多信息,请参阅 JHBuild 手册。
默认配置文件
默认配置文件位于 /usr/lib/python3.9/site-packages/jhbuild/defaults.jhbuildrc
。它应该包含开始使用 JHBuild 所需的一切,因为它设置了 modulesets 目录、默认模块集、以及所有使用它的模块的 autogen/meson/cmake 参数。
当前设置的一些默认值
- moduleset =
gnome-apps-latest
- modules =
meta-gnome-core
- 下载的 tarball 目录 =
$XDG_CACHE_HOME/jhbuild/downloads
- buildroot =
$XDG_CACHE_HOME/jhbuild/build
如果您认为找到了应该设置的 Arch 特定的设置,请随时在 jhbuildAUR 的评论中提出建议。如果不是 Arch 特定的,请考虑在 上游提交问题。
用户特定配置文件
此配置文件位于 $XDG_CONFIG_HOME/jhbuildrc
(例如 ~/.config/jhbuildrc
)。它是可选的,默认情况下不存在,并且会覆盖默认 JHBuild 配置文件中设置的值。
它非常有用,例如,设置不同的模块集,或添加编译器标志来调试并尝试修复构建失败系统。
请参阅 /usr/share/jhbuild/examples/
中的示例。
示例配置
本节显示了可以在任何配置文件中设置的键/值对的非详尽列表。
- 使用本地模块集文件而不是再次下载它,使其可以更改文件中的某些内容并对其进行测试
use_local_modulesets = True modulesets_dir = "~/.cache/jhbuild/"
- 启用最广泛的模块集,并强制将 GTK3 用于默认使用 GTK2 的模块
moduleset = ['gnome-world'] autogenargs = '--with-gtk3'
- 或者您可能想要为 autotools 启用文档构建,即使它会减慢模块编译速度
autogenargs = '--enable-gtk-doc'
- 或者您想要来自 make 命令的一些调试输出
makeargs = 'V=1'
- 或者您发现某个模块需要特定的 automake 选项(WebKit 已经过修补,实际上不需要此选项)
module_autogenargs['WebKit'] = 'PYTHON=/usr/bin/python2'
- 或者您想要禁用使用 meson 构建系统的模块的文档构建
module_mesonargs['gstreamer'] = '-Ddisable_gtkdoc=true'
用法
本主题提供了一些关于如何使用某些 JHBuild 命令的信息和示例,但无意穷尽该主题。有关每个 JHBuild 命令的详细信息,请参阅 JHBuild 手册,从每个命令的帮助输出中学习,甚至阅读 JHBuild 的源代码。
JHBuild 提供了通用的 --help
,其中列出了所有可用的命令,以及每个子命令的帮助消息,例如 jhbuild sysdeps --help
。
检查和安装先决条件
sysdeps 可用于获取已安装的依赖项和应安装的依赖项的详细列表。为了获取此信息,只需运行
$ jhbuild sysdeps
要安装缺少的依赖项,请运行使用 --install
参数
$ jhbuild sysdeps --install
对于上述命令无法安装的依赖项,请考虑从官方存储库或 AUR 安装相应的软件包。
更新模块
可以简单地更新模块的源代码而不构建它们,从而可以在不必等待获取源代码的情况下再次构建。有三种简单更新模块的方法
update,不带任何参数,将更新配置文件中模块集/模块集中可用的所有模块
$ jhbuild update
update,带有一个或多个模块作为参数,将更新命名模块所依赖的所有模块。例如
$ jhbuild update gedit
updateone,带有一个或多个模块,将仅更新指定的模块。例如
$ jhbuild updateonly gedit
构建模块
此操作将运行整个构建过程:它将更新源代码(除非已经是最新版本)、配置和构建,并将其安装在正确的目录中。
就像 update 一样,JHBuild 中有三种构建模块的方法
build,不带任何参数,将构建配置文件中模块集/模块集中可用的所有模块
$ jhbuild build
build,带有一个或多个模块作为参数,将构建命名模块所依赖的所有模块。例如
$ jhbuild build gedit
buildone,带有一个或多个模块,将仅构建指定的模块。例如
$ jhbuild buildone gedit
运行模块
在 JHBuild 中成功安装应用程序后,使用 run 启动您刚刚构建的模块。例如
$ jhbuild run gedit
创建依赖关系图
JHBuild 可以输出图形内容,这些内容可以通过管道传输到 graphviz 中,以便生成例如 PNG 或 PostScript 文件。
要生成例如 gedit 的 PNG 文件,请运行
$ jhbuild dot gedit | dot -Tpng > dependencies.png
故障排除
Python 问题
依赖于 python2AUR 的模块可能无法构建,因为软件通常期望 python 2.x 的二进制文件名是 /usr/bin/python
,而 python 3.x 的二进制文件名是 /usr/bin/python3
,但 Arch Linux 的情况并非如此:python 2.x 是 /usr/bin/python2
,而 python 3.x 是 /usr/bin/python
。
对于这种情况,请使用以下一种或多种方法强制模块运行 /usr/bin/python2
- 在
~/.config/jhbuildrc
中为此特定模块设置带有PYTHON=/usr/bin/python2
的module_autoargs
,如上面的配置部分所述 — 这将使用变量 PYTHON 的此值运行 autogen.sh 或 configure
- 如果 configure 或 Makefile 不解析 PYTHON 变量,一种方法是手动查找 configure/Makefile 中运行 python 二进制文件的所有行,并将 python 重命名为 python2 — 这将在模块的源代码中硬编码 python2。
- 如果只有上述解决方法仍然对您不起作用,请考虑编辑模块的 .py 文件,以便在第一行匹配
#!/usr/bin/env python
或#!/usr/bin/python
时将python
替换为python2
- 当您擦除目录并再次检出(下载)它时,所有手动应用于源代码的编辑和补丁都将丢失,因此它不是一个永久的解决方案
- 如果模块的 configure/build 过程错误地使用了 PYTHON 变量,或者根本没有使用,请考虑将其报告给模块的上游和/或为 JHBuild 上游提供补丁
pkg-config 问题
如果您的 PKG_CONFIG_PATH 上有格式错误的 .pc 文件,JHBuild 将无法检测到您已安装的所有(有效).pc 文件,并且会抱怨 .pc 文件丢失。查看 jhbuild sysdeps
的输出 — 应该有关于有问题的 .pc 文件的消息。
由于 meson 版本不兼容导致构建失败
您可能会遇到类似于以下消息之一的消息。
Meson encountered an error: Build directory has been generated with Meson version 0.40.0, which is incompatible with current version 0.40.1. Please delete this build directory AND create a new one. FAILED: build.ninja '/usr/bin/python3' '/home/foobar/jhbuild/install/bin/meson' --internal regenerate '/home/foobar/jhbuild/checkout/gst-plugins-base' '/home/foobar/.cache/jhbuild/build/gst-plugins-base' --backend ninja ninja: error: rebuilding 'build.ninja': subcommand failed
在上面的示例中,模块在某个时间点使用 meson 0.40.0 配置,但现在安装了更新的版本(示例中为 0.40.1),并且与旧版本不兼容。
解决方案: 再次运行配置阶段,以便使用较新的 Meson 版本配置此模块
由于找不到 GCC 库或对象导致构建失败
您可能会遇到类似于以下消息之一的消息。
cc: error: /usr/lib/gcc/x86_64-pc-linux-gnu/gcc_version/../../../../lib/name.so: No such file or directory
或
g++: error: /usr/lib/gcc/x86_64-pc-linux-gnu/gcc_version/../../../../lib/name.o: No such file or directory
其中 gcc_version 是比当前版本旧的 GCC 版本,name 是未能找到的库 (.so) 或对象 (.o) 的名称。
如果 gcc 已更新,并且该软件先前已使用旧版本的 gcc 配置和构建,则可能会发生这种情况。
解决方案: 再次运行 Configure 阶段,以便使用较新的 GCC 版本配置此模块
gst-plugin-bad 在缺少 vulkan 头文件时失败
在构建 gst-plugins-bad 模块时,您可能会遇到许多类似于以下消息的消息
In file included from ext/vulkan/gstvulkan-plugins-enumtypes.c:8: ../../../../jhbuild/checkout/gst-plugins-bad/ext/vulkan/vkviewconvert.h:26:10: fatal error: gst/vulkan/vulkan.h: No such file or directory 26
这意味着 gst-plugin-bad 已自动设置为构建其 vulkan 扩展,但未找到所需的所有依赖项。在撰写本小节时,ext/vulkan/meson.build 查找 shaderc 提供的二进制文件 glslc,多个软件包直接或间接依赖于它。删除 shaderc 会解决此错误,但如果您想保留依赖于它的那些软件包之一,这可能不是一个选项。
解决方案: 编辑您的 jhbuild 用户配置文件以禁用 vulkan 扩展
~/.config/jhbuildrc
module_mesonargs['gst-plugins-bad'] = '-D vulkan=disabled'
并再次运行配置阶段,以便成功构建 gst-plugins-bad 模块。
缺少库且没有已知的构建规则
当构建使用 meson 构建系统的模块时,您可能会遇到这样的问题
*** Checking out module_name *** [67/218] some omitted checkout output *** Building module_name *** [67/218] ninja ninja: error: 'path/to/missing_library.so', needed by 'path/to/module_file', missing and no known rule to make it *** Error during the phase build of module_name: ########## Error running ninja *** [67/218]
发生这种情况是因为该模块先前已在此模块的另一个提交中配置和构建,并且在那次,它被配置为依赖项 path/to/missing_library.so
的先前版本。由于文件 path/to/module_file
已配置为并期望该丢失的库可用,因此它失败了。
解决方案:只需为配置阶段运行选项 7 以重新配置模块并再次构建它。
从头开始构建 JHBuild
如果您不想使用 jhbuildAUR 软件包,而是想自己从头开始构建 JHBuild,则应注意以下几点。
- 确保安装 JHBuild 及其目标模块所需的所有依赖项。请参阅 Arch Linux 的依赖项列表;
- JHBuild 本身过去依赖于 Python 版本 2,但它已迁移到 python 3,因此没有关于 python 版本的特定配置;
- 某些模块可能仍依赖于 python2。请务必阅读 #Python 问题 部分;
- 有关下载和构建 JHBuild 源代码的详细信息,请查看 GNOME wiki 上的 JHBuild “操作指南”。