受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

17.4. 使用 Meson 构建和安装 #

17.4.1. 简短版本 #

meson setup build --prefix=/usr/local/pgsql
cd build
ninja
su
ninja install
adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test

较长版本见本其余部分。

17.4.2. 安装过程 #

  1. 配置

    安装过程的第一步,是针对你的系统配置构建树,并选择你需要的选项。 要创建并配置构建目录,可以从 meson setup 命令开始:

    meson setup build
    

    setup 命令接受 builddirsrcdir 两个参数。如果未给出 srcdir,Meson 会根据当前目录以及 meson.build 的位置推导出 srcdirbuilddir 是必需的。

    运行 meson setup 会加载构建配置文件并设置构建目录。 此外,你也可以向 Meson 传递多个构建选项。后续章节会介绍一些常用选项。例如:

    # configure with a different installation prefix
    meson setup build --prefix=/home/user/pg-install
    
    # configure to generate a debug build
    meson setup build --buildtype=debug
    
    # configure to build with OpenSSL support
    meson setup build -Dssl=openssl
    

    设置构建目录是一次性步骤。如果要在新的构建前重新配置,只需使用 meson configure 命令:

    meson configure -Dcassert=true
    

    meson configure 的常用命令行选项见 Section 17.4.3

  2. 构建

    默认情况下,Meson 使用 Ninja 作为构建工具。 要使用 Meson 从源代码构建 PostgreSQL, 只需在构建目录中运行 ninja 命令:

    ninja
    

    Ninja 会自动检测你的计算机 CPU 数量,并据此并行执行。 你也可以用命令行参数 -j 覆盖并行进程数。

    需要注意的是,在最初的配置步骤之后,ninja 就是你编译时 唯一需要输入的命令。不管你如何修改源码树(只要不是把它移动到全新的位置), Meson 都会检测变化并相应重新生成自己。如果你有多个构建目录,这一点尤其方便。 通常其中一个用于开发(调试构建),而另一些只在偶尔需要时使用 (比如 静态分析构建)。任何配置都只需切换到对应目录, 然后运行 Ninja 即可完成构建。

    如果你希望使用 ninja 之外的后端进行构建,可以在配置时使用 --backend 选项进行选择,然后通过 meson compile 来构建。要进一步了解这些后端, 以及你可以传给 ninja 的其他参数,可参考 Meson 文档

  3. 回归测试

    如果你希望在安装之前测试新构建的服务器,可以在此时运行回归测试。 回归测试是一套测试,用来验证 PostgreSQL 是否按开发者预期的方式在你的机器上运行。输入:

    meson test
    

    (这不能以 root 身份运行;请使用非特权用户。) 关于如何解释测试结果的详细信息,见 Chapter 31。 在以后的任何时候,你都可以再次执行同样的命令来重复此测试。

    如果要针对正在运行的 postgres 实例运行 pg_regress 和 pg_isolation_regress 测试,请向 meson test 传入参数 --setup running

  4. 安装文件

    Note

    如果你是在升级已有系统,请务必阅读 Section 18.6,其中包含关于升级集簇的说明。

    PostgreSQL 构建完成后,只需运行 ninja install 命令即可安装:

    ninja install
    

    这会把文件安装到 Step 1 中指定的目录。 请确保你有权限写入该区域。你可能需要以 root 身份执行这一步。 另一种做法是预先创建目标目录,并安排授予适当权限。 标准安装会提供客户端应用开发以及服务器端程序开发所需的全部头文件, 例如用 C 编写的自定义函数或数据类型。

    在大多数情况下,ninja install 都能正常工作; 但如果你希望使用更多选项(例如 --quiet 以抑制额外输出), 也可以改用 meson install。关于 meson install 及其选项的更多信息,请参见 Meson 文档。

卸载:.  要撤销安装,可以使用 ninja uninstall 命令。

清理:.  安装完成后,可以通过 ninja clean 命令从源码树中删除 已构建文件,以释放磁盘空间。

17.4.3. meson setup 选项 #

下面解释 meson setup 的命令行选项。 这个列表并不完整(可使用 meson configure --help 获取完整列表)。此处未涉及的选项主要用于高级用例,并记录在标准 Meson 文档中。这些参数也可用于 meson setup

17.4.3.1. 安装位置 #

这些选项控制 ninja install(或 meson install)将文件安装到哪里。 --prefix 选项(示例见 Section 17.4.1) 对大多数情况来说已经足够。如果你有特殊需求,可以使用本节中描述的其他选项 定制安装子目录。但请注意,更改不同子目录之间的相对位置可能会使安装变得 不可重定位,也就是安装后无法再移动。(mandoc 的位置不受这一限制影响。) 对于可重定位安装,你可能希望使用稍后介绍的 -Drpath=false 选项。

--prefix=PREFIX #

把所有文件安装到目录 PREFIX 下, 而不是安装到 /usr/local/pgsql (类 Unix 系统)或 当前驱动器盘符:/usr/local/pgsql (Windows)下。实际文件会安装到各个子目录中;不会有任何文件直接安装到 PREFIX 目录中。

--bindir=DIRECTORY #

指定可执行程序的目录。默认是 PREFIX/bin

--sysconfdir=DIRECTORY #

设置各种配置文件的目录,默认是 PREFIX/etc

--libdir=DIRECTORY #

设置安装库和动态可加载模块的位置。默认是 PREFIX/lib

--includedir=DIRECTORY #

设置安装 C 和 C++ 头文件的目录。默认是 PREFIX/include

--datadir=DIRECTORY #

设置已安装程序使用的只读数据文件目录。默认是 PREFIX/share。 注意,这与数据库文件实际存放的位置无关。

--localedir=DIRECTORY #

设置安装区域设置数据的目录,尤其是消息翻译目录文件。 默认是 DATADIR/locale

--mandir=DIRECTORY #

PostgreSQL 附带的手册页将安装到这个目录下 各自对应的 manx 子目录中。默认是 DATADIR/man

Note

为了能把 PostgreSQL 安装到共享安装位置 (例如 /usr/local/include),同时又不干扰系统其他部分的 名字空间,我们做了特别处理。首先,除非完整展开后的目录名已经包含字符串 postgrespgsql,否则会自动把字符串 /postgresql 追加到 datadirsysconfdirdocdir 上。例如,如果你选择 /usr/local 作为前缀,那么文档会安装到 /usr/local/doc/postgresql;但如果前缀是 /opt/postgres,那么它会安装到 /opt/postgres/doc。客户端接口的公共 C 头文件 会安装到 includedir 中,并且不会污染名字空间。 内部头文件和服务器头文件则会安装到 includedir 下的私有目录中。关于如何访问这些头文件,请参见各接口自己的文档。 最后,如果有需要,也会在 libdir 下创建私有子目录, 用于存放动态可加载模块。

17.4.3.2. PostgreSQL 特性 #

本节描述的选项用于启用各种可选的 PostgreSQL 特性。 其中大多数需要额外的软件,如 Section 17.1 所述;如果找到了所需软件,这些特性会自动启用。 你可以通过手工把这些特性设为 enabled(要求必须构建) 或 disabled(不构建),来改变这种行为。

要指定 PostgreSQL 特有的选项,选项名必须以 -D 为前缀。

-Dnls={ auto | enabled | disabled } #

启用或禁用本地语言支持(NLS),也就是以非英语语言显示 程序消息的能力。默认值是 auto;如果找到了 Gettext API 的实现,就会自动启用。

-Dplperl={ auto | enabled | disabled } #

构建 PL/Perl 服务器端语言。 默认值是 auto。

-Dplpython={ auto | enabled | disabled } #

构建 PL/Python 服务器端语言。 默认值是 auto。

-Dpltcl={ auto | enabled | disabled } #

构建 PL/Tcl 服务器端语言。 默认值是 auto。

-Dtcl_version=TCL_VERSION #

