Skip to content

Instantly share code, notes, and snippets.

@slaykovsky
Last active October 4, 2015 11:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slaykovsky/94b2689168b8401de050 to your computer and use it in GitHub Desktop.
Save slaykovsky/94b2689168b8401de050 to your computer and use it in GitHub Desktop.
rem Prerequisities
rem 1. Visual Studio 2015 Community Edition
rem 2. Msys2
rem 3. Active Perl
rem 4. Python 2.7
rem 5. 7-zip
rem Set PostgreSQL version
set PGVER=9.4.4
rem Set useful directories
set PG_BUILD_DIR=c:\pg
set PG_DOWNLOAD_DIR=%PG_BUILD_DIR%\downloads
rem Set Architecture (x86 or x64)
set ARCH=x64
rem Add build tools to PATH
set PATH=%PATH%;C:\Program Files\7-Zip;
if "%ARCH%" == "x86" set PATH=C:\msys32\usr\bin;C:\Perl\Bin;%PATH%
if "%ARCH%" == "x64" set PATH=C:\msys64\usr\bin;C:\Perl64\Bin;%PATH%
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %ARCH%
rem Make nmake builds parallel
set CL=/MP
rem Install useful UNIX tools
pacman --noconfirm --sync flex bison tar wget unzip gettext || goto :ERROR
rem Start build from place you need
goto :BUILD_ALL
:BUILD_ALL
mkdir "%PG_DOWNLOAD_DIR%"
:BUILD_ICU
cd %PG_DOWNLOAD_DIR%
wget --no-check-certificate -c http://download.icu-project.org/files/icu4c/56rc/icu4c-56_rc-src.tgz -O icu4c-source.tgz
rm -rf "c:\pg\icu"
mkdir "c:\pg\icu"
tar -xvf icu4c-source.tgz
mv %PG_DOWNLOAD_DIR%\icu c:\pg\icu
cd "c:\pg\icu"
devenv icu\source\allinone\allinone.sln /upgrade || goto :ERROR
rem Here well not go to Error 'cause there are some errors with compilation
rem we can proudly ignore
msbuild icu\source\allinone\allinone.sln /p:Configuration=Release /p:Platform=%ARCH%
rem msbuild icu\source\common\common.vcxproj /p:Configuration=Release /p:Platform=%ARCH%
if "%ARCH%" == "x86" cp -va icu\bin bin || goto :ERROR
if "%ARCH%" == "x64" cp -va icu\bin64 bin || goto :ERROR
if "%ARCH%" == "x86" cp -va icu\lib lib || goto :ERROR
if "%ARCH%" == "x64" cp -va icu\lib64 lib || goto :ERROR
cp -va icu\include include || goto :ERROR
:BUILD_OPENSSL
cd %PG_DOWNLOAD_DIR%
wget --no-check-certificate -c ftp://ftp.openssl.org/source/openssl-1.0.2d.tar.gz -O openssl-source.tar.gz
rm -rf "c:\pg\openssl"
mkdir "c:\pg\openssl"
tar -xvf openssl-source.tar.gz
mv openssl-1.0.2d c:\pg\openssl
cd c:\pg\openssl\openssl-1.0.2d
if "%ARCH%" == "x86" perl Configure VC-WIN32 no-asm --prefix="c:\pg\openssl" || goto :ERROR
if "%ARCH%" == "x86" call ms\do_ms || goto :ERROR
if "%ARCH%" == "x64" perl Configure VC-WIN64A no-asm --prefix="c:\pg\openssl" || goto :ERROR
if "%ARCH%" == "x64" call ms\do_win64a || goto :ERROR
nmake /f ms\ntdll.mak || goto :ERROR
nmake /f ms\ntdll.mak test || goto :ERROR
nmake /f ms\ntdll.mak install || goto :ERROR
cd c:\pg\openssl
mv bin\libeay32.dll bin\libeay32MD.dll || goto :ERROR
mv bin\ssleay32.dll bin\ssleay32MD.dll || goto :ERROR
mkdir lib\VC
mv lib\libeay32.lib lib\VC\libeay32MD.lib || goto :ERROR
mv lib\ssleay32.lib lib\VC\ssleay32MD.lib || goto :ERROR
:BUILD_ZLIB
cd %PG_DOWNLOAD_DIR%
wget -c http://zlib.net/zlib-1.2.8.tar.gz
rm -rf "c:\pg\zlib"
mkdir "c:\pg\zlib"
mkdir "c:\pg\zlib\lib"
mkdir "c:\pg\zlib\include"
tar -xvf zlib-1.2.8.tar.gz
mv zlib-1.2.8 c:\pg\zlib
cd c:\pg\zlib\zlib-1.2.8
nmake /f win32/Makefile.msc || goto :ERROR
nmake /f win32/Makefile.msc test || goto :ERROR
cp -v *.lib c:\pg\zlib\lib || goto :ERROR
cp -v *.dll c:\pg\zlib\lib || goto :ERROR
cp -v *.pdb c:\pg\zlib\lib || goto :ERROR
cp -v *.h c:\pg\zlib\include || goto :ERROR
:BUILD_ICONV
cd %PG_DOWNLOAD_DIR%
wget --no-check-certificate -c https://github.com/holy-shit/iconv-for-windows/archive/master.zip -O iconv-for-windows.zip
rm -rf "c:\pg\iconv"
mkdir "c:\pg\iconv"
cd "c:\pg\iconv"
7z -y x "%PG_DOWNLOAD_DIR%\iconv-for-windows.zip"
mv iconv-for-windows-master iconv-for-windows
cp -v iconv-for-windows/lib/libiconv.lib iconv-for-windows/lib/iconv.lib || goto :ERROR
cp -v iconv-for-windows/lib/libiconv.dll iconv-for-windows/lib/iconv.dll || goto :ERROR
cp -v iconv-for-windows/lib64/libiconv.lib iconv-for-windows/lib64/iconv.lib || goto :ERROR
cp -v iconv-for-windows/lib64/libiconv.dll iconv-for-windows/lib64/iconv.dll || goto :ERROR
mkdir "c:\pg\iconv\lib"
if "%ARCH%" == "x86" cp -va c:/pg/iconv/iconv-for-windows/lib/* c:\pg\iconv\lib || goto :ERROR
if "%ARCH%" == "x64" cp -va c:/pg/iconv/iconv-for-windows/lib64/* c:\pg\iconv\lib || goto :ERROR
cp -va c:/pg/iconv/iconv-for-windows/include c:\pg\iconv || goto :ERROR
cp -va c:/pg/iconv/iconv-for-windows/libiconv c:\pg\iconv || goto :ERROR
:BUILD_XML
cd %PG_DOWNLOAD_DIR%
rm -rf libxml2-master
wget --no-check-certificate -c https://github.com/tenderlove/libxml2/archive/master.zip
rm -rf "c:\pg\libxml2"
mkdir "c:\pg\libxml2"
mkdir "c:\pg\libxml2\lib"
mkdir "c:\pg\libxml2\include"
unzip master.zip
curl -Ssl https://gist.githubusercontent.com/slaykovsky/30b4fb94f888fa10272b/raw/19a1b38c3e03acf48131af312b1df02a4b26977c/win32config.h > win32config.h
mv win32config.h libxml2-master\include\win32config.h
cd libxml2-master\win32
cp -va c:/pg/iconv/include/* c:/pg/libxml2/include/ || goto :ERROR
cp -va c:/pg/iconv/lib/* c:/pg/libxml2/lib/ || goto :ERROR
cp -va c:/pg/zlib/include/* c:/pg/libxml2/include/ || goto :ERROR
cp -va c:/pg/zlib/lib/* c:/pg/libxml2/lib/ || goto :ERROR
cp -va c:/pg/icu/include/* c:/pg/libxml2/include/ || goto :ERROR
cp -va c:/pg/icu/lib/* c:/pg/libxml2/lib/ || goto :ERROR
cp -va c:/pg/libxml2/lib/icuuc.lib c:/pg/libxml2/lib/icu.lib || goto :ERROR
cscript configure.js compiler=mscv iconv=yes zlib=yes icu=yes prefix=c:\pg\libxml2 iconv=yes || goto :ERROR
nmake /f Makefile.msvc || goto :ERROR
nmake /f Makefile.msvc install || goto :ERROR
:BUILD_XSLT
cd %PG_DOWNLOAD_DIR%
wget -c ftp://xmlsoft.org/libxml2/libxslt-git-snapshot.tar.gz
rm -rf "c:\pg\libxslt"
mkdir "c:\pg\libxslt"
mkdir "c:\pg\libxslt\lib"
mkdir "c:\pg\libxslt\include"
tar -xvf libxslt-git-snapshot.tar.gz
curl -Ssl https://gist.githubusercontent.com/slaykovsky/4f4d2f6e3d97a1d9faa0/raw/9a09075067932a1e033b0128c8d86ccdae1233bb/libxslt_win32config.h > win32config.h
mv win32config.h libxslt-1.1.28\libxslt\win32config.h || goto :ERROR
cd libxslt-1.1.28\win32
cp -va c:/pg/iconv/include/* c:/pg/libxslt/include/ || goto :ERROR
cp -va c:/pg/iconv/lib/* c:/pg/libxslt/lib/ || goto :ERROR
cp -va c:/pg/zlib/include/* c:/pg/libxslt/include/ || goto :ERROR
cp -va c:/pg/zlib/lib/* c:/pg/libxslt/lib/ || goto :ERROR
cp -va c:/pg/icu/include/* c:/pg/libxslt/include/ || goto :ERROR
cp -va c:/pg/icu/lib/* c:/pg/libxslt/lib/ || goto :ERROR
cp -va c:/pg/libxml2/include/* c:/pg/libxslt/include/ || goto :ERROR
cp -va c:/pg/libxml2/lib/* c:/pg/libxslt/lib || goto :ERROR
cscript configure.js prefix=c:\pg\libxslt iconv=yes zlib=yes || goto :ERROR
sed -i /NOWIN98/d Makefile.msvc || goto :ERROR
nmake /f Makefile.msvc || goto :ERROR
nmake /f Makefile.msvc install || goto :ERROR
:BUILD_LIBINTL
cd %PG_DOWNLOAD_DIR%
wget --no-check-certificate -c https://github.com/postgrespro/libintl_win32/archive/master.zip -O libintl.zip
rm -rf libintl_win32-master
rm -rf "c:\pg\libintl"
mkdir "c:\pg\libintl"
unzip libintl.zip
cd libintl_win32-master
cp -va c:/pg/iconv/include c:/pg/libintl/include || goto :ERROR
cp -va c:/pg/iconv/lib c:/pg/libintl/lib || goto :ERROR
nmake /f Makefile.msvc MFLAGS="-MD" DLL=1 PREFIX=c:\pg\libintl install || goto :ERROR
cp -v c:/pg/libintl/lib/intl.lib c:/pg/libintl/lib/libintl.lib || goto :ERROR
:BUILD_UUID
CD %PG_DOWNLOAD_DIR%
wget -c http://netcologne.dl.sourceforge.net/project/osspuuidwin32/src/ossp_uuid_1.6.2_win32_source_120608.7z -O ossp_uuid_1.6.2_win32_source_120608.7z
rm -rf "c:\pg\uuid"
MKDIR "c:\pg\uuid"
CD "c:\pg\uuid"
7z x %PG_DOWNLOAD_DIR%\ossp_uuid_1.6.2_win32_source_120608.7z
CD "C:\pg\uuid\ossp_uuid"
devenv ossp_uuid.sln /upgrade || goto :ERROR
IF "%ARCH%" == "x64" sed -i 's/Win32/x64/g' ossp_uuid.sln || goto :ERROR
IF "%ARCH%" == "x64" sed -i 's/Win32/x64/g' ossp_uuid\ossp_uuid.vcxproj || goto :ERROR
IF "%ARCH%" == "x64" sed -i 's/Win32/x64/g' example\example.vcxproj || goto :ERROR
IF "%ARCH%" == "x64" sed -i 's/Win32/x64/g' uuid_cli\uuid_cli.vcxproj || goto :ERROR
IF "%ARCH%" == "x64" msbuild ossp_uuid.sln /p:Configuration=Release /p:Platform=x64 || goto :ERROR
IF "%ARCH%" == "x86" msbuild ossp_uuid.sln /p:Configuration=Release || goto :ERROR
MKDIR "c:\pg\uuid\lib" || goto :ERROR
cp -av include "c:\pg\uuid" || goto :ERROR
IF "%ARCH%" == "x64" cp -av x64/Release/ossp_uuid.lib "c:\pg\uuid\lib\uuid.lib" || goto :ERROR
IF "%ARCH%" == "x86" cp -av Release/ossp_uuid.lib "c:\pg\uuid\lib\uuid.lib" || goto :ERROR
:BUILD_POSTGRESQL
CD %PG_DOWNLOAD_DIR%
wget --no-check-certificate -c https://ftp.postgresql.org/pub/source/v%PGVER%/postgresql-%PGVER%.tar.bz2 -O postgresql-%PGVER%.tar.bz2
rm -rf "c:\pg\postgresql"
MKDIR "c:\pg\postgresql"
tar xf postgresql-%PGVER%.tar.bz2 -C "c:\pg\postgresql"
CD "c:\pg\postgresql\postgresql-%PGVER%"
>src\tools\msvc\config.pl ECHO use strict;
>>src\tools\msvc\config.pl ECHO use warnings;
>>src\tools\msvc\config.pl ECHO our $config = {
>>src\tools\msvc\config.pl ECHO asserts ^=^> 0^, ^# --enable-cassert
>>src\tools\msvc\config.pl ECHO ^# integer_datetimes^=^>1,
>>src\tools\msvc\config.pl ECHO ^# float4byval^=^>1,
>>src\tools\msvc\config.pl ECHO ^# float8byval^=^>0,
>>src\tools\msvc\config.pl ECHO ^# blocksize ^=^> 8,
>>src\tools\msvc\config.pl ECHO ^# wal_blocksize ^=^> 8,
>>src\tools\msvc\config.pl ECHO ^# wal_segsize ^=^> 16,
>>src\tools\msvc\config.pl ECHO ldap ^=^> 1,
>>src\tools\msvc\config.pl ECHO nls ^=^> 'C:\pg\libintl',
>>src\tools\msvc\config.pl ECHO tcl ^=^> undef,
IF "%ARCH%" == "x64" (>>src\tools\msvc\config.pl ECHO perl ^=^> 'C:\Perl64', )
IF "%ARCH%" == "x86" (>>src\tools\msvc\config.pl ECHO perl ^=^> 'C:\Perl', )
>>src\tools\msvc\config.pl ECHO python ^=^> 'C:\Python27',
>>src\tools\msvc\config.pl ECHO openssl ^=^> 'c:\pg\openssl',
>>src\tools\msvc\config.pl ECHO uuid ^=^> 'c:\pg\uuid',
>>src\tools\msvc\config.pl ECHO xml ^=^> 'c:\pg\libxml2',
>>src\tools\msvc\config.pl ECHO xslt ^=^> 'c:\pg\libxslt',
>>src\tools\msvc\config.pl ECHO iconv ^=^> 'C:\pg\iconv',
>>src\tools\msvc\config.pl ECHO zlib ^=^> 'c:\pg\zlib'
>>src\tools\msvc\config.pl ECHO ^};
>>src\tools\msvc\config.pl ECHO 1^;
cd src\tools\msvc
sed -i "s|VC2013Project|VC2015Project|g" MSBuildProject.pm
sed -i "s|12.00|14.00|g" MSBuildProject.pm
sed -i "s|v120|v140|g" MSBuildProject.pm
sed -i "s|12.0|14.0|g" MSBuildProject.pm
sed -i "s|VC2013Project|VC2015Project|g" VSObjectFactory.pm
perl build.pl || GOTO :ERROR
:BUILD_PG
IF "%ARCH%" == "x86" SET PERL5LIB=C:\Perl\lib;src\tools\msvc
IF "%ARCH%" == "x64" SET PERL5LIB=C:\Perl64\lib;src\tools\msvc
rm -rf c:\pg\distr_%ARCH%_%PGVER%\postgresql
MKDIR "c:\pg\distr_%ARCH%_%PGVER%\postgresql"
PAUSE
CD "c:\pg\postgresql\postgresql-%PGVER%\src\tools\msvc"
cp -v c:/pg/libintl/lib/*.dll c:\pg\postgresql\postgresql-%PGVER%\ || goto :ERROR
perl install.pl c:\pg\distr_%ARCH%_%PGVER%\postgresql || goto :ERROR
PAUSE
cp -v c:/pg/libintl/lib/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
cp -v c:/pg/iconv/lib/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
cp -v c:/pg/libxml2/lib/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
cp -v c:/pg/libxslt/lib/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
cp -v c:/pg/openssl/lib/VC/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
cp -v c:/pg/zlib/lib/*.dll "c:\pg\distr_%ARCH%_%PGVER%\postgresql\bin" || goto :ERROR
goto :DONE
:ERROR
echo Failed with error #%errorlevel%.
PAUSE
exit /b %errorlevel%
:DONE
echo Done.
PAUSE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment