用Visual Studio编译PostgreSQL依赖包源码及PostgreSQL源码

写作计划:

第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”命令行中执行;
  • 相关工具包含bisonflexgitdiffutilswgetnasm,并设置环境变量PATH.

1、nls环境

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

参考文献

下载icu

下载icu-data

  • 源码目录早的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选择自定义安装

在这里插入图片描述

一定勾选SDK包

复制所有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还要使用这个目录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值