指定构建 PL/Tcl 时要使用的 Tcl 版本。

-Dicu={ auto | enabled | disabled } #

构建时支持 ICU 库,从而启用 ICU 排序规则特性(见 Section 23.2)。默认值是 auto,并且要求安装 ICU4C 软件包。当前 ICU4C 的最低要求版本是 4.2。

-Dllvm={ auto | enabled | disabled } #

构建时支持基于 LLVMJIT 编译(见 Chapter 30)。 这要求已安装 LLVM 库。 当前 LLVM 的最低要求版本是 14。 默认禁用。

llvm-config 将用于查找所需的编译选项。系统会先在你的 PATH 中搜索 llvm-config,然后再搜索各个受支持版本对应的 llvm-config-$version。如果这样找不到你想要的程序, 请使用 LLVM_CONFIG 指定正确的 llvm-config 路径。

-Dlz4={ auto | enabled | disabled } #

构建时支持 LZ4 压缩。 默认值是 auto。

-Dzstd={ auto | enabled | disabled } #

构建时支持 Zstandard 压缩。 默认值是 auto。

-Dssl={ auto | LIBRARY } #

构建时支持 SSL(加密)连接。 唯一受支持的 LIBRARYopenssl。 这要求安装 OpenSSL 软件包。 使用该选项构建时,会检查所需的头文件和库,以确认你的 OpenSSL 安装足够后才继续。 该选项的默认值是 auto。

-Dgssapi={ auto | enabled | disabled } #

构建时支持 GSSAPI 认证。要使用 GSSAPI,必须安装 MIT Kerberos。 在很多系统上,GSSAPI 系统(MIT Kerberos 安装的一部分)并不位于默认搜索的路径 中(例如 /usr/include/usr/lib)。 在这种情况下,PostgreSQL 会查询 pkg-config 来检测所需的编译器和链接器选项。默认值是 auto。 meson configure 会检查所需的头文件和库, 以确认你的 GSSAPI 安装足够后才继续。

-Dldap={ auto | enabled | disabled } #

构建时支持 LDAP 认证和连接参数查找(更多信息见 Section 32.18Section 20.10)。在 Unix 上,这要求安装 OpenLDAP 软件包。在 Windows 上,使用默认的 WinLDAP 库。默认值是 auto。 meson configure 会检查所需的头文件和库, 以确认你的 OpenLDAP 安装足够后才继续。

-Dpam={ auto | enabled | disabled } #

构建时支持 PAM (可插拔认证模块)。默认值是 auto。

-Dbsd_auth={ auto | enabled | disabled } #

构建时支持 BSD 认证。(BSD 认证框架目前仅在 OpenBSD 上可用。) 默认值是 auto。

-Dsystemd={ auto | enabled | disabled } #

构建时支持 systemd 服务通知。如果服务器是在 systemd 下启动, 这会改进集成;否则没有影响。更多信息见 Section 18.3。默认值是 auto。 要使用此选项,需要安装 libsystemd 及其相关头文件。

-Dbonjour={ auto | enabled | disabled } #

构建时支持 Bonjour 自动服务发现。默认值是 auto,并要求你的操作系统支持 Bonjour。在 macOS 上推荐启用。

-Duuid=LIBRARY #

构建 uuid-ossp 模块 (它提供生成 UUID 的函数),并使用指定的 UUID 库。 LIBRARY 必须是以下之一:

  • none,不构建 uuid 模块。这是默认值。

  • bsd,使用 FreeBSD 以及其他某些 BSD 衍生系统中的 UUID 函数

  • e2fs,使用 e2fsprogs 项目创建的 UUID 库; 该库存在于大多数 Linux 系统和 macOS 中,也可用于其他平台

  • ossp,使用 OSSP UUID library

-Dlibcurl={ auto | enabled | disabled } #

构建时支持 libcurl,用于 OAuth 2.0 客户端流程。 此特性要求 libcurl 7.61.0 或更高版本。 使用该选项构建时,会检查所需的头文件和库,以确认你的 Curl 安装足够后才继续。 该选项的默认值是 auto。

