Solution: On Windows with Mingw, how to Install PostgreSQL with zlib, pltcl, plperl, and plpython

From: Andre Mikulec <andre_mikulec(at)hotmail(dot)com>
To: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Solution: On Windows with Mingw, how to Install PostgreSQL with zlib, pltcl, plperl, and plpython
Date: 2016-10-31 03:11:18
Message-ID: CY1PR03MB218754CD8AA1861D4CBC43A09CAF0@CY1PR03MB2187.namprd03.prod.outlook.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general


Thanks for all of the help.
Here, is the summary that I had promised.

In addition to the documentation here

https://www.postgresql.org/docs/manuals/
and
https://wiki.postgresql.org/wiki/Main_Page

I will explain how I install PostgreSQL using
on Windows using Mingw with zlib, pltcl, plperl, and plpython.

This information presented here is only meant to explain
solutions to things that are a little 'more difficult' on Windows.

Begin acquiring the software.

Get already compiled zlib here
ftp://ftp.zlatkovic.com/libxml/64bit/

Specifically, get exactly zlib from here.
ftp://ftp.zlatkovic.com/libxml/64bit/zlib-1.2.8-win32-x86_64.7z

(Note, the zlib home is actually here: http://www.zlib.net/)

Extract, those folders and files to a folder on disk.

For example.
C:\Users\TargetUser\Documents\zlib-1.2.8-win32-x86_64

Identify the header(include) and lib directories.

C:\Users\TargetUser\Documents\zlib-1.2.8-win32-x86_64\include
C:\Users\TargetUser\Documents\zlib-1.2.8-win32-x86_64\lib

Note those locations, and save that information for later

Information about the languages follow.

Get to know what the needed library versions from here.

(1) TCL with TK; 8.5
(2) Perl; 5.20
(3) Python; 3.3
http://get.enterprisedb.com/docs/README-languagepack-950.txt

(1) TCL with TK; 8.5
(2) Perl; 5.20
(3) Python; 3.3
http://get.enterprisedb.com/docs/README-edb-languagepack-9.6.txt

Get Python and Perl from the Graphical installer from here.
http://www.enterprisedb.com/products-services-training/pgdownload#windows

Download the graphical installer and
install (1) Python and (2) PERL

Make a note of where the perl.exe and python.exe files are located.

C:\EnterpriseDB\LanguagePack\9.5\x64\Perl-5.20\bin\perl.exe
C:\EnterpriseDB\LanguagePack\9.5\x64\Python-3.3\python.exe

Do not install TCL from EnterpriseDB.

If one were TOO install the TCL from EnterpriseDB and
if one were to inspect the tclConfig.sh file that is found in the 'lib' directory,
a surprise may be seen.

The EnterpriseDB TCL tclConfig.sh file has a hard coded TCL_LIB_SPEC

TCL_LIB_SPEC='C:\EnterpriseDB\LanguagePack\9.5\x64\Tcl-8.5\lib\tcl85.lib'

But the TCL_LIB_SPEC actually needs to be something like

TCL_LIB_SPEC='-LC:/Path/To/folder/lib -ltcl85'

So EnterpriseDB TCL can not be used in the compiling
of the TCL language into PostgreSQL.
I found that to be surprising.

Download TCL from here.
https://www.tcl.tk/software/tcltk/

Specifically here
https://www.tcl.tk/software/tcltk/8.5.html

Install those files to a convenient place.

C:\Tcl.8.5.18.0

Inspect the tclConfig.sh file that is found in the 'lib' directory
This line

TCL_LIB_SPEC='-LC:/Tcl.8.5.18.0/lib -ltcl85'

is the form

TCL_LIB_SPEC='-LC:/Path/To/folder/lib -ltcl85'

So, this TCL is useful

Make a note of where the tclsh.exe executable is located

C:\Tcl.8.5.18.0\bin\tclsh.exe

The pexports.exe file is needed. This is NOT included in the
standard Mingw distribution ( but the dlltool.exe is in Mingw ).

This pexports.exe file is called a Mingw Extension.

For each language:Tcl, Perl, and Python,
pexports ( driven and done in 'make' later ) will run the following.

pexports LANGUAGE.dll > LANGUAGE.def
dlltool --dllname LANGUAGE.dll --def LANGUAGE.def --output-lib LANGUAGE.a

Specifically,

pexports /c/Tcl.8.5.18.0/bin//tcl85.dll > tcl85.def
dlltool --dllname tcl85.dll --def tcl85.def --output-lib libtcl85.a

pexports /c/EnterpriseDB/LanguagePack/9.5/x64/Perl-5.20/bin/perl520.dll > perl520.def
dlltool --dllname perl520.dll --def perl520.def --output-lib libperl520.a

pexports C:/Windows/system32/python33.dll > python33.def
dlltool --dllname python33.dll --def python33.def --output-lib libpython33.a

Notice, that the Python33.dll comes from the C:\Windows\system32 folder
and NOT the 'same directory as the executable' that Perl and TCL use.
I found that to be surprising.

Get pexports.exe from one of two places.

In one place, a compiled pexports.exe can found with
the Strawberry Perl distribution.

Specifically it is in here.

C:\Strawberry\c\bin

The other place is the source.
A person would have to manually compile and make the pexports.exe file.
The source is here.
https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/

Copy the pexports.exe to the same place where
the Mingw dlltool.exe is located ( this is already in the Mingw PATH ).

That is specifically here.

C:\x86_64-6.2.0-release-posix-seh-rt_v5-rev0\mingw64\bin

That was the end of acquiring the software.

This is the beginning of compiling.

Prepare to start an msys shell.

Edit the msys.bat file: C:\MinGW\msys\1.0\msys.bat

Near the top of the msys.bat file add the simple line that
removes anything not important to the compiling process from the PATH.

set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\

In the MSYS shell at the command prompt($),
place the LANGUAGE .exes in the path.

export PATH=/c/Tcl.8.5.18.0/bin:$PATH
export PATH=/c/EnterpriseDB/LanguagePack/9.5/x64/Perl-5.20/bin:$PATH
export PATH=/c/EnterpriseDB/LanguagePack/9.5/x64/Python-3.3:$PATH

Configure.
Below are the options I use and why.

Start configuration.

./configure

Languages: their .exe files are in the path.

The ./lib and ./include locations
seems to be picked up from the location of the .exe in the PATH.
So no other ./include nor ./lib information are needed.
I found that to be slightly surprising.

-with-tcl --with-python --with-perl

zlib

--with-includes=/c/Users/TargetUser/Documents/zlib-1.2.8-win32-x86_64/include --with-libraries=/c/Users/TargetUser/Documents/zlib-1.2.8-win32-x86_64/lib

Compile target

--host=x86_64-w64-mingw32

Install location ( files are copied here as a result of 'make install' )

--prefix=/usr/local/pgsql_0ab9c56_debug

Make PostgreSQL relocatable, so I can move the binaries
to a different folder later and PostgreSQL will still start up.

--disable-rpath

For development, if a change is done such that something is re-compiled,
then dependent objects also get re-compiled.

--enable-depend

Debugging help

--enable-cassert --enable-debug

So, I can track exactly which github mirror version I have.
Also, I can track how much debugging information I have.

--with-extra-version=_CFLAGS_O_0ab9c56

For development, turn off optimizations,
so I can see the values of 'more' variables to aid in debugging.

CFLAGS="-O -fno-omit-frame-pointer"

So the configure line would approximately look like this.
However running it would still require it all to be on one very very long line.

./configure -with-tcl --with-python --with-perl
--with-includes=/c/Users/AnonymousUser/Documents/zlib-1.2.8-win32-x86_64/include --with-libraries=/c/Users/AnonymousUser/Documents/zlib-1.2.8-win32-x86_64/lib
--host=x86_64-w64-mingw32 --prefix=/usr/local/pgsql_0ab9c56_debug
--disable-rpath --enable-depend --enable-cassert --enable-debug
--with-extra-version=_CFLAGS_O_0ab9c56 CFLAGS="-O -fno-omit-frame-pointer"

After configuring, do the following.

Clean up with

make clean

Make with

make

Check with

make check

(Above) 'make check' actually makes a mini PostgreSQL,
so I make sure that I do not have another PostgreSQL up and
listening on the same ( default ) port of 5432.

Install with

make install

That was the end of compiling.

This is the beginning of extension creation.

Plan to startup PostgreSQL.

Get Portable PostgreSQL from here.
https://sourceforge.net/projects/postgresqlportable/

Extract the 'startup batch' file.

Customize the startup batch as necessary.
In the 'startup batch',
put the tclsh.exe, perl.exe,and python.exe 'paths' in the PATH.
Also, set the PYTHONHOME environment variable.

It is all explained in here.
http://get.enterprisedb.com/docs/README-languagepack-950.txt
http://get.enterprisedb.com/docs/README-edb-languagepack-9.6.txt

Place the 'startup batch' file in the parent folder,
of the ./bin directory of PostgreSQL.

Modify the 'startup batch' environment variables including PG* postgreSQL
environment variables.

Execute the batch to start PostgreSQL.

Run the following SQL

create extension pltcl;
create extension plperl;
create extension plpython3u; ( or sometimes ... plythonu; )

Follow the rest of the instructions here.

https://www.postgresql.org/docs/current/static/pltcl-functions.html
https://www.postgresql.org/docs/current/static/plperl-funcs.html
https://www.postgresql.org/docs/current/static/plpython-funcs.html

This is the end of extension creation.

Consider more powerful Language distributions
( other than the ones that were mentioned earlier )

Activestate TCL
ACTIVETCL COMMUNITY EDITION DOWNLOAD
http://www.activestate.com/activetcl/downloads

Strawberry Perl
http://strawberryperl.com/

WinPython
https://winpython.github.io/

Andre Mikulec
Andre_Mikulec(at)Hotmail(dot)com

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Melvin Davidson 2016-10-31 04:10:30 Re: initdb createuser commands
Previous Message Venkata B Nagothi 2016-10-31 02:54:23 Re: Checking Postgres Streaming replication delay