构建 GLib

构建 GLib

GLib 使用 Meson 构建系统。因此,编译和安装 GLib 库的正常顺序为

$ meson setup _build
$ meson compile -C _build
$ meson install -C _build

在 FreeBSD 上,您将需要更复杂的一些东西

$ env CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib -Wl,--disable-new-dtags" \
> meson setup \
> -Dxattr=false \
> -Dinstalled_tests=true \
> -Db_lundef=false \
> _build
$ meson compile -C _build

Meson 提供的标准选项可传递给 meson 命令。请参阅 Meson 文档或运行

meson configure --help

以了解标准选项的信息。

GLib 使用禁用 严格别名进行编译。强烈建议不要通过覆盖编译器标志重新启用,因为尚未使用严格别名测试 GLib,也不能保证

依赖关系

在编译 GLib 库之前,需要在系统中安装各种其他工具和库。如果您是从发行版存档中构建,则需要 兼容的 C 工具链、Meson 和 pkg-config;从 GLib 的 Git 存储库克隆中构建时要求相同。

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

GLib 的 UNIX 构建要求系统至少实现 POSIX 的原始 1990 年版本。除此之外,它还依赖于许多其他库。

  • 如果您的系统没有 iconv() 函数来执行字符编码之间的转换,则需要 GNU libiconv 库 来构建 GLib。大多数现代系统都应该有 iconv(),但许多较旧的系统没有 iconv() 实现。在这样的系统上,您必须安装 libiconv 库。这可在以下位置找到:http://www.gnu.org/software/libiconv。

如果您的系统有一个 iconv() 实现,但您想使用 libiconv,请确保它安装到默认编译器头文件/库搜索路径中(例如,/usr/local/ 中)。libiconv 安装的 iconv.h 隐藏了系统 iconv。然后 Meson 检测到,系统 iconv 无法使用,外部 iconv 是必需的,并自动强制使用它。

如果您不使用 libiconv 而是在 Solaris 上使用本机 iconv 实现,您需要确保已安装区域设置编码与 UTF -8 之间的转换器。至少您需要 SUNWuiu8 包。您可能还应该安装 SUNWciu8、SUNWhiu8、SUNWjiu8 和 SUNWkiu8 包。

Compaq Tru64 上的本机 iconv 不包含对 UTF -8 的支持,因此您需要使用 GNU libiconv。 (在将 GNU libiconv 用于 GLib 时,您需要同时将 GNU libiconv 用于 GNU gettext。)这可能也适用于相关操作系统。

  • 需要 Python 3.5 或更高版本。您的系统 Python 必须符合 PEP 394 对于 FreeBSD,这意味着必须安装 lang/python3 端口。

  • 如果您的系统没有用于处理消息翻译数据库的 gettext() 功能,则需要来自 GNU gettext 软件包的 libintl 库。

  • 需要线程实现。GLib 中的线程支持可基于 POSIX 线程或 win32 线程。

  • GRegex 使用 PCRE 进行正则表达式匹配。使用的是 PCRE 的系统版本,除非它不可用(在 Android 中就是这样),在这种情况下将使用后备子项目。

  • GIO 中可选的扩展属性支持需要 C 库或独立的 libattr 库提供的 getxattr() 系列函数。要构建不带扩展属性支持的 GLib,请使用 -Dxattr=false 选项。

  • GIO 中可选的 SELinux 支持需要 libselinux。要构建不带 SELinux 支持的 GLib,请使用 -Dselinux=disabled 选项。

  • 可选的 DTrace 支持需要 sys/sdt.h 头文件,这是 SystemTap 在 Linux 上提供的。要构建不带 DTrace 的 GLib,请使用 -Ddtrace=false 选项。

  • 可以使用 -Dsystemtap=false 选项禁用对 SystemTap 的可选支持。此外,您可以使用 -Dtapset_install_dir=DIR 选项控制 GLib 安装 SystemTap 探测的位置。

  • gobject-introspection 是生成供其他项目使用的 introspection 数据,并通过 gi-docgen 生成 GLib 文档所必需的。GLib 和 gobject-introspection 之间存在依赖关系循环。这可以通过先使用 -Dintrospection=disabled 构建 GLib,然后针对此 GLib 副本构建 gobject-introspection,然后使用 -Dintrospection=enabled 针对新的 gobject-introspection 重新构建 GLib 来打破这种关系。如果同时设置了 -Ddocumentation=true,则可以在这个第二构建过程中构建 GLib API 文档。

额外的配置选项

除了正常选项之外,在配置 GLib 库时还支持这些附加选项

--buildtype
这是一个标准 Meson 选项,指定要启用多少调试和优化。如果构建类型为 debug,则 G_ENABLE_DEBUG 将被定义,并且 GLib 将在启用了其他调试代码的情况下构建。您可以使用 -Dglib_debug 覆盖此行为。
-Dforce_posix_threads=true
通常,Meson 应该能够解决使用正确的线程实现问题。此选项强制使用 POSIX 线程,即使平台提供了另一个线程 API(例如,在 Windows 中)。
-Dbsymbolic_functions=false-Dbsymbolic_functions=true
默认情况下,GLib 使用 -Bsymbolic-functions 链接器标记来避免库内 PLT 跳跃。此操作的副作用是不再能够使用 LD_PRELOAD 覆盖 GLib 函数的内部使用。因此,在某些情况下关闭此功能可能是合理的。-Dbsymbolic_functions=false 选项允许执行此操作。
-Ddocumentation=false-Ddocumentation=true
默认情况下,GLib 不会为库和工具构建文档。此选项可用于启用构建文档。
-Dman-pages=disabled-Dman-pages=enabled
默认情况下,GLib 会检测是否安装了 rst2man 和必要的 DocBook 样式表。如果安装了它们,那么它将使用它们从 reStructuredText 源构建包含的手册页。这些选项可用于明确控制是否构建和使用手册页。
-Dxattr=false-Dxattr=true
默认情况下,GLib 将检测 getxattr() 函数序列是否可用。如果可用,则在 GIO 中将包含扩展属性支持。这些选项可用于明确控制是应包含还是不应包含扩展属性支持。 getxattr() 及其相关函数可由 glibc 或独立的 libattr 库提供。
-Dselinux=auto-Dselinux=enabled-Dselinux=disabled
默认情况下,GLib 将检测 libselinux 是否可用,以及在可用时在 GIO 中包含 SELinux 支持。这些选项可用于明确控制是应包含还是不应包含 SELinux 支持。
-Ddtrace=false-Ddtrace=true
默认情况下,GLib 将检测 DTrace 支持是否可用,并使用该支持。这些选项可用于明确控制是应在 GLib 中编译 DTrace 支持还是不应编译该支持。
-Dsystemtap=false-Dsystemtap=true
此选项需要 DTrace 支持。如果 DTrace 支持可用,则 GLib 还会检查 SystemTap 是否存在。
-Db_coverage=true-Db_coverage=false
为 GLib 测试启用生成覆盖率报告。这需要来自 Linux 测试项目的 lcov frontend 至 gcov。要生成覆盖率报告,请使用 ninja coverage-html。报告放置在 meson-logs 目录中。