This is an old revision of the document!
LibPq (Postgresql Client Library) Windows, How to compile
Building LibPq 8.3.x
Requirements
- Common tools used to compile PHP
- Native Perl from ActiveState (http://www.activestate.com/Products/activeperl/) installed and perl being in your PATH
- Postgresql sources (http://pecl2.php.net/downloads/php-windows-builds/source/ Custom sources for VC6)
Dependencies
- OpenSSL build (http://pecl2.php.net/downloads/php-windows-builds/php-libs/)
Modification to the config scripts (all VCs)
To make it works smoothly with our libraries, it is first needed to modify the script to look for:
- zlib.lib instead of zdll.lib
- ssleay32.lib instead of ssleay32MD.lib
- libeay32.lib instead of libeay32MD.lib
and for the debug versions:
- zlib_debug.lib instead of zdll.lib
- ssleay32_debug.lib instead of ssleay32MDd.lib
- libeay32_debug.lib instead of libeay32MDd.lib
To do so, open src\tools\msvc\Solution.pm (line 332):
$proj->AddLibrary($self->{options}->{zlib} . '\lib\zlib.lib');
The configuration option given through the command line does not work. Edit the src\tools\msvc\config.pl to define the correct path. Here is an example using my local config:
our $config = { asserts=>0, # --enable-cassert integer_datetimes=>0, # --enable-integer-datetimes nls=>undef, # --enable-nls=<path> tcl=>'c:\tcl', # --with-tls=<path> perl=>'c:\perl', # --with-perl python=>'c:\python24', # --with-python=<path> #krb5=>'c:\prog\pgsql\depend\krb5', # --with-krb5=<path> krb5=>0, ldap=>0, # --with-ldap openssl=>'c:\Users\pierre\Documents\php-sdk\vc8\x86\deps', # --with-ssl=<path> uuid=>'c:\prog\pgsql\depend\ossp-uuid', #--with-ossp-uuid xml=>'c:\Users\pierre\Documents\php-sdk\vc8\x86\deps', xslt=>'c:\prog\pgsql\depend\libxslt', iconv=>'c:\prog\pgsql\depend\iconv', zlib=>'c:\Users\pierre\Documents\php-sdk\vc8\x86\deps'# --with-zlib=<path> };
Nothing else is necessary as long as the VC version is 2005 or later. See the next section for the changes I applied for the VC6 builds.
Modification to the sources (VC6) only
libpq relies on SHGetFolderPath which is not available in the Platform SDK used by VC6 (2003/02). Modify the file \src\backend\libpq\fe-connect.c (line 3812) as follow:
#ifndef SHGetFolderPath { HMODULE shfolder = LoadLibrary("shfolder.dll"); FARPROC qSHGetFolderPath; #define CSIDL_PROGRAM_FILES 38 #define CSIDL_APPDATA 0x001a char szPath[MAX_PATH]; shfolder = LoadLibrary("shfolder.dll"); if(shfolder == NULL) { return false; } qSHGetFolderPath = GetProcAddress(shfolder, "SHGetFolderPathA"); if (qSHGetFolderPath == NULL) { FreeLibrary(shfolder); return NULL; } if (qSHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath)) { FreeLibrary(shfolder); return NULL; } } #else if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, tmppath) != S_OK) return false; #endif
Further changes have to be done after having run the configure scripts, to update pg_config.h, pg_config_os.h, see the next section for the details.
Compile
The automatic build works smoothly for VC8 and VC9. However it is not compatible with VC6, the generated files have to be slightly modified after that build.bat has been called (and failed with many errors).
cd C:\php-sdk\vc9\x86\libs_builds\postgresql-8.3.3\tools\msvc
build.bat libpq
Modify src\src\include\pg_config.h as follow, line 136:
/* Define to 1 if your compiler understands __FUNCTION__. */ #if _MSV_VER >= 1500 #define HAVE_FUNCNAME__FUNCTION 1 #endif