16.1. 用Visual C++Microsoft Windows SDK编译

PostgreSQL可以使用微软的Visual C++编译器套件来编译。 这些编译器可以是Visual Studio, Visual Studio Express或者某些版本的Microsoft Windows SDK。 如果没有安装Visual Studio的环境, 最简单的方法是使用Windows SDK 7.1或者Visual Studio Express 2012 for Windows Desktop中的编译器, 它们都可以从微软官网免费下载。

PostgreSQL支持从Visual Studio 2005Visual Studio 2012(包括精简版)的编译器, 以及6.0到7.1版本的独立的Windows SDK编译器。 64位的PostgreSQL只支持6.0a到7.1版本的Microsoft Windows SDKVisual Studio 2008及其以上版本。

Visual C++Platform SDK编译的工具在src/tools/msvc目录下。 编译时,确保系统路径下没有包含MinGWCygwin的工具,同时确保需要的Visual C++的所有工具在系统路径中。 在Visual Studio中,启动Visual Studio Command Prompt。 如果需要编译64位的版本,使用64位版本的命令,反之亦然。在Microsoft Windows SDK中, 从开始菜单中SDK下的列表启动CMD shell。在最新版的SDK中, 你可以使用setenv等命令来更改目标的CPU架构,编译类型和操作系统类型等。 指令setenv /x86 /release /xp用来编译Windows XP或更新的32位版本。 使用/?命令可以查看setenv的其它选项。 所有命令都应该在src\tools\msvc目录下运行。

在编译前,根据需要修改config.pl中相应选项和使用到的第三方库的路径。 完整的配置由首先读取和解析的config_default.pl决定,然后从config.pl适用所有的变更。 例如,为了指定Python的安装路径,在config.pl文件中添加以下语句:

$config->{python} = 'c:\python26';

只需要指定和config_default.pl文件中有差别的参数。

如果需要指定其它的环境变量,创建一个buildenv.pl文件并写入所需要的命令。 例如,为了在PATH中添加还不存在的bison的位置,创建一个文件包含以下内容:

$ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';

16.1.1. 要求

编译PostgreSQL还需要以下几个工具。 使用config.pl文件来指定这些库的路径。

Microsoft Windows SDK

如果编译环境不兼容所支持的Microsoft Windows SDK版本, 建议把SDK的版本升级到最新的版本(目前为7.1版本),下载地址为http://www.microsoft.com/downloads/

你必需包含SDK的Windows头文件和库。 如果安装的Windows SDK中已经包含了Visual C++ Compilers, 就不再需要使用Visual Studio进行编译了。 注意Windows SDK 8.0a之后的版本不再附有完整的命令行编译环境。

ActiveState Perl

运行编译生成脚本时需要ActiveState Perl。而MinGW或Cygwin的Perl则不起作用。 同样,它的路径也要添加到系统路径中。二进制文件下载地址为http://www.activestate.com (注意: 必须使用5.8或者更新的版本, 免费的标准版既可)。

下面的工具在开始时是不需要的,但是对于完整的包的编译是必须的。 使用config.pl文件来指定这些库的路径。

ActiveState TCL

用于编译PL/TCL(注意:要求8.4版本, 免费的标准版既可)。

BisonFlex

BisonFlex用来从GIT进行编译,对于发行版文件的编译是不需要的。 Bison需要1.875或2.2及更新版本。Flex需要使用2.5.31或更新版本。

BisonFlex包含在msys工具套件内。 作为MinGW编译器套件的一部分,msys可以从http://www.mingw.org/wiki/MSYS获得。 同时作为msysGit的一部分,msys也可以从http://git-scm.com/获得。

buildenv.pl中,需要把包含flex.exebison.exe的目录添加到系统路径中, 除非它们已经存在于系统路径中。对于MinGW, 要把MinGW安装目录的子目录路径\msys\1.0\bin添加到系统路径中。 对于msysGit,要把Git安装目录下的bin目录添加到系统路径中。不要添加MinGW编译工具本身的目录到系统路径中。

注意: GnuWin32中的Bison存在一个bug,当文件安装的路径中含有空格的时候,会导致Bison出现故障。 例如,用英文安装时的默认路径C:\Program Files\GnuWin32时会出现上述问题,解决办法是安装在类似C:\GnuWin32这样的目录, 或者在GnuWin32的环境变量PATH中使用NTFS短名称路径(例如C:\PROGRA~1\GnuWin32)。

注意: 在PostgreSQL FTP上的winflex是旧的二进制版本并且引用旧的文档,在64位Windows主机上执行时, 会报"flex: fatal internal error, exec failed"的错误。可以使用msys中的flex来替代以避免这个问题。

Diff

