构建 GTK [源代码]

在我们深入研究如何编译 GTK 的详细信息之前,我们应该提到在很多情况下,将为你的操作系统预先构建的 GTK 的二进制包可用,无论是从你的操作系统供应商还是从独立的来源。如果提供了这样的软件包组,则安装它将使你比自己构建更快的使用 GTK 进行编程。实际上,你可能已经在你的系统上安装了 GTK

为了构建 GTK,你需要在你的系统上安装了 meson。在 Linux 和其他类 UNIX 操作系统上,你还需要 ninja。本指南不介绍如何安装这两个要求,但你可以参考 Meson 网站 了解更多信息。Ninja 构建工具也适用于各种操作系统,因此我们将在示例中参考它。

如果你从源代码发布或 Git 克隆构建 GTK,则需要使用 meson 配置项目。最常用的参数是 --prefix,它确定一旦安装后文件的位置。要在 /opt/gtk 这样的前缀下安装 GTK,你可以以这种方式运行 Meson:

meson setup --prefix /opt/gtk builddir

Meson 会创建 builddir 目录并把所有构建制品放到那里。

你可以通过运行 meson configure 来获取构建的所有可用选项的列表。

在 Meson 成功配置构建目录后,你可以使用 Ninja 运行构建,

cd builddir
meson compile
meson install

如果你没有权限在安装到的目录中写入,则你可能需要在运行 meson install 之前暂时切换为 root。

在运行 meson 之前设置一些环境变量很有用。CPPFLAGS 包含要传递给 C 编译器的选项,用于告诉编译器在何处查找包含文件。LDFLAGS 变量以类似的方式用于链接器。最后,PKG_CONFIG_PATH 环境变量包含 pkg-config(见下文)在使用不同的库查找描述如何编译程序的文件时使用的搜索路径。如果你正在将 GTK 及其依赖安装到 /opt/gtk 中,你可能希望将这些变量设置为:

CPPFLAGS="-I/opt/gtk/include"
LDFLAGS="-L/opt/gtk/lib"
PKG_CONFIG_PATH="/opt/gtk/lib/pkgconfig"
export CPPFLAGS LDFLAGS PKG_CONFIG_PATH

你可能还需要设置 LD_LIBRARY_PATH 环境变量,以便系统动态链接器可以找到新安装的库,以及 PATH 环境程序,以便找到由各个库安装的实用程序二进制文件。

LD_LIBRARY_PATH="/opt/gtk/lib"
PATH="/opt/gtk/bin:$PATH"
export LD_LIBRARY_PATH PATH

构建类型

Meson 有不同的构建类型,由 buildtype 配置选项指定。GTK 根据在调用 meson 来配置构建时所用的构建类型来启用和禁用功能。

调试构建

GTK 将在 debugdebugoptimized 构建类型中启用调试代码路径。将 buildtype 设为 debug 的构建还将在工具包的内部状态上启用一致性检查。

在开发 GTK 本身时,建议使用 debugdebugoptimized 构建类型。另外,建议对 GTK 进行 debug 构建,用于对 GTK 应用程序进行分析和调试,因为它们包括对内部状态的额外验证。

如果没有在调用 meson 时指定构建类型,则 debugoptimized 构建类型是 GTK 的默认构建类型。

发布构建

release 构建类型会禁用调试代码路径和额外的运行时安全功能,例如对对象实例进行 checked 转换。

Meson 提供的 plain 构建类型仅应在打包 GTK 时使用,并且预计打包人员会在构建 GTK 时提供自己的编译器标志。有关可用于定义编译器和链接器标志的环境变量的列表,请参阅上一部分。请注意,使用 plain 构建类型时,您还负责使用 -DG_ENABLE_DEBUG-DG_DISABLE_CAST_CHECKS 控制 GTK 的调试功能。

依赖

在编译 GTK 之前,您需要在系统上安装各种其他工具和库。GTK 的依赖具有自己的构建系统,因此您需要参考它们自己的安装说明。

GTK 用于查找其依赖项的一个特别重要的工具是 pkg-config

pkg-config 是一款工具,用于跟踪 GTK 库所用库所需的编译标志。(对于每个库,都会在标准位置安装一个小的 .pc 文本文件,其中包含该库所需的编译标志以及版本号信息。)