-Dliburing={ auto | enabled | disabled } #

构建时支持 liburing,以启用异步 I/O 的 io_uring 支持。 默认值是 auto。

如果 liburing 安装在不常见的位置,你可以设置与 pkg-config 相关的环境变量(见其文档)。

-Dlibnuma={ auto | enabled | disabled } #

构建时支持 libnuma,用于基础 NUMA 支持。 仅在实现了 libnuma 库的平台上受支持。 该选项的默认值是 auto。

-Dlibxml={ auto | enabled | disabled } #

构建时支持 libxml2,以启用 SQL/XML 支持。 默认值是 auto。该特性要求 libxml2 2.6.23 或更高版本。

如果 libxml2 安装在不常见的位置,你可以设置与 pkg-config 相关的环境变量(见其文档)。

-Dlibxslt={ auto | enabled | disabled } #

构建时支持 libxslt,以启用 xml2 模块对 XML 执行 XSL 转换。 同时还必须指定 -Dlibxml。 默认值是 auto。

-Dselinux={ auto | enabled | disabled } #

构建时支持 SElinux,以启用 sepgsql 扩展。 默认值是 auto。

17.4.3.3. 反功能 #

-Dreadline={ auto | enabled | disabled } #

允许使用 Readline 库(以及 libedit)。该选项默认值为 auto, 会为 psql 启用命令行编辑和历史记录, 强烈推荐保留。

-Dlibedit_preferred={ true | false } #

将此值设为 true 时,会优先使用 BSD 许可的 libedit 库,而不是 GPL 许可的 Readline。只有在两个库都已安装时, 该选项才有意义;默认值是 false,也就是使用 Readline

-Dzlib={ auto | enabled | disabled } #

启用 Zlib 库的使用。 该选项默认值为 auto,会为 pg_dumppg_restorepg_basebackup 启用压缩归档支持,推荐保留。

17.4.3.4. 构建过程细节 #

--auto-features={ auto | enabled | disabled } #

设置这个选项,可以覆盖所有 auto 特性的取值 (也就是那些在找到所需软件时会自动启用的特性)。 当你想一次性禁用或启用所有 optional 特性, 而不必逐个手工设置时,这会很有用。 该参数的默认值是 auto。

--backend=BACKEND #

Meson 默认使用的后端是 ninja,这对大多数用例已经足够。 不过,如果你希望与 Visual Studio 完全集成,可以把 BACKEND 设为 vs

-Dc_args=OPTIONS #

这个选项可用于向 C 编译器传递额外选项。

这个选项可用于向 C 链接器传递额外选项。

-Dextra_include_dirs=DIRECTORIES #

DIRECTORIES 是一个以逗号分隔的目录列表, 这些目录会被加入编译器搜索头文件的路径中。 如果你把可选软件包(如 GNU Readline) 安装在非标准位置,就必须使用此选项,并且通常还要使用对应的 -Dextra_lib_dirs 选项。

例如: -Dextra_include_dirs=/opt/gnu/include,/usr/sup/include

-Dextra_lib_dirs=DIRECTORIES #

DIRECTORIES 是一个以逗号分隔的目录列表, 用于搜索库文件。如果你把软件包安装在非标准位置, 很可能需要使用这个选项(以及对应的 -Dextra_include_dirs)。

例如:-Dextra_lib_dirs=/opt/gnu/lib,/usr/sup/lib

-Dsystem_tzdata=DIRECTORY #

PostgreSQL 自带了日期和时间操作所需的时区数据库。 这个时区数据库实际上与很多操作系统(如 FreeBSD、Linux 和 Solaris) 提供的 IANA 时区数据库兼容,因此再次安装它是多余的。使用此选项时, 将使用位于 DIRECTORY 的系统提供时区数据库, 而不是 PostgreSQL 源码发布中自带的那一份。 DIRECTORY 必须是绝对路径。 在某些操作系统上,/usr/share/zoneinfo 是一个可能的目录。请注意,安装过程不会检测时区数据是否不匹配或有误。 如果你使用该选项,建议运行回归测试,以验证你指定的时区数据能够与 PostgreSQL 正常配合工作。

这个选项主要面向那些非常了解其目标操作系统的二进制包发布者。 使用该选项的主要优点是,当本地众多夏令时规则中的任何一条发生变化时, PostgreSQL 软件包都无需升级。另一个优点是,如果安装时不需要构建 时区数据库文件,那么 PostgreSQL 的交叉编译也会更直接。

-Dextra_version=STRING #

STRING 追加到 PostgreSQL 版本号后面。 例如,你可以用它给从未发布的 Git 快照构建出来的 二进制文件、或包含自定义补丁的二进制文件,添加额外版本字符串作为标记, 例如 git describe 标识符或发行包版本号。

-Drpath={ true | false } #

该选项默认值是 true。如果设为 false,则不会在 PostgreSQL 的可执行文件中标记, 使其在运行时到安装的库目录中搜索共享库(见 --libdir)。 在大多数平台上,这种标记使用库目录的绝对路径,因此如果你之后移动安装位置, 它就没有帮助了。不过这样一来,你就需要通过其他方式让可执行文件找到共享库。 通常这要求配置操作系统的动态链接器搜索该库目录;更多细节见 Section 17.5.1

-DBINARY_NAME=PATH #

如果构建 PostgreSQL(无论是否启用可选标志)所需的某个程序位于非标准路径, 你可以手工把它指定给 meson configure。 支持这样指定的程序完整列表,可通过运行 meson configure 查看。例如:

meson configure -DBISON=PATH_TO_BISON

17.4.3.5. 文档 #

关于构建文档所需的工具,见 Section J.2

-Ddocs={ auto | enabled | disabled } #

启用构建 HTMLman 格式的文档。默认值是 auto。

-Ddocs_pdf={ auto | enabled | disabled } #

启用构建 PDF 格式的文档。默认值是 auto。

-Ddocs_html_style={ simple | website } #

控制使用哪种 CSS 样式表。默认值是 simple。如果设为 website, HTML 文档将引用 postgresql.org 的样式表。

17.4.3.6. 杂项 #

-Dpgport=NUMBER #

NUMBER 设为服务器和客户端的默认端口号。 默认值是 5432。端口号以后始终都可以修改,但如果在这里指定, 那么服务器和客户端都会编译进同一个默认值,这可能很方便。 通常选择非默认值的唯一合理原因,是你打算在同一台机器上运行多个 PostgreSQL 服务器。

-Dkrb_srvnam=NAME #

GSSAPI 所使用的 Kerberos 服务主体的默认名称。 默认是 postgres。通常没有理由修改它, 除非你是在为 Windows 环境构建,在那种情况下它必须被设为大写的 POSTGRES

-Dsegsize=SEGSIZE #

设置 段大小,单位为 GB。 大表会被分成多个操作系统文件,每个文件的大小等于段大小。 这可以避免很多平台上的文件大小限制问题。默认段大小 1GB 在所有支持的平台上 都是安全的。如果你的操作系统支持 largefile (如今大多数都支持),你可以使用更大的段大小。 这有助于减少处理超大表时消耗的文件描述符数量。 但请注意不要选择超出你的平台和打算使用的文件系统所支持的值。 你可能想用到的其他工具,例如 tar, 也可能对可用文件大小施加限制。推荐(但不是绝对要求)把这个值设为 2 的幂。

-Dblocksize=BLOCKSIZE #

设置 块大小,单位为 KB。 这是表内部存储和 I/O 的单位。默认值 8KB 适合大多数场景, 但在特殊情况下,其他取值也可能有用。 该值必须是 1 到 32(KB)之间的 2 的幂。

-Dwal_blocksize=BLOCKSIZE #

设置 WAL 块大小,单位为 KB。 这是 WAL 日志内部存储和 I/O 的单位。默认值 8KB 适合大多数场景, 但在特殊情况下,其他取值也可能有用。 该值必须是 1 到 64(KB)之间的 2 的幂。

17.4.3.7. 开发人员选项 #

本节中的大多数选项只对开发或调试 PostgreSQL 有意义。 除 --debug 外,不建议在生产构建中使用它们; 不过,如果你不幸遇到 bug,该选项有助于获得更详细的 bug 报告。 在支持 DTrace 的平台上,-Ddtrace 也可能适合在生产环境中使用。

如果构建的安装将用于开发服务器内部代码,建议至少使用 --buildtype=debug-Dcassert

--buildtype=BUILDTYPE #

这个选项可用于指定要使用的构建类型;默认值是 debugoptimized。如果你希望对调试符号和优化级别 进行比该选项更细粒度的控制,可以参考 --debug--optimization 标志。

常用的构建类型包括:plaindebugdebugoptimizedrelease。关于它们的更多信息,可参见 Meson 文档

--debug #

将所有程序和库编译为带调试符号的版本。这意味着你可以在调试器中运行程序, 以分析问题。这会显著增大安装后的可执行文件大小,而且在非 GCC 编译器上, 通常还会禁用编译器优化,从而导致变慢。不过,保留这些符号对于处理可能出现的 各种问题极其有帮助。目前,只有在你使用 GCC 的情况下,才建议在生产安装中使用 该选项。但如果你在做开发工作或运行测试版,就应始终启用它。

--optimization=LEVEL #

指定优化级别。LEVEL 可以设为 {0,g,1,2,3,s} 中任意一个。

--werror #

设置该选项后,编译器会把警告当作错误处理。 这对代码开发很有用。

-Dcassert={ true | false } #

在服务器中启用 assertion 检查,用于测试许多 不应该发生的条件。这对代码开发非常有价值,但这些测试会显著拖慢 服务器速度。此外,启用这些测试并不一定会增强服务器稳定性! 断言检查并未按严重程度分类,因此即使某个 bug 相对无害,只要触发了断言失败, 仍可能导致服务器重启。该选项不建议用于生产环境,但如果你在做开发工作 或运行测试版,就应当启用它。

-Dtap_tests={ auto | enabled | disabled } #

启用使用 Perl TAP 工具的测试。默认值是 auto,并要求安装 Perl 以及 Perl 模块 IPC::Run。更多信息见 Section 31.4

-DPG_TEST_EXTRA=TEST_SUITES #

启用额外测试套件;这些测试默认不会运行,因为它们不适合在多用户系统上运行、 需要特殊软件,或者资源消耗较大。该参数是以空白分隔的测试名称列表。 详见 Section 31.1.3。如果在运行测试时设置了 PG_TEST_EXTRA 环境变量,那么它会覆盖这个构建时选项。

-Db_coverage={ true | false } #

如果使用 GCC,所有程序和库都会带代码覆盖率测试插桩进行编译。 运行时,它们会在构建目录中生成包含代码覆盖率指标的文件。 更多信息见 Section 31.5。 该选项只适用于 GCC,并且仅在开发工作中使用。

-Ddtrace={ auto | enabled | disabled } #

启用该选项会将 PostgreSQL 编译为支持动态跟踪工具 DTrace。更多信息见 Section 27.5

如果要指向 dtrace 程序,可以设置 DTRACE 选项。这通常是必要的,因为 dtrace 往往安装在 /usr/sbin 下, 而该目录可能不在你的 PATH 中。

-Dinjection_points={ true | false } #

PostgreSQL 编译为支持服务器中的注入点。 注入点允许在预定义的代码路径中,从服务器内部运行用户定义的代码。 这有助于以受控方式测试并研究并发场景。该选项默认关闭。 更多细节见 Section 36.10.14。 该选项仅供开发人员测试使用。

-Dsegsize_blocks=SEGSIZE_BLOCKS #

以块数指定关系段大小。如果同时指定了 -Dsegsize 和这个选项,则以后者为准。 该选项仅供开发人员测试与段相关的代码。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。