18.1. 使用 Visual C++ 或 Microsoft Windows SDK 构建 #
PostgreSQL 可以使用 Microsoft 的 Visual C++ 编译器套件构建。这些编译器既可以来自 Visual Studio、Visual Studio Express,也可以来自某些版本的 Microsoft Windows SDK。如果你还没有配置好 Visual Studio 环境,最简单的办法是使用 Visual Studio 2026 中的编译器,或者 Windows SDK 10 中的编译器,这两者都可从 Microsoft 免费下载。
使用 Microsoft 编译器套件既可以构建 32 位版本,也可以构建 64 位版本。32 位 PostgreSQL 可以使用 Visual Studio 2015 到 Visual Studio 2026 构建,也可以使用独立发布的 Windows SDK 10 及以上版本。64 位 PostgreSQL 支持使用 10 及以上版本的 Microsoft Windows SDK 或 Visual Studio 2015 及以上版本构建。
使用 Visual C++或 Platform SDK 构建所需的工具位于 src\tools\msvc 目录中。构建时,请确保系统 PATH 中没有来自 MinGW 或 Cygwin 的工具。同时,也要确保所需的 Visual C++ 工具都已在 PATH 中可用。在 Visual Studio 中,启动 Visual Studio Command Prompt。如果你想构建 64 位版本,就必须使用 64 位版本的命令提示符,反之亦然。从 Visual Studio 2017 开始,可以在命令行中使用 VsDevCmd.bat 来完成这件事,可用选项及其默认值见 -help。vsvars32.bat 在 Visual Studio 2015 及更早版本中可用于同样目的。在 Visual Studio Command Prompt 中,你可以使用 vcvarsall.bat 命令更改目标 CPU 架构、构建类型以及目标操作系统,例如使用 vcvarsall.bat x64 10.0.10240.0 来面向 Windows 10 进行 64 位发行版构建。vcvarsall.bat 的其他选项见 -help。所有命令都应在 src\tools\msvc 目录中运行。
在构建之前,你可以创建 config.pl 文件,以反映你想更改的任何配置选项,或要使用的任何第三方库的路径。完整配置是先读取并解析 config_default.pl 文件,再应用来自 config.pl 的任何更改而得到的。例如,要指定 Python 安装位置,可在 config.pl 中写入以下内容:
$config->{python} = 'c:\python310';
你只需要指定那些与 config_default.pl 中不同的参数。
如果你需要设置其他环境变量,请创建一个名为 buildenv.pl 的文件,并将所需命令放入其中。例如,如果 bison 不在 PATH 中,可以创建一个包含以下内容的文件,以将其路径加入 PATH:
$ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';
如果要向 Visual Studio 构建命令(msbuild 或 vcbuild)传递额外的命令行参数:
$ENV{MSBFLAGS}="/m";
18.1.1. 需求 #
构建 PostgreSQL 需要以下附加产品。请使用 config.pl 文件指定这些库所在的目录。
- Microsoft Windows SDK
如果你的构建环境未附带受支持版本的 Microsoft Windows SDK,建议升级到最新版本(目前为版本 10),可从 https://www.microsoft.com/download 下载。
你必须始终包含 SDK 中的 Windows Headers and Libraries 部分。如果你安装的 Windows SDK 包含 Visual C++ Compilers,则无需 Visual Studio 即可构建。请注意,从 8.0a 版本起,Windows SDK 不再附带完整的命令行构建环境。
- Strawberry Perl
运行构建生成脚本需要 Strawberry Perl。MinGW 或 Cygwin Perl 都无法工作。它还必须出现在 PATH 中。二进制文件可从 https://strawberryperl.com 下载。
以下附加产品并非入门所必需,但若要构建完整的软件包则需要它们。请使用 config.pl 文件指定这些库所在的目录。
- Magicsplat Tcl
构建 PL/Tcl 需要它。二进制文件可从 https://www.magicsplat.com/tcl-installer/index.html 下载。
- Bison 和 Flex
从 Git 构建需要 Bison 和 Flex,但从发布文件构建则不需要。只有 2.3 及以上版本的 Bison 可以工作。Flex 必须为 2.5.35 或更高版本。
Bison 和 Flex 都包含在 msys 工具套件中,可从 http://www.mingw.org/wiki/MSYS 获取,它是 MinGW 编译器套件的一部分。
除非它们已经在 PATH 中,否则你需要把包含
flex.exe和bison.exe的目录加入buildenv.pl中的 PATH 环境变量。对于 MinGW,该目录是你的 MinGW 安装目录下的\msys\1.0\bin子目录。注意
来自 GnuWin32 的 Bison 发行版似乎存在一个 bug:如果安装在名称中含有空格的目录中,Bison 就会工作异常,例如英文安装中的默认位置
C:\Program Files\GnuWin32。请考虑安装到C:\GnuWin32,或者在 PATH 环境设置中使用指向 GnuWin32 的 NTFS 短文件名路径(例如C:\PROGRA~1\GnuWin32)。- Diff
运行回归测试需要 Diff,可从 http://gnuwin32.sourceforge.net 下载。
- Gettext
构建带有 NLS 支持的版本需要 Gettext,可从 http://gnuwin32.sourceforge.net 下载。请注意,二进制文件、依赖项以及开发文件都是必需的。
- MIT Kerberos
支持 GSSAPI 认证需要 MIT Kerberos。MIT Kerberos 可从 https://web.mit.edu/Kerberos/dist/index.html 下载。
- libxml2 和 libxslt
XML 支持需要它们。二进制文件可从 https://zlatkovic.com/pub/libxml 下载,源代码可从 http://xmlsoft.org 获取。请注意,libxml2 需要 iconv,而它可从相同的下载位置获得。
- LZ4
支持 LZ4 压缩需要它。二进制文件和源代码可从 https://github.com/lz4/lz4/releases 下载。
- Zstandard
支持 Zstandard 压缩需要它。二进制文件和源代码可从 https://github.com/facebook/zstd/releases 下载。
- OpenSSL
SSL 支持需要它。二进制文件可从 https://slproweb.com/products/Win32OpenSSL.html 下载,源代码可从 https://www.openssl.org 获取。
- ossp-uuid
支持 UUID-OSSP 需要它(仅 contrib)。源代码可从 http://www.ossp.org/pkg/lib/uuid/下载。
- Python
构建 PL/Python 需要它。二进制文件可从 https://www.python.org 下载。
- zlib
pg_dump 和 pg_restore 中的压缩支持需要它。二进制文件可从 https://www.zlib.net 下载。
18.1.2. 64 位 Windows 的特殊注意事项 #
PostgreSQL 在 64 位 Windows 上只能构建为 x64 架构。
不支持在同一个构建树中混用 32 位和 64 位版本。构建系统会自动检测自己是在 32 位还是 64 位环境中运行,并据此构建 PostgreSQL。因此,在开始构建之前启动正确的命令提示符非常重要。
如果要使用服务器端第三方库,例如 Python 或 OpenSSL,那么该库也必须是 64 位的。64 位服务器不支持加载 32 位库。PostgreSQL 支持的若干第三方库可能只提供 32 位版本,在这种情况下,它们无法与 64 位 PostgreSQL 一起使用。
18.1.3. 构建 #
要以发布配置(默认值)构建 PostgreSQL 的全部内容,请运行以下命令:
build
要以调试配置构建 PostgreSQL 的全部内容,请运行以下命令:
build DEBUG
若只构建单个项目,例如 psql,请运行以下命令:
build psqlbuild DEBUG psql
若要将默认构建配置改为调试模式,请在 buildenv.pl 文件中加入以下内容:
$ENV{CONFIG}="Debug";
也可以在 Visual Studio 图形界面中进行构建。在这种情况下,你需要先从命令提示符运行:
perl mkvcbuild.pl
然后在 Visual Studio 中打开生成的 pgsql.sln(位于源码树根目录)。
18.1.4. 清理和安装 #
大多数时候,Visual Studio 的自动依赖跟踪都会处理好变更过的文件。但如果变更较大,你可能需要清理安装。要执行此操作,只需运行 clean.bat 命令,它会自动清除所有生成的文件。你也可以带上 dist 参数运行它,此时它的行为类似于 make distclean,并且也会删除 flex/bison 的输出文件。
默认情况下,所有文件都会写入 debug 或 release 目录下的某个子目录。若要按标准布局安装这些文件,并同时生成初始化和使用数据库所需的文件,请运行以下命令:
install c:\destination\directory
如果你只想安装客户端应用程序和接口库,则可以使用以下命令:
install c:\destination\directory client
18.1.5. 运行回归测试 #
要运行回归测试,请首先确保已完成所有必需部分的构建。同时,要确保加载系统所有部分所需的 DLL(例如过程语言所需的 Perl 和 Python DLL)已经出现在系统路径中。如果没有,请通过 buildenv.pl 文件进行设置。要运行测试,请从 src\tools\msvc 目录运行以下命令之一:
vcregress checkvcregress installcheckvcregress plcheckvcregress contribcheckvcregress modulescheckvcregress ecpgcheckvcregress isolationcheckvcregress bincheckvcregress recoverycheckvcregress taptest
若要更改所使用的调度(默认为 parallel),可像下面这样将其追加到命令行:
vcregress check serial
vcregress taptest 可用于运行某个目标目录的 TAP 测试,例如:
vcregress taptest src\bin\initdb\
有关回归测试的更多信息,请参见第 33 章。
对客户端程序运行回归测试时使用 vcregress bincheck,对恢复测试使用 vcregress recoverycheck,或者运行由 vcregress taptest 指定的 TAP 测试时,需要额外安装一个 Perl 模块:
- IPC::Run
截至本文写作时,
IPC::Run既未包含在 ActiveState Perl 安装中,也未包含在 ActiveState Perl Package Manager(PPM)库中。要安装它,请下载IPC-Run-<version>.tar.gz源代码归档文件,它来自 CPAN:https://metacpan.org/dist/IPC-Run,并解压。编辑buildenv.pl文件,并增加一个 PERL5LIB 变量,使其指向解压后目录中的lib子目录。例如:$ENV{PERL5LIB}=$ENV{PERL5LIB} . ';c:\IPC-Run-0.94\lib';
使用 vcregress 运行的 TAP 测试支持环境变量 PROVE_TESTS(会根据给定的名称模式自动展开)以及 PROVE_FLAGS。这些变量可在运行 vcregress 之前,于 Windows 终端中设置:
set PROVE_FLAGS=--timer --jobs 2 set PROVE_TESTS=t/020*.pl t/010*.pl
也可以在 buildenv.pl 中设置这些参数:
$ENV{PROVE_FLAGS}='--timer --jobs 2'
$ENV{PROVE_TESTS}='t/020*.pl t/010*.pl'
此外,TAP 测试的行为还可以通过一组环境变量控制,见第 33.4.1 节。
部分 TAP 测试依赖一些外部命令,相关测试会根据这些命令是否可用而选择性触发。以下各变量都可以在 buildenv.pl 中设置或取消设置:
GZIP_PROGRAM指向 gzip 命令的路径。默认值为
gzip,它会在配置好的PATH中搜索该名称的命令。LZ4指向 lz4 命令的路径。默认值为
lz4,它会在配置好的PATH中搜索该名称的命令。OPENSSL指向 openssl 命令的路径。默认值为
openssl,它会在配置好的PATH中搜索该名称的命令。TAR指向 tar 命令的路径。默认值为
tar,它会在配置好的PATH中搜索该名称的命令。ZSTD指向 zstd 命令的路径。默认值为
zstd,它会在配置好的PATH中搜索该名称的命令。
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.