写作计划:
第1期 用Visual Studio编译PostgreSQL依赖包源码及PostgreSQL源码;
第2期 用本次编译的源码讲解如何在Visual Studio中对PostgreSQL进行调试;
第3期 用本次编译的源码讲解如何使用Visual Studio开发跨平台的PostgreSQL插件、插件调试、windows和linux交叉编译插件;
第4期 java使用JDBC实现平滑加权轮询算法的自定义连接池(适用PostgreSQL集群);
第5期 待定
- 操作系统版本Windows 11 X64专业版;
- Visual Studio 2019 Professional;
- 除非有说明,否则以下所有命令均在“开始-》Visual Studio 2019-》x64 Native Tools Command Prompt for VS 2019”命令行中执行;
- 相关工具包含bison、flex、git、diffutils、wget、nasm,并设置环境变量PATH.
1、nls环境
- nls环境编译请参看“在Windows上通过cygwin和VC编译64位iconv库”。编译成功后将include、lib、bin复制到E:/pgsql目录。
mkdir E:\pgsql
mkdir E:\pgsql\include
mkdir E:\pgsql\lib
mkdir E:\pgsql\bin
xcopy E:\tools\nls\include\. E:\pgsql\include /E /Y
xcopy E:\tools\nls\lib\*.lib E:\pgsql\lib /Y
xcopy E:\tools\nls\bin\*.dll E:\pgsql\bin /Y
copy E:\tools\nls\bin\msgfmt.exe E:\pgsql\bin /Y
#编译PostgreSQL时引用的库名称为iconv.lib和libintl.lib
copy E:\pgsql\lib\iconv.dll.lib E:\pgsql\lib\iconv.lib /Y
copy E:\pgsql\lib\intl.dll.lib E:\pgsql\lib\libintl.lib /Y
2、Perl
- 经实际测试PostgreSQL 14当前仅支持Perl 5.26版本,不支持更高版本。
windows perl源码编译部份功能可能不全,请使用ActivePerl安装包安装。本教程使用的是perl源码编译。
设置环境变量PAPH(perl=perl\bin)
ppm install dmake
设置环境变量PAPH(dmake=perl\site\bin)
源码下载安装,按需执行
#源码安装
cd D:/build/pg
tar -xf perl-5.26.3.tar.bz2
cd perl-5.26.3/win32
#修改Makefile文件
#如果要编译32位,则取消Makefile文件WIN64前的注释
#修改安装目录INST_DRV,我的INST_DRV=E:\tools\perl
#修改编译器,根据您的编译器取消CCTYPE前的注释,同时注释默认的CCTYPE
nmake -f Makefile
nmake -f Makefile test
nmake -f Makefile install
#设置环境变量,将E:/perl添加至PATH中
perl -version
cd D:/build/pg
rd /S /Q D:\build\pg\perl-5.26.3
copy E:\tools\perl\bin\perl526.dll E:\pgsql\bin /Y
3、tcl/tk
windows tcl/tk源码编译部份功能可能不全,请使用ActiveTcl安装包安装。本教程使用的是tcl/tk源码编译。
设置环境变量PAPH(perl=tcl\bin)
源码下载,按需执行
cd D:/build/pg
tar -xf tcl8.6.12-src.tar.gz
cd tcl8.6.12/win
nmake -f makefile.vc
nmake -f makefile.vc test
nmake -f makefile.vc install INSTALLDIR=E:/tools/tcl
copy E:\tools\tcl\bin\tcl86t.dll E:\pgsql\bin /Y
cd D:/build/pg
tar -xf tk8.6.12-src.tar.gz
cd tk8.6.12/win
nmake -f makefile.vc TCLDIR=D:/build/pg/tcl8.6.12
nmake -f makefile.vc test TCLDIR=D:/build/pg/tcl8.6.12
nmake -f makefile.vc install TCLDIR=D:/build/pg/tcl8.6.12 INSTALLDIR=E:/tools/tcl
copy E:\tools\tcl\bin\tk86t.dll E:\pgsql\bin /Y
cd D:/build/pg
rd /S /Q D:\build\pg\tcl8.6.12
rd /S /Q D:\build\pg\tk8.6.12
4、编译ZLIB
cd D:/build/pg
tar -xf zlib-1.2.11.tar.gz
cd zlib-1.2.11
mkdir build
cd build
cmake -G "NMake Makefiles" -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=E:/pgsql -DCMAKE_BUILD_TYPE=Release ..
nmake & nmake install
cd D:/build/pg
rd /S /Q D:\build\pg\zlib-1.2.11
#编译PostgreSQL时引用的库名称为zdll.lib
copy E:\pgsql\lib\zlib.lib E:\pgsql\lib\zdll.lib /Y
5、python
下载,下载最新版本和2.7版本。
- openssl编译需要Python3版本;
- libxml编译需要Python2版本;
- PostgreSQL如果需要Python函数功能,则选择Python3或Python2中的一个。
6、lz4
cd D:/build/pg
tar -xf lz4-1.9.3.tar.gz
打开lz4-1.9.3/build/VS2017/lz4.sln
#修改为Release,平台为x64
#编译项目liblz4-dll
#cd lz4-1.9.3/build/VS2017/liblz4-dll
#MSBuild.exe liblz4-dll.vcxproj -p:Configuration=Release -p:Platform=x64
copy D:\build\pg\lz4-1.9.3\lib\lz4.h E:\pgsql\include /Y
copy D:\build\pg\lz4-1.9.3\lib\lz4hc.h E:\pgsql\include /Y
copy D:\build\pg\lz4-1.9.3\lib\lz4frame.h E:\pgsql\include /Y
copy D:\build\pg\lz4-1.9.3\build\VS2017\bin\x64_Release\liblz4.lib E:\pgsql\lib /Y
copy D:\build\pg\lz4-1.9.3\build\VS2017\bin\x64_Release\liblz4.dll E:\pgsql\bin /Y
cd D:/build/pg
rd /S /Q lz4-1.9.3
7、编译ICU
- 源码目录早的icu4c表示是C语言函数,icu4j表示是java语言函数
cd D:/build/pg
tar -xf icu-release-70-1.tar.gz
7z x icu-data-main.zip -o.
#解压icu-data后,将解压目录tzdata/icunew/2021a4/44/le中的metaZones.res、timezoneTypes.res、windowsZones.res、zoneinfo64.res复制至D:/build/pg/icu-release-70-1/icu4c/source/data/in目录中
copy D:\build\pg\icu-data-main\tzdata\icunew\2021a4\44\le\metaZones.res D:\build\pg\icu-release-70-1\icu4c\source\data\in /Y
copy D:\build\pg\icu-data-main\tzdata\icunew\2021a4\44\le\timezoneTypes.res D:\build\pg\icu-release-70-1\icu4c\source\data\in /Y
copy D:\build\pg\icu-data-main\tzdata\icunew\2021a4\44\le\windowsZones.res D:\build\pg\icu-release-70-1\icu4c\source\data\in /Y
copy D:\build\pg\icu-data-main\tzdata\icunew\2021a4\44\le\zoneinfo64.res D:\build\pg\icu-release-70-1\icu4c\source\data\in /Y
cd icu-release-70-1/icu4c/source/allinone
MSBuild.exe allinone.sln -p:Configuration=Release -p:Platform=x64
icucheck.bat x64 Release
mkdir E:\tools\icu
mkdir E:\tools\icu\include
mkdir E:\tools\icu\lib64
mkdir E:\tools\icu\lib64uwp
mkdir E:\tools\icu\bin64
mkdir E:\tools\icu\bin64uwp
xcopy D:\build\pg\icu-release-70-1\icu4c\include\. E:\tools\icu\include /E /Y
xcopy D:\build\pg\icu-release-70-1\icu4c\lib64\. E:\tools\icu\lib64 /E /Y
xcopy D:\build\pg\icu-release-70-1\icu4c\lib64uwp\. E:\tools\icu\lib64uwp /E /Y
xcopy D:\build\pg\icu-release-70-1\icu4c\bin64\. E:\tools\icu\bin64 /E /Y
xcopy D:\build\pg\icu-release-70-1\icu4c\bin64uwp\. E:\tools\icu\bin64uwp /E /Y
copy E:\tools\icu\bin64\icudt70.dll E:\pgsql\bin /Y
copy E:\tools\icu\bin64\icuio70.dll E:\pgsql\bin /Y
copy E:\tools\icu\bin64\icutu70.dll E:\pgsql\bin /Y
copy E:\tools\icu\bin64\icuin70.dll E:\pgsql\bin /Y
copy E:\tools\icu\bin64\icuuc70.dll E:\pgsql\bin /Y
cd D:/build/pg
rd /S /Q icu-data-main
rd /S /Q icu-release-70-1
8 liblzma
cd D:/build/pg
tar -xf liblzma-5.2.5.tar.gz
cd liblzma-5.2.5/windows/vs2019
MSBuild.exe xz_win.sln -p:Configuration=Release -p:Platform=x64
xcopy D:\build\pg\liblzma-5.2.5\src\liblzma\api E:\pgsql\include /E
copy D:\build\pg\liblzma-5.2.5\windows\vs2019\Release\x64\liblzma_dll\liblzma.lib E:\pgsql\lib /Y
copy D:\build\pg\liblzma-5.2.5\windows\vs2019\Release\x64\liblzma_dll\liblzma.dll E:\pgsql\bin /Y
copy D:\build\pg\liblzma-5.2.5\windows\vs2019\Release\x64\liblzma_dll\liblzma.dll E:\pgsql\bin /Y
copy D:\build\pg\liblzma-5.2.5\windows\vs2019\Release\x64\liblzma_dll\liblzma.dll E:\pgsql\bin /Y
cd D:\build\pg
rd /S /Q liblzma-5.2.5
9、libxml
cd D:/build/pg
git clone https://gitlab.gnome.org/GNOME/libxml2.git
cd libxml2
mkdir build
cd build
cmake -G "NMake Makefiles" -DBUILD_SHARED_LIBS=ON -DLIBXML2_WITH_ICU=ON -DICU_ROOT=E:/tools/icu -DIconv_INCLUDE_DIR=E:/pgsql/include -DIconv_LIBRARY=E:/pgsql/lib/iconv.lib -DLIBLZMA_INCLUDE_DIR=E:/pgsql/include -DLIBLZMA_LIBRARY_RELEASE=E:/pgsql/lib/liblzma.lib -DZLIB_INCLUDE_DIR=E:/pgsql/include -DZLIB_LIBRARY_RELEASE=E:/pgsql/lib/zlib.lib -DPython2_INCLUDE_DIRS=E:/tools/Python27 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=E:/tools/libxml ..
#如果编译出错,将E:/tools/icu/include/unicode目录复制到E:\pgsql\include,待编译安装libxslt后再删除E:\pgsql\include\unicode
nmake
nmake install
cd D:/build/pg
rd /S /Q D:\build\pg\libxml2
copy E:\tools\libxml\bin\libxml2.dll E:\pgsql\bin /Y
10、libxslt
cd D:/build/pg
git clone https://gitlab.gnome.org/GNOME/libxslt.git
cd libxslt
mkdir build
cd build
cmake -G "NMake Makefiles" -DBUILD_SHARED_LIBS=ON -DIconv_INCLUDE_DIR=E:/pgsql/include -DIconv_LIBRARY=E:/pgsql/lib/iconv.dll.lib -DCMAKE_BUILD_TYPE=Release -DLibXml2_DIR=E:/tools/libxml -DCMAKE_INSTALL_PREFIX=E:/tools/libxml ..
nmake
nmake install
cd D:/build/pg
rd /S /Q D:\build\pg\libxslt
copy E:\tools\libxml\bin\libxslt.dll E:\pgsql\bin /Y
copy E:\tools\libxml\bin\libexslt.dll E:\pgsql\bin /Y
11、openssl
cd D:/build/pg
tar -xf openssl-1.1.1l.tar.gz
cd openssl-1.1.1l
perl Configure VC-WIN64A --release --prefix=E:/tools/openssl
nmake
nmake install
cd D:/build/pg
rd /S /Q D:\build\pg\openssl-1.1.1l
copy E:\tools\openssl\bin\libcrypto-1_1-x64.dll E:\pgsql\bin /Y
copy E:\tools\openssl\bin\libssl-1_1-x64.dll E:\pgsql\bin /Y
12、gssapi[可选,一般不使用]
GSSAPI介绍,来自维基百科
GSSAPI(Generic Security Services Application Program Interface)是一个应用程序编程接口,用于程序访问安全服务。
GSSAPI是一种IETF标准,它解决了目前使用的许多类似但不兼容的安全服务的问题。
GSSAPI本身不提供任何安全性。相反,安全服务供应商提供GSSAPI实现- 通常以随其安全软件一起安装的库的形式。这些库向应用程序编写者提供与 GSSAPI 兼容的接口,这些编写者可以将其应用程序编写为仅使用独立于供应商的GSSAPI。如果安全实现需要替换,则无需重写应用程序。
GSSAPI应用程序的明确功能是交换不透明的消息(令牌),这些消息(令牌)隐藏了更高级别的应用程序的实现细节。编写应用程序的客户端和服务器端是为了传达其各自的 GSSAPI 实现提供给它们的令牌。GSSAPI 令牌通常可以通过不安全的网络传输,因为这些机制提供了固有的消息安全性。在交换了一定数量的令牌之后,两端的 GSSAPI 实现会通知其本地应用程序已建立安全上下文。
建立安全上下文后,GSSAPI 可以对敏感的应用程序消息进行包装(加密),以便在客户端和服务器之间进行安全通信。GSSAPI包装保证的典型保护包括机密性(保密性)和完整性(真实性)。GSSAPI 还可以提供有关远程用户或远程主机身份的本地保证。
正在使用的主要GSSAPI机制实现是Kerberos。与 GSSAPI 不同,Kerberos API 尚未标准化,各种现有实现使用不兼容的 API。GSSAPI 允许 Kerberos 实现与 API 兼容。
双击kfw-4.1-amd64.exe选择自定义安装
复制所有dll至pg安装目录
xcopy E:\tools\Kerberos\bin\*.dll E:\pgsql\bin /E /Y
13、ossp-uuid
cd D:/build/pg
7z x ossp_uuid.rar -oD:/build/pg
#打开ossp_uuid/ossp_uuid.vcxproj
#修改平台为x64,配置为Release,配置类型为静态库,字符集为未设置,编译项目。
xcopy D:\build\pg\ossp_uuid\include E:\pgsql\include /E /Y
copy D:\build\pg\ossp_uuid\ossp_uuid\x64\Release\ossp_uuid.lib E:\pgsql\lib\uuid.lib /Y
cd D:/build/pg
rd /S /Q D:\build\pg\ossp_uuid
14、expat
cd D:/build/pg
tar -xf libexpat-R_2_2_6.tar.gz
cd libexpat-R_2_2_6/expat
mkdir build
cd build
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=E:/pgsql ..
nmake
nmake install
cd D:/build/pg
rd /S /Q D:\build\pg\libexpat-R_2_2_6
15 PostgreSQL
15.1 设置软件包
cd D:/build/pg
tar -xf postgresql-14.1.tar.gz
修改D:\build\pg\postgresql-14.1\src\tools\msvc\config_default.pl内容如下
our $config = {
asserts => 0, # --enable-cassert
# blocksize => 8, # --with-blocksize, 8kB by default
# wal_blocksize => 8, # --with-wal-blocksize, 8kB by default
ldap => 1, # --with-ldap
extraver => 'kmblack', # --with-extra-version=<string> 将您填写的内容附加到PostgreSQL版本号,在需要显示版本号字符串的地方会显示此字符串,例如:starting PostgreSQL 14.1kmblack, compiled by Visual C++ build 1929, 64-bit
#gss => 'E:/tools/Kerberos', # --with-gssapi=<path>
gss => undef,
icu => 'E:/tools/icu', # --with-icu=<path>
lz4 => 'E:/pgsql', # --with-lz4=<path>
nls => 'E:/pgsql', # --enable-nls=<path>
tap_tests => 1, # --enable-tap-tests
tcl => 'E:/tools/tcl', # --with-tcl=<path>
perl => 'E:/tools/perl', # --with-perl=<path>
python => 'C:/Python310', # --with-python=<path>
openssl => 'E:/tools/openssl', # --with-ssl=openssl with <path>
uuid => 'E:/pgsql', # --with-uuid=<path>
xml => 'E:/tools/libxml', # --with-libxml=<path>
xslt => 'E:/tools/libxml', # --with-libxslt=<path>
iconv => 'E:/pgsql', # (not in configure, path to iconv)
zlib => 'E:/pgsql' # --with-zlib=<path>
};
15.2 开始编译
cd D:\build\pg\postgresql-14.1\src\tools\msvc
#编译为Release版本
#perl build.pl
#生成DEBUG版本
perl build.pl DEBUG
#运行回归测试
copy E:\pgsql\bin\intl-8.dll D:\build\pg\postgresql-14.1\Debug\zic /Y
copy E:\pgsql\bin\iconv-2.dll D:\build\pg\postgresql-14.1\Debug\zic /Y
xcopy E:\pgsql\bin\*.dll D:\build\pg\postgresql-14.1\tmp_install\bin /E /Y
perl vcregress.pl check
#测试成功后安装到目录
perl install.pl E:\pgsql
#perl install.pl C:\pgsql32
安装成功后将
E:\pgsql\bin
添加到环境变量PATH.然后打开命令行测试是否安装成功.
psql --help
D:\build\pg\postgresql-14.1目录不要删除,它包含有我们调试pg所需要的信息,在以后使用Visual Studio调试pg还要使用这个目录。