JHBuild
- JHBuild 允许您在沙箱环境中构建和运行 GNOME 平台和应用程序,构建所需的模块,隔离安装;因此,无需在虚拟机中构建和运行 GNOME。
JHBuild 是一个工具,允许您自动下载和编译“模块”(即源代码包)。它可以从各种来源(CVS、Subversion、Git、Bazaar、tarballs 等)拉取模块并处理依赖项。您还可以选择要构建的特定模块,而不是构建整个项目。
JHBuild 最初是为构建 GNOME 而编写的,但后来已扩展为可用于其他项目。
安装
安装 jhbuildAUR 包。
配置
有两个配置文件:由 jhbuildAUR 包安装的 默认配置文件,以及用户创建的 用户特定配置文件。
默认情况下,JHBuild 使用已安装的配置文件。如果用户特定配置文件存在,则其配置将被用户特定配置文件中的配置覆盖。
这些使用 Python 语法。有关更多信息,请参阅 JHBuild 手册。
默认配置文件
默认配置文件位于 /usr/lib/python3.9/site-packages/jhbuild/defaults.jhbuildrc。它应包含您开始使用 JHBuild 所需的一切,因为它设置了模块集目录、默认模块集、适用于所有使用它的模块的 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中为该特定模块设置module_autoargs,并指定PYTHON=/usr/bin/python2,如上面的配置部分所述 — 这将使用此值运行 autogen.sh 或 configure 变量 PYTHON
- 如果 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),它与旧版本不兼容。
解决方案:再次运行 Configure 阶段,以便使用更新的 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'
然后再次运行 Configure 阶段,以便 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 issues 部分;
- 有关下载和构建 JHBuild 源代码的详细信息,请查看 GNOME wiki 上的 JHBuild "How Do I"。