17.4. 使用 Meson 构建和安装 #
17.4.1. 简要说明 #
meson setup build --prefix=/usr/local/pgsql cd build ninja su ninja install adduser postgres mkdir -p /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. 安装过程 #
配置
安装过程的第一步,是针对你的系统配置构建树,并选择你需要的选项。要创建并配置构建目录,可以从
meson setup命令开始:meson setup buildsetup 命令接受
builddir和srcdir两个参数。如果未给出srcdir,Meson 会根据当前目录以及meson.build的位置推导出srcdir。builddir是必需的。运行
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的常用命令行选项见第 17.4.3 节。构建
默认情况下,Meson 使用 Ninja 作为构建工具。要使用 Meson 从源代码构建 PostgreSQL,只需在构建目录中运行
ninja命令:ninja
Ninja 会自动检测你的计算机 CPU 数量,并据此并行执行。你也可以用命令行参数
-j覆盖并行进程数。需要注意的是,在最初的配置步骤之后,
ninja就是你编译时唯一需要输入的命令。不管你如何修改源码树(只要不是把它移动到全新的位置),Meson 都会检测变化并相应重新生成自己。如果你有多个构建目录,这一点尤其方便。通常其中一个用于开发(“调试”构建),而另一些只在偶尔需要时使用(比如“静态分析”构建)。任何配置都只需切换到对应目录,然后运行 Ninja 即可完成构建。如果你希望使用 ninja 之外的后端进行构建,可以在配置时使用
--backend选项进行选择,然后通过meson compile来构建。要进一步了解这些后端,以及你可以传给 ninja 的其他参数,可参考 Meson 文档。回归测试
如果你希望在安装之前测试新构建的服务器,可以在此时运行回归测试。回归测试是一套测试,用来验证 PostgreSQL 是否按开发者预期的方式在你的机器上运行。输入:
meson test(这不能以 root 身份运行;请使用非特权用户。)关于如何解释测试结果的详细信息,见第 33 章。在以后的任何时候,你都可以再次执行同样的命令来重复此测试。
如果要针对正在运行的 postgres 实例运行 pg_regress 和 pg_isolation_regress 测试,请向
meson test传入参数--setup running。安装文件
注意
如果你是在升级已有系统,请务必阅读第 19.6 节,其中包含关于升级集簇的说明。
PostgreSQL 构建完成后,只需运行
ninja install命令即可安装:ninja install
这会把文件安装到步骤 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 选项(示例见第 17.4.1 节)对大多数情况来说已经足够。如果你有特殊需求,可以使用本节中描述的其他选项定制安装子目录。但请注意,更改不同子目录之间的相对位置可能会使安装变得不可重定位,也就是安装后无法再移动。(man 和
doc 的位置不受这一限制影响。)对于可重定位安装,你可能希望使用稍后介绍的
-Drpath=false 选项。
--prefix=#PREFIX把所有文件安装到目录
PREFIX下,而不是安装到/usr/local/pgsql(类 Unix 系统)或(Windows)下。实际文件会安装到各个子目录中;不会有任何文件直接安装到当前驱动器盘符:/usr/local/pgsqlPREFIX目录中。--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=#DIRECTORYPostgreSQL 附带的手册页将安装到这个目录下各自对应的
man子目录中。默认是x。DATADIR/man
注意
为了能把 PostgreSQL 安装到共享安装位置(例如 /usr/local/include),同时又不干扰系统其他部分的名字空间,我们做了特别处理。首先,除非完整展开后的目录名已经包含字符串“postgres”或“pgsql”,否则会自动把字符串“/postgresql”追加到
datadir、sysconfdir 和
docdir 上。例如,如果你选择
/usr/local 作为前缀,那么文档会安装到
/usr/local/doc/postgresql;但如果前缀是
/opt/postgres,那么它会安装到
/opt/postgres/doc。客户端接口的公共 C 头文件会安装到 includedir 中,并且不会污染名字空间。内部头文件和服务器头文件则会安装到 includedir
下的私有目录中。关于如何访问这些头文件,请参见各接口自己的文档。最后,如果有需要,也会在 libdir 下创建私有子目录,用于存放动态可加载模块。
17.4.3.2. PostgreSQL 特性 #
本节描述的选项用于启用各种可选的
PostgreSQL 特性。其中大多数需要额外的软件,如第 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 排序规则特性(见第 24.2 节)。默认值是 auto,并且要求安装 ICU4C 软件包。当前 ICU4C 的最低要求版本是 4.2。
-Dllvm={ auto | enabled | disabled }#构建时支持基于 LLVM 的 JIT 编译(见第 32 章)。这要求已安装 LLVM 库。当前 LLVM 的最低要求版本是 3.9。默认禁用。
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(加密)连接。唯一受支持的
LIBRARY是openssl。这要求安装 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 认证和连接参数查找(更多信息见第 34.18 节和第 21.10 节)。在 Unix 上,这要求安装 OpenLDAP 软件包。在 Windows 上,使用默认的 WinLDAP 库。默认值是 auto。
meson configure会检查所需的头文件和库,以确认你的 OpenLDAP 安装满足要求后才继续。-Dpam={ auto | enabled | disabled }#-Dbsd_auth={ auto | enabled | disabled }#构建时支持 BSD 认证。(BSD 认证框架目前仅在 OpenBSD 上可用。)默认值是 auto。
-Dsystemd={ auto | enabled | disabled }#构建时支持 systemd 服务通知。如果服务器是在 systemd 下启动,这会改进集成;否则没有影响。更多信息见第 19.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 库
-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。
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_dump、pg_restore 和 pg_basebackup 启用压缩归档支持,推荐保留。
-Dspinlocks={ true | false }#该选项默认值是 true;将其设为 false 时,即使 PostgreSQL 不支持该平台的 CPU 自旋锁,也允许构建成功。缺乏自旋锁支持会导致非常差的性能;因此,只有在构建中止并提示该平台缺少自旋锁支持时,才应修改此选项。如果在你的平台上构建 PostgreSQL 需要把该选项设为 false,请向 PostgreSQL 开发者报告该问题。
-Datomics={ true | false }#该选项默认值是 true;将其设为 false 会禁用 CPU 原子操作的使用。对于缺乏此类操作的平台,该选项不起作用。对于具备此类操作的平台,禁用原子操作会导致性能很差。修改此选项仅对调试或进行性能比较有用。
17.4.3.4. 构建过程细节 #
--auto-features={ auto | enabled | disabled }#设置这个选项,可以覆盖所有“auto”特性的取值(也就是那些在找到所需软件时会自动启用的特性)。当你想一次性禁用或启用所有“可选”特性,而不必逐个手工设置时,这会很有用。该参数的默认值是 auto。
--backend=#BACKENDMeson 默认使用的后端是 ninja,这对大多数用例已经足够。不过,如果你希望与 Visual Studio 完全集成,可以把
BACKEND设为vs。-Dc_args=#OPTIONS这个选项可用于向 C 编译器传递额外选项。
-Dc_link_args=#OPTIONS这个选项可用于向 C 链接器传递额外选项。
-Dextra_include_dirs=#DIRECTORIESDIRECTORIES是一个以逗号分隔的目录列表,这些目录会被加入编译器搜索头文件的路径中。如果你把可选软件包(如 GNU Readline)安装在非标准位置,就必须使用此选项,并且通常还要使用对应的-Dextra_lib_dirs选项。例如:
-Dextra_include_dirs=/opt/gnu/include,/usr/sup/include。-Dextra_lib_dirs=#DIRECTORIESDIRECTORIES是一个以逗号分隔的目录列表,用于搜索库文件。如果你把软件包安装在非标准位置,很可能需要使用这个选项(以及对应的-Dextra_include_dirs)。例如:
-Dextra_lib_dirs=/opt/gnu/lib,/usr/sup/lib。-Dsystem_tzdata=#DIRECTORYPostgreSQL 自带了日期和时间操作所需的时区数据库。这个时区数据库实际上与很多操作系统(如 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)。在大多数平台上,这种标记使用库目录的绝对路径,因此如果你之后移动安装位置,它就没有帮助了。不过这样一来,你就需要通过其他方式让可执行文件找到共享库。通常这要求配置操作系统的动态链接器搜索该库目录;更多细节见第 17.5.1 节。-D#BINARY_NAME=PATH如果构建 PostgreSQL(无论是否启用可选标志)所需的某个程序位于非标准路径,你可以手工把它指定给
meson configure。支持这样指定的程序完整列表,可通过运行meson configure查看。例如:meson configure -DBISON=PATH_TO_BISON
17.4.3.5. 文档 #
关于构建文档所需的工具,见第 J.2 节。
-Ddocs={ auto | enabled | disabled }#启用构建 HTML 和 man 格式的文档。默认值是 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=#NAMEGSSAPI 所使用的 Kerberos 服务主体的默认名称。默认是
postgres。通常没有理由修改它,除非你是在为 Windows 环境构建,在那种情况下它必须被设为大写的POSTGRES。-Dsegsize=#SEGSIZE设置段大小,单位为 GB。大表会被分成多个操作系统文件,每个文件的大小等于段大小。这可以避免很多平台上的文件大小限制问题。默认段大小 1GB 在所有支持的平台上都是安全的。如果你的操作系统支持“大文件”(如今大多数都支持),你可以使用更大的段大小。这有助于减少处理超大表时消耗的文件描述符数量。但请注意不要选择超出你的平台和打算使用的文件系统所支持的值。你可能想用到的其他工具,例如 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标志。常用的构建类型包括:
plain、debug、debugoptimized和release。关于它们的更多信息,可参见 Meson 文档。--debug#将所有程序和库编译为带调试符号的版本。这意味着你可以在调试器中运行程序,以分析问题。这会显著增大安装后的可执行文件大小,而且在非 GCC 编译器上,通常还会禁用编译器优化,从而导致变慢。不过,保留这些符号对于处理可能出现的各种问题极其有帮助。目前,只有在你使用 GCC 的情况下,才建议在生产安装中使用该选项。但如果你在做开发工作或运行测试版,就应始终启用它。
--optimization=LEVEL#指定优化级别。
LEVEL可以设为 {0,g,1,2,3,s} 中任意一个。--werror#设置该选项后,编译器会把警告当作错误处理。这对代码开发很有用。
-Dcassert={ true | false }#在服务器中启用断言检查,用于测试许多“不可能发生”的条件。这对代码开发非常有价值,但这些测试会显著拖慢服务器速度。此外,启用这些测试并不一定会增强服务器稳定性!断言检查并未按严重程度分类,因此即使某个 bug 相对无害,只要触发了断言失败,仍会导致服务器重启。该选项不建议用于生产环境,但如果你在做开发工作或运行测试版,就应当启用它。
-Dtap_tests={ auto | enabled | disabled }#启用使用 Perl TAP 工具的测试。默认值是 auto,并要求安装 Perl 以及 Perl 模块
IPC::Run。更多信息见第 33.4 节。-DPG_TEST_EXTRA=#TEST_SUITES启用运行时需要特殊软件的测试套件。该选项通过以空白分隔的列表接受参数。详见第 33.1.3 节。
-Db_coverage={ true | false }#如果使用 GCC,所有程序和库都会带代码覆盖率测试插桩进行编译。运行时,它们会在构建目录中生成包含代码覆盖率指标的文件。更多信息见第 33.5 节。该选项只适用于 GCC,并且仅在开发工作中使用。
-Ddtrace={ auto | enabled | disabled }#启用该选项会将 PostgreSQL 编译为支持动态跟踪工具 DTrace。更多信息见第 28.5 节。
如果要指向
dtrace程序,可以设置DTRACE选项。这通常是必要的,因为dtrace往往安装在/usr/sbin下,而该目录可能不在你的PATH中。-Dsegsize_blocks=SEGSIZE_BLOCKS#以块数指定关系段大小。如果同时指定了
-Dsegsize和这个选项,则以后者为准。该选项仅供开发人员测试与段相关的代码。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.