GTK 依赖的部分库由 GTK 团队维护:GLib、GdkPixbuf、Pango 和 GObject Introspection。其他库是单独维护的。

  • GLib 库提供核心非图形化功能,例如高级数据类型、Unicode 处理以及 C 程序的对象和类型系统。它可从 此处 获取。
  • GdkPixbuf 库提供加载各种文件格式图像的功能。它可从 此处 获取。
  • Pango 库用于处理国际化文本。它可从 此处 获取。
  • GObject Introspection 是一个框架,用于向语言绑定提供反省数据。它可从 此处 获取。
  • 如果您的系统没有用于在字符编码间进行转换的 iconv() 函数,则需要 GNU libiconv 库来构建 GLib。大多数现代系统应具有 iconv()。
  • 如果您的系统没有用于处理消息翻译数据库的 gettext() 功能,则需要来自 GNU gettext 程序包的 libintl 库。
  • 构建 Pango 和 GTK 需要 X 窗口系统的库。您应已经在系统上安装了这些库,但您可能需要安装操作系统供应商提供的这些库的开发环境。
  • fontconfig 库为 Pango 提供了一种标准方式来查找字体并将其与字体名称匹配。
  • Cairo 是一家图形库,支持矢量图形和图像合成。Pango 和 GTK 都使用 Cairo 进行绘图。请注意,我们还需要辅助的 cairo-gobject 库。
  • libepoxy 是一款用于抽取不同 OpenGL 库之间差异的程序库。 GTK 使用这款程序库实现跨平台 GL 支持和其自身的绘图。
  • Graphene 是一款提供 2D 和 3D 转换的矢量和矩阵类型的程序库。 GTK 在内部使用这款程序库进行绘图。
  • 构建带有 Wayland 后端的 GTK 需要 Wayland 库。
  • shared-mime-info 程序包不是 GTK 的硬性依赖项,但其中包含 GIO(间接包含 GTK)使用的 MIME 类型定义。gdk-pixbuf 将使用 GIO 检测 MIME 类型(如果可能)。为此,shared-mime-info 需要安装且 XDG_DATA_DIRS 在配置期间需要相应设置。否则,gdk-pixbuf 将重新启用其内置 MIME 类型检测。

构建和测试 GTK

先确保已安装必需的外部依赖项:pkg-config、Meson、Ninja、JPEGPNGTIFF 库、FreeType,如果需要,libiconv 和 libintl。要了解有关构建这些程序包的详细信息,请参阅各程序包提供的文档。在任何普通的 Linux 系统上,您很可能已经安装所有这些程序包,或者可以通过操作系统程序包存储库轻松获取这些程序包。

然后按顺序构建并安装 GTK 库:GLib、Cairo、Pango,然后是 GTK。对于每个库,请按照他们提供的说明操作,并确保它们和 GTK 构建之间共享通用设置;例如,如果您为 GTK 正在使用单独的前缀,您将需要为所构建的所有依赖项使用相同的前缀。如果您走运,这一切都将顺利进行,您将准备好 开始编译您自己的 GTK 应用程序。您可以通过运行 GTK 安装的 gtk4-demo 程序测试您的 GTK 安装。

如果您正在配置或构建的项目之一失败,请仔细查看打印的错误消息;这些消息通常会提供出了什么问题的有用信息。每个构建系统都有自己的日志,可以帮助您了解您遇到的问题。如果所有方法均失败,您可以在 GTK 论坛上寻求帮助。

其他配置选项

除了 Meson 提供的常规选项之外,GTK 定义了用于修改应构建内容的各种参数。所有这些选项都作为 -Doption=value 传递给 meson。多数时候,值可以是 truefalse,也可以是 enableddisabledauto

要查看所有受支持选项及其允许值,请运行

meson configure builddir

x11-backendwin32-backendbroadway-backendwayland-backendmacos-backend

启用 GDK 的特定后端。如果未提供这些选项,如果平台是 Linux,则默认为 Wayland 后端;如果平台是 Windows,则也默认为 X11 后端,否则平台是 macOS,则默认为 macOS。如果任何后端显式启用或禁用,则不会自动启用任何其他平台。

vulkan

默认情况下,GTK 会尝试除了 cairo 和 OpenGL 之外,构建带有对 Vulkan图形 API 支持的项目。此选项用于显示控制是否应使用 Vulkan。

media-gstreamer

默认情况下,GTK 将尝试构建用于媒体播放支持的 gstreamer 后端。这些选项可用于明确控制应构建哪些媒体后端。

默认情况下,GTK 将尝试构建 cups 和文件打印后端(如果找到其依赖项)。这些选项可用于明确控制应构建哪些打印后端。

cloudproviders

此选项控制 GTK 是否应使用 libcloudproviders 在文件多选器中支持各种云存储 API。

sysprof

此选项控制 GTK 是否应包括对 sysprof 跟踪的支持。

tracker

此选项控制 GTK 是否应将 Tracker 用于文件多选器中的搜索支持。

colord

此选项控制 GTK 是否应在 cups 打印后端中使用 colord 的色彩校准支持。

accesskit

此选项控制 GTK 是否应包含 AccessKit 无障碍后端。此后端支持 Windows 和 macOS。它需要 accesskit-c 绑定。

documentationman-pagesscreenshots

gi-docgen 包用于生成 GTK 附带的参考文档。默认情况下,禁用对 gi-docgen 的支持,因为它需要安装各种额外的依赖项。由于文档是从内省数据中生成的,因此需要启用内省。

introspection

允许禁用构建内省支持。此选项主要用于缩短开发人员系统上的周转时间。已安装的 GTK 版本始终应该具有内省支持。

build-testsuite

如果您想运行测试套件以确保您的 GTK 构建正常工作,则应该使用此选项启用它。

build-testsbuild-examplesbuild-demos

默认情况下,GTK 将构建一些测试、示例和演示。虽然这些在开发人员系统上很有用,但在为 flatpak 运行时构建 GTK 时不需要它们。这些选项允许禁用构建测试和演示。