Diff用于进行回归测试,可以从http://gnuwin32.sourceforge.net下载。

Gettext

Gettext用于编译NLS支持,可以从http://gnuwin32.sourceforge.net下载。 需要注意的是二进制文件,依赖项和开发文件都需要。

MIT Kerberos

MIT Kerberos 用于提供Kerberos认证支持,可以从http://web.mit.edu/Kerberos/dist/index.html下载。

libxml2libxslt

libxml2和libxslt用于提供XML支持。可以从http://zlatkovic.com/pub/libxml下载二进制文件, 也可以从http://xmlsoft.org下载源代码。需要注意,libxml2需要iconv,也在上面的地址下载。

openssl

openssl用于提供SSL支持。可以从http://www.slproweb.com/products/Win32OpenSSL.html下载二进制文件, 或者在http://www.openssl.org下载源代码。

ossp-uuid

ossp-uuid用于提供UUID-OSSP支持(仅用于contrib)。可以从http://www.ossp.org/pkg/lib/uuid/下载源码。

Python

Python用于编译PL/Python。可以从http://www.python.org下载二进制文件。

zlib

zlib用于为pg_dumppg_restore提供压缩支持。可以从http://www.zlib.net下载二进制文件。

16.1.2. 针对64位Windows的注意事项

在64位Windows上只能编译x64架构的PostgreSQL,不支持安腾的处理器。

同一个编译树上不支持32位和64位的混编。编译系统能自动检测平台环境是32位或64位, 并编译出对应版本。因此,在编译前启动正确的命令行很重要。

要使用服务器端的第三方库,如pythonopenssl,这些库必须是64位的。64位服务器上不支持对32位库的加载。 一些PostgreSQL支持的第三方库只有32位的版本,这种情形下,它们不能被64位的PostgreSQL使用。

16.1.3. 编译

使用发行版配置(默认)来编译完整的PostgreSQL,运行命令:

build

使用调试配置来编译完整的PostgreSQL,运行命令:

build DEBUG

只编译单个项目,例如psql,运行命令:

build psql
build DEBUG psql

要将默认的编译配置改为调试配置,需要在buildenv.pl文件中加入下面的内容:

$ENV{CONFIG}="Debug";

也可以Visual Studio的图形化界面来编译,这时需要在命令行中运行:

perl mkvcbuild.pl

然后在Visual Studio中打开生成的pgsql.sln文件(源码树的根目录)。

16.1.4. 清除和安装

大多数时候,Visual Studio会自动追踪所依赖的文件的改动。但是当有大量改动的的时候,可能需要清除安装。 要做到这一点,只需简单的运行clean.bat,它将自动的清除生成的所有文件。 也可以在运行时添加dist参数,它的行为和make distclean命令比较相似,同时会清除flex/bison的输出文件。

默认情况下,所有的文件都会写在debugrelease目录的一个子目录下面。要使用标准设置安装这些文件, 初始化这些生成的文件并使用数据库,运行命令:

install c:\destination\directory

16.1.5. 运行回归测试

要运行回归测试,首先确保已经完成所需的部分的编译。同时,确保用来加载系统所有部分(例如程序语言Perl和Python的DLLs)的DLLs已经在系统路径中存在。 如果没有,通过buildenv.pl文件来设置。要运行测试,在src\tools\msvc目录中运行下面命令中的一个:

vcregress check
vcregress installcheck
vcregress plcheck
vcregress contribcheck

要改变调度方式(默认是并行),将它加在命令行后:

vcregress check serial

关于回归测试的更多内容,参见第 30 章

16.1.6. 编译文档

把PostgreSQL文档编译成HTML格式需要一些工具和文件。为所有这些文件创建一个根目录,将它们存储在下列的子目录中。

OpenJade 1.3.1-2

http://sourceforge.net/projects/openjade/files/openjade/1.3.1/openjade-1_3_1-2-bin.zip/download下载并解压到子目录openjade-1.3.1中。

DocBook DTD 4.2

http://www.oasis-open.org/docbook/sgml/4.2/docbook-4.2.zip下载并解压到子目录docbook中。

DocBook DSSSL 1.79

http://sourceforge.net/projects/docbook/files/docbook-dsssl/1.79/docbook-dsssl-1.79.zip/download下载并解压到子目录docbook-dsssl-1.79中。

ISO character entities

http://www.oasis-open.org/cover/ISOEnts.zip下载并解压到子目录docbook中。

编辑buildenv.pl文件,为根目录的地址增加一个变量,如:

$ENV{DOCROOT}='c:\docbook';

要编译文档,运行builddoc.bat文件。注意为了生成索引, 实际上编译会运行两次。生成的HTML文件存在于doc\src\sgml中。