新版的pg官方推荐使用meson工具编译pg源码,今天研究了一番,记录下来。操作系统:Rocky Linux release 9.7 (Blue Onyx),pg为最新的18.1。
编译前检查
系统默认未安装meson和ninja,可执行pip install meson ninja安装。
依赖包安装
dnf install git cmake gcc-c++ openssl-devel python3-devel libicu-devel bison flex readline lz4-devel readline-devel zlib-devel perl-FindBin docbook-dtds docbook-style-xsl libxslt -y
一、 快速部署命令集
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
后续内容为该快速命令集的详细说明。
二、 完整安装流程
编译配置
安装流程的第一步,是为当前系统初始化编译目录并配置所需的编译选项。执行 meson setup 命令即可创建并完成编译目录的初始化配置:
meson setup build
setup 命令需传入编译目录(builddir)和源码目录(srcdir)两个参数。若未指定源码目录,Meson 会根据当前工作目录与 meson.build 文件的路径自动推导;编译目录为必填项。
执行 meson setup 会加载编译配置文件并完成编译目录的初始化,同时也可在该命令后追加各类编译配置项。后续章节会介绍常用的配置项,示例如下:
# 指定自定义的安装根目录进行编译配置
meson setup build --prefix=/home/user/pg-install
# 配置为 Debug 调试版本的编译模式
meson setup build --buildtype=debug
# 编译时启用 OpenSSL 支持
meson setup build -Dssl=openssl
编译目录的初始化配置为一次性操作。若需在重新编译前修改配置,直接执行 meson configure 命令即可:
meson configure -Dcassert=true
meson configure 的常用命令行参数说明见第三部分。
源码编译
Meson 默认使用 Ninja 作为编译工具。在编译目录下直接执行 ninja 命令,即可基于 Meson 完成 PostgreSQL 源码的编译:
ninja
Ninja 会自动检测服务器的 CPU 核心数,并以此并行执行编译任务。可通过 -j 参数手动指定并行编译的进程数,覆盖默认配置。
注意:完成首次编译配置后,后续所有的编译操作仅需执行
ninja命令即可。无论对源码目录做任何修改(除非将源码目录迁移至全新路径),Meson 都会自动检测变更并重新生成编译文件。该特性在多编译目录的场景下尤为实用——通常会创建一个编译目录用于开发(Debug 编译模式),其余目录按需使用(如静态代码分析编译模式)。只需进入对应的编译目录并执行 Ninja,即可完成对应配置的编译。
若需使用 Ninja 之外的编译后端,可在执行配置时通过 --backend 指定目标后端,再通过 meson compile 完成编译。关于编译后端与 Ninja 更多参数的说明,可参考 Meson 官方文档。
回归测试
若希望在安装前对编译完成的数据库服务做功能验证,可在此阶段执行回归测试。回归测试套件用于验证 PostgreSQL 在当前服务器上的运行逻辑是否符合开发者的设计预期,执行命令如下:
meson test
注意:该命令不可使用 root 账户执行,需切换至普通权限用户。该命令可在任意阶段重复执行,完成多次回归测试。
如需针对已启动的 PostgreSQL 实例执行 pg_regress 和 pg_isolation_regress 测试,需在 meson test 后追加参数 --setup running。
PostgreSQL 编译完成后,执行下述命令即可完成安装:
ninja install
该命令会将编译产物安装至「编译配置阶段」指定的目录中,执行前请确保当前账户拥有对应目录的写入权限,必要时需切换至 root 账户执行。也可提前创建目标安装目录并配置好对应权限,规避权限问题。
标准的安装流程会同时部署客户端应用开发与服务端程序开发所需的全部头文件,例如基于 C 语言编写的自定义函数、自定义数据类型相关的开发依赖。
绝大多数场景下使用 ninja install 即可完成安装;如需使用更多安装参数(如 --quiet 静默安装,屏蔽冗余输出),也可改用 meson install 命令。该命令的更多参数可参考 Meson 官方文档。
- 卸载:执行
ninja uninstall可卸载已安装的 PostgreSQL 文件。 - 清理编译产物:安装完成后,执行
ninja clean可删除源码目录中的编译产物,释放磁盘空间。
三、 meson setup 配置项
下文将介绍 meson setup 的常用命令行配置项,该列表并非完整内容(执行 meson configure --help 可查看全部配置项)。未在此处提及的配置项均为高级用法,相关说明见 Meson 官方文档,且这类参数同样可在 meson setup 中使用。
3.1 安装路径配置项
这类配置项用于指定 ninja install(或 meson install)的文件安装路径。绝大多数场景下,仅需配置 --prefix 即可满足需求。若有特殊需求,可通过本节其他配置项自定义各子目录的安装路径。
注意:修改不同子目录的相对路径,可能导致 PostgreSQL 安装目录失去可迁移性——即安装完成后无法随意移动目录位置(手册与文档目录不受该限制影响)。若需编译出可迁移的安装包,可使用后文提及的
-Drpath=false配置项。
--prefix=安装根目录
将所有文件安装至指定的根目录下,而非默认路径:类 Unix 系统为
/usr/local/pgsql,Windows 系统为「当前盘符」:/usr/local/pgsql。所有文件均会被安装至该根目录的各子目录中,不会有文件直接存放在根目录下。
--bindir=目录路径
指定可执行程序的安装目录,默认值为
安装根目录/bin。
--sysconfdir=目录路径
指定各类配置文件的安装目录,默认值为
安装根目录/etc。
--libdir=目录路径
指定库文件与动态加载模块的安装目录,默认值为
安装根目录/lib。
--includedir=目录路径
指定 C/C++ 头文件的安装目录,默认值为
安装根目录/include。
--datadir=目录路径
指定程序运行所需的只读数据文件安装目录,默认值为
安装根目录/share。注意:该路径与数据库的数据文件存储路径无关。
--localedir=目录路径
指定本地化数据(尤其是消息翻译目录文件)的安装目录,默认值为
数据文件目录/locale。
--mandir=目录路径
PostgreSQL 自带的手册页将被安装至该目录下对应的
manx子目录中,默认值为数据文件目录/man。补充说明:PostgreSQL 在设计时做了特殊适配,可将其安装至系统共享目录(如
/usr/local/include)且不会污染系统的命名空间,具体适配规则如下:
- 若最终展开的目录路径中不包含
postgres或pgsql字符串,则会自动在datadir、sysconfdir、docdir的路径后追加/postgresql。例如:指定--prefix=/usr/local时,文档会被安装至/usr/local/doc/postgresql;若指定--prefix=/opt/postgres,则文档路径为/opt/postgres/doc。- 客户端接口的公共 C 头文件会被安装至
includedir,且完全做到命名空间隔离;服务端内部头文件与核心头文件会被安装至includedir下的私有子目录中。各接口的头文件调用方式,可参考对应接口的开发文档。- 动态加载模块会被安装至
libdir下的私有子目录中(如有需要)。
3.2 PostgreSQL 功能模块配置项
本节的配置项用于启用 PostgreSQL 的各类可选功能模块。这些功能大多依赖额外的第三方软件,Meson 会在检测到对应依赖时自动启用功能;也可手动将配置项设为 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 版本号
指定编译 PL/Tcl 时使用的 Tcl 版本。
-Dicu={ auto | enabled | disabled }
启用 ICU 库支持,开启后可使用 ICU 排序规则特性。默认值为
auto,需系统已安装 ICU4C 包,最低兼容版本为 4.2。
-Dllvm={ auto | enabled | disabled }
启用基于 LLVM 的 JIT 即时编译支持,需系统已安装 LLVM 库,最低兼容版本为 14,默认禁用。
Meson 会通过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 | 库名 }
启用 SSL 加密连接支持,目前仅支持指定
openssl作为依赖库,需系统已安装 OpenSSL 包。编译时会先校验对应的头文件与库文件是否齐全,确认环境满足要求后再继续编译,默认值为auto。
-Dgssapi={ auto | enabled | disabled }
启用 GSSAPI 认证方式,依赖 MIT Kerberos 组件。部分系统中,GSSAPI 相关文件不会被安装在默认搜索路径(如
/usr/include、/usr/lib)中,此时 Meson 会通过 pkg-config 工具自动检测编译与链接所需的参数。默认值为auto,编译前会校验依赖是否齐全。
-Dldap={ auto | enabled | disabled }
启用 LDAP 支持,可用于认证与连接参数的查询。类 Unix 系统需安装 OpenLDAP 包,Windows 系统默认使用系统自带的 WinLDAP 库。默认值为
auto,编译前会校验依赖是否齐全。
-Dpam={ auto | enabled | disabled }
启用可插拔认证模块(PAM)支持,默认值为
auto。
-Dbsd_auth={ auto | enabled | disabled }
启用 BSD 认证框架支持(该框架仅在 OpenBSD 系统中可用),默认值为
auto。
-Dsystemd={ auto | enabled | disabled }
启用 systemd 服务通知机制,可提升 PostgreSQL 在 systemd 管理下的集成度,无其他场景影响。默认值为
auto,需系统已安装 libsystemd 库及对应头文件。
-Dbonjour={ auto | enabled | disabled }
启用 Bonjour 自动服务发现功能,默认值为
auto,需系统原生支持 Bonjour,macOS 系统推荐启用。
-Duuid=依赖库类型
编译
uuid-ossp扩展模块(提供 UUID 生成函数),并指定依赖的 UUID 库,可选值如下:
none:不编译该模块,为默认值;bsd:使用 FreeBSD 及部分 BSD 衍生系统自带的 UUID 函数;e2fs:使用 e2fsprogs 项目的 UUID 库(绝大多数 Linux、macOS 系统自带,其他平台也可单独安装);ossp:使用 OSSP UUID 库。
-Dlibcurl={ auto | enabled | disabled }
启用 libcurl 库支持,用于实现 OAuth 2.0 客户端流程,要求 libcurl 版本 ≥7.61.0。编译前会校验依赖是否齐全,默认值为
auto。
-Dliburing={ auto | enabled | disabled }
启用 liburing 库支持,开启 io_uring 异步 I/O 特性,默认值为
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。
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提供压缩归档支持,推荐启用。
3.4 编译流程细节配置项
--auto-features={ auto | enabled | disabled }
全局覆盖所有「auto 类型」功能的默认值(即那些检测到依赖就自动启用的功能)。如需批量启用/禁用所有可选功能,无需逐个配置,仅需修改该参数即可,默认值为
auto。
--backend=编译后端
指定 Meson 使用的编译后端,默认值为
ninja,可满足绝大多数场景。如需对接 Visual Studio 开发环境,可将该值设为vs。
-Dc_args=编译参数
向 C 语言编译器传递额外的编译参数。
-Dc_link_args=链接参数
向 C 语言链接器传递额外的链接参数。
-Dextra_include_dirs=目录列表
传入以英文逗号分隔的目录列表,追加至编译器的头文件搜索路径。若部分依赖包(如 GNU Readline)安装在非默认路径,需配置该参数,通常也需配合
-Dextra_lib_dirs使用。
示例:-Dextra_include_dirs=/opt/gnu/include,/usr/sup/include
-Dextra_lib_dirs=目录列表
传入以英文逗号分隔的目录列表,追加至链接器的库文件搜索路径。依赖包安装在非默认路径时需配置,示例:
-Dextra_lib_dirs=/opt/gnu/lib,/usr/sup/lib
-Dsystem_tzdata=目录路径
PostgreSQL 内置了时区数据库,用于日期与时间相关的运算,该数据库与 FreeBSD、Linux、Solaris 等系统提供的 IANA 时区数据库完全兼容,无需重复部署。配置该参数后,PostgreSQL 会使用系统自带的时区数据库(指定绝对路径),而非源码包内置的版本。
多数系统的默认路径为/usr/share/zoneinfo。注意:安装流程不会校验时区数据的有效性,配置该参数后,建议执行回归测试验证时区数据是否可用。
该参数主要面向二进制包开发者,优势为:无需因夏令时规则变更而频繁升级 PostgreSQL 包;交叉编译时无需编译时区文件,流程更简洁。
-Dextra_version=自定义字符串
在 PostgreSQL 的版本号后追加自定义字符串,可用于标记特殊编译包(如 Git 快照编译版、含自定义补丁的版本),例如追加 Git 版本标识或发行包版本号。
-Drpath={ true | false }
默认值为
true。设为false时,不会为 PostgreSQL 的可执行文件添加「共享库搜索路径标记」(即不指向--libdir指定的库目录)。
多数平台下,该标记为绝对路径,若后续迁移安装目录则失效;但关闭后需通过其他方式让可执行文件找到共享库(如配置系统动态链接器的搜索路径)。
-DBINARY_NAME=程序路径
若编译 PostgreSQL 所需的工具(含可选依赖)安装在非默认路径,可通过该参数手动指定程序路径。执行
meson configure可查看支持该配置的所有工具列表。
示例:meson configure -DBISON=PATH_TO_BISON
3.5 文档编译配置项
-Ddocs={ auto | enabled | disabled }
启用 HTML 与手册页(man)格式的文档编译,默认值为
auto。
-Ddocs_pdf={ auto | enabled | disabled }
启用 PDF 格式的文档编译,默认值为
auto。
-Ddocs_html_style={ simple | website }
指定 HTML 文档使用的 CSS 样式表,默认值为
simple;设为website时,会引用 postgresql.org 官网的样式表。
3.6 杂项配置项
-Dpgport=端口号
指定数据库服务端与客户端的默认端口号,默认值为 5432。该端口可在安装后修改,但若在此处指定,服务端与客户端会编译入相同的默认端口,使用更便捷。仅当需要在单台服务器运行多个 PostgreSQL 实例时,建议修改该值。
-Dkrb_srvnam=服务名
指定 GSSAPI 认证使用的 Kerberos 服务主体默认名称,默认值为
postgres。通常无需修改,仅在 Windows 环境编译时,需将其改为大写的POSTGRES。
-Dsegsize=段大小
指定数据表的段大小,单位为千兆字节(GB)。大表会被切分为多个操作系统文件,每个文件的大小等于该值,可规避多数平台的文件大小限制。默认值为 1GB,兼容所有支持的平台。
若系统支持「大文件」特性(当前主流系统均支持),可设置更大的段大小,减少超大表占用的文件句柄数。注意:该值不可超过系统与文件系统的最大支持值,tar 等工具也可能对文件大小有限制;建议将值设为 2 的幂次(非强制要求)。
-Dblocksize=块大小
指定数据表的存储与 I/O 最小单位,单位为千字节(KB)。默认值为 8KB,适配绝大多数场景;部分特殊场景可调整,值必须是 1~32 之间的 2 的幂次。
-Dwal_blocksize=WAL块大小
指定 WAL 日志的存储与 I/O 最小单位,单位为千字节(KB)。默认值为 8KB,适配绝大多数场景;部分特殊场景可调整,值必须是 1~64 之间的 2 的幂次。
17.4.3.7 开发者专属配置项
本节的配置项仅对 PostgreSQL 的开发与调试有意义,不推荐生产环境编译时使用。唯一例外是 --debug,若生产环境遇到故障,开启该参数可生成详细的错误报告,便于排障;支持 DTrace 的平台中,生产环境也可启用 -Ddtrace。
若编译 PostgreSQL 用于服务端代码开发/调试,建议至少启用 --buildtype=debug 与 -Dcassert 两个配置项。
--buildtype=编译类型
指定编译模式,默认值为
debugoptimized(带优化的调试版)。如需更精细地控制调试符号与编译优化级别,可结合--debug与--optimization参数使用。常用编译类型:plain(纯编译)、debug(调试版)、debugoptimized(优化调试版)、release(正式发布版),详细说明见 Meson 官方文档。
--debug
为所有程序与库文件编译调试符号,支持通过调试器分析问题。该参数会大幅增大编译产物的体积;非 GCC 编译器下,开启后通常会关闭编译优化,导致程序运行变慢。
GCC 编译器下,生产环境也可启用该参数;开发/测试 Beta 版本时,建议必开。
--optimization=优化级别
指定编译优化级别,可选值:
{0,g,1,2,3,s}。
--werror
让编译器将所有警告视为错误,适用于代码开发阶段的规范校验。
-Dcassert={ true | false }
启用服务端的断言检查,校验各类「理论上不可能发生」的异常场景,是代码开发的核心调试手段,但会导致服务端性能大幅下降。
注意:断言检查不区分问题严重程度,即使是轻微的逻辑异常也会触发断言失败,导致服务端重启,生产环境禁用;开发/测试 Beta 版本时建议开启。
-Dtap_tests={ auto | enabled | disabled }
启用基于 Perl TAP 工具的测试套件,默认值为
auto,需系统安装 Perl 及IPC::Run模块。
-DPG_TEST_EXTRA=测试套件列表
启用默认不执行的扩展测试套件(这类测试存在安全风险、依赖特殊软件或占用大量资源)。参数值为以空格分隔的测试套件名称。执行测试时若设置了环境变量
PG_TEST_EXTRA,会覆盖该编译配置。
-Db_coverage={ true | false }
仅在 GCC 编译器下生效,为所有程序与库文件添加代码覆盖率检测的编译插桩,运行后会在编译目录生成覆盖率统计文件。该参数仅用于开发阶段的代码覆盖率测试。
-Ddtrace={ auto | enabled | disabled }
启用动态追踪工具 DTrace 的支持。可通过
DTRACE参数指定 dtrace 程序的路径(dtrace 通常安装在/usr/sbin,可能不在 PATH 中)。
-Dinjection_points={ true | false }
为服务端编译「注入点」支持,可在预定义的代码流程中执行自定义代码,便于可控地测试并发场景与问题排查。默认禁用,,仅面向开发者的测试场景使用。
-Dsegsize_blocks=段大小(块数)
以「数据块」为单位指定数据表的段大小,若同时配置
-Dsegsize与该参数,该参数优先级更高。仅用于开发者测试段相关的核心代码。
四、 meson 编译目标项
可通过 ninja 目标名 编译指定的单个模块;不指定目标时,会编译除文档外的所有内容,也可直接通过「文件路径/文件名」作为目标,编译单个编译产物。
4.1 核心代码编译目标
all:编译除文档外的所有内容backend:编译数据库服务端及相关模块bin:编译前端客户端程序contrib:编译 contrib 扩展模块pl:编译所有服务端编程语言模块
4.2 开发者专属编译目标
reformat-dat-files:将系统目录数据文件重写为标准格式expand-dat-files:扩展所有数据文件,补全默认配置项update-unicode:更新 Unicode 相关数据至最新版本
4.3 文档编译目标
html:编译多页版 HTML 格式文档man:编译手册页(man)格式文档docs:编译多页版 HTML + man 格式文档doc/src/sgml/postgres-A4.pdf:编译 A4 纸张规格的 PDF 文档doc/src/sgml/postgres-US.pdf:编译美式信纸规格的 PDF 文档doc/src/sgml/postgres.html:编译单页版 HTML 格式文档alldocs:编译所有支持格式的文档
4.4 安装相关目标
install:安装 PostgreSQL 核心程序,不含文档install-docs:安装多页版 HTML + man 格式文档install-html:安装多页版 HTML 格式文档install-man:安装 man 格式文档install-quiet:静默安装核心程序,不打印安装文件列表install-world:完整安装(核心程序 + 多页版 HTML + man 文档)uninstall:卸载已安装的所有文件
4.5 其他编译目标
clean:清理所有编译产物test:执行所有已启用的测试(含 contrib 模块)world:编译所有内容(核心程序 + 文档)help:列出所有常用编译目标