version : 2.x.{build} clone_folder: C:\Project environment: global: # MSVC Express 2008's setenv.cmd failes if /E:ON and /V:ON are not # enabled in the batch script interpreter # # WITH_COMPILER: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_compiler.cmd" CMD_IN_ENV: cmd /E:ON /V:ON /C .\appveyor\run_with_env.cmd matrix: # For Python versions available on Appveyor, see # http://www.appveyor.com/docs/installed-software#python - {PYVER: "27", PYTHON_ARCH: "32"} - {PYVER: "27", PYTHON_ARCH: "64"} - {PYVER: "34", PYTHON_ARCH: "32"} - {PYVER: "34", PYTHON_ARCH: "64"} - {PYVER: "35", PYTHON_ARCH: "32"} - {PYVER: "35", PYTHON_ARCH: "64"} - {PYVER: "36", PYTHON_ARCH: "32"} - {PYVER: "36", PYTHON_ARCH: "64"} OPENSSL_VERSION: "1_0_2n" POSTGRES_VERSION: "10_1" PSYCOPG2_TESTDB: psycopg2_test PSYCOPG2_TESTDB_USER: postgres PSYCOPG2_TESTDB_PASSWORD: Password12! PSYCOPG2_TESTDB_HOST: localhost PSYCOPG2_TESTDB_PORT: 5432 PGUSER: postgres PGPASSWORD: Password12! matrix: fast_finish: false services: # Note: if you change this service also change the paths to match # (see where Program Files\Postgres\9.6 is used) - postgresql96 cache: # Rebuild cache if following file changes # (See the file to zap the cache manually) - C:\Others -> scripts\appveyor.cache_rebuild # Script called before repo cloning init: # Uncomment next line to get RDP access during the build. #- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) # Set env variable according to the build environment - SET PYTHON=C:\Python%PYVER% - IF "%PYTHON_ARCH%"=="64" SET PYTHON=%PYTHON%-x64 # Py 2.7 = VS Ver. 9.0 (VS 2008) # Py 3.3, 3.4 = VS Ver. 10.0 (VS 2010) # Py 3.5, 3.6 = VS Ver. 14.0 (VS 2015) - IF "%PYVER%"=="27" SET VS_VER=9.0 - IF "%PYVER%"=="33" SET VS_VER=10.0 - IF "%PYVER%"=="34" SET VS_VER=10.0 - IF "%PYVER%"=="35" SET VS_VER=14.0 - IF "%PYVER%"=="36" SET VS_VER=14.0 - IF "%VS_VER%"=="10.0" IF "%PYTHON_ARCH%"=="64" SET DISTUTILS_USE_SDK=1 # Set Python to the path - SET PATH=%PYTHON%;%PYTHON%\Scripts;C:\Program Files\Git\mingw64\bin;%PATH% # Verify Python version and architecture - ECHO ******************************************************************* - ECHO Python Information - ECHO ******************************************************************* - "%PYTHON%\\python --version" - "%PYTHON%\\python -c \"import sys; print('64bit: ' + str(sys.maxsize > 2**32))\"" # Get & Install NASM #- curl -L -o nasminst.exe http://www.nasm.us/pub/nasm/releasebuilds/2.12.02/win64/nasm-2.12.02-installer-x64.exe && start /wait nasminst.exe /S #- SET PATH="C:\Program Files (x86)\nasm;%PATH%" # Fix problem with VS2008 Express and 64bit builds - ECHO Fixing VS2008 Express and 64bit builds - COPY "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin\\vcvars64.bat" "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin\\amd64\\vcvarsamd64.bat" # Fix problem with VS2010 Express 64bit missing vcvars64.bat # Note: repository not cloned at this point, so need to fetch # file another way - ECHO Fixing VS2010 Express and 64bit builds - curl -fsSL -o "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin\\amd64\\vcvars64.bat" https://raw.githubusercontent.com/psycopg/psycopg2/master/scripts/vcvars64-vs2010.bat # Setup the compiler based upon version and architecture - ECHO Configuring Compiler - IF "%PYTHON_ARCH%"=="32" (CALL "C:\\Program Files (x86)\\Microsoft Visual Studio %VS_VER%\\VC\\vcvarsall.bat" x86) - IF "%PYTHON_ARCH%"=="64" (CALL "C:\\Program Files (x86)\\Microsoft Visual Studio %VS_VER%\\VC\\vcvarsall.bat" amd64) # The program rc.exe on 64bit with some versions look in the wrong path # location when building postgresql. This cheats by copying the x64 bit # files to that location. - IF "%PYTHON_ARCH%"=="64" (COPY /Y "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.0\\Bin\\x64\\rc*" "C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin") # Change PostgreSQL config before service starts to allow > 1 prepared # transactions for test cases - ECHO max_prepared_transactions = 10 >> "C:\\Program Files\\PostgreSQL\\9.6\\data\\postgresql.conf" # Repository gets cloned, Cache is restored install: # We start off CD'ed to cloned folder - SET BASE_DIR=C:\Others\%PYTHON_ARCH%\%VS_VER% - SET BUILD_DIR=%BASE_DIR%\Builds - IF NOT EXIST %BUILD_DIR% MKDIR %BUILD_DIR% - ECHO ******************************************************************* - ECHO Initialized variables specific for this build - ECHO ******************************************************************* - ECHO %BASE_DIR% - ECHO %BUILD_DIR% - ECHO ******************************************************************* # Setup directories for building OpenSSL libraries - ECHO ******************************************************************* - ECHO Preparing for building OpenSSL - ECHO ******************************************************************* - SET OPENSSLTOP=%BASE_DIR%\openssl - IF NOT EXIST %OPENSSLTOP%\include\openssl MKDIR %OPENSSLTOP%\include\openssl - IF NOT EXIST %OPENSSLTOP%\lib MKDIR %OPENSSLTOP%\lib # Setup OpenSSL Environment Variables based on processor architecture - ps: >- If ($env:PYTHON_ARCH -Match "32" ) { $env:VCVARS_PLATFORM="x86" $env:TARGET="VC-WIN32" $env:DO="do_ms" } Else { $env:VCVARS_PLATFORM="amd64" $env:TARGET="VC-WIN64A" $env:DO="do_win64a" $env:CPU="AMD64" } # Download OpenSSL source - CD C:\Others - IF NOT EXIST OpenSSL_%OPENSSL_VERSION%.zip ( curl -fsSL -o OpenSSL_%OPENSSL_VERSION%.zip https://github.com/openssl/openssl/archive/OpenSSL_%OPENSSL_VERSION%.zip ) # To use OpenSSL >= 1.1.0, both libpq and psycopg build environments have # to support the new library names. Below are commands to build OpenSSL # 1.1.0: # - mkdir _build # - cd _build # - perl ..\Configure %TARGET% no-asm no-shared --prefix=%BASE_DIR%\openssl --openssldir=%BASE_DIR%\openssl # - nmake build_libs install_dev - IF NOT EXIST %OPENSSLTOP%\lib\ssleay32.lib ( CD %BUILD_DIR% && 7z x C:\Others\OpenSSL_%OPENSSL_VERSION%.zip && CD openssl-OpenSSL_%OPENSSL_VERSION% && perl Configure %TARGET% no-asm no-shared no-zlib --prefix=%OPENSSLTOP% --openssldir=%OPENSSLTOP% && CALL ms\%DO% && nmake -f ms\nt.mak init headers lib && COPY inc32\openssl\*.h %OPENSSLTOP%\include\openssl && COPY out32\*.lib %OPENSSLTOP%\lib && CD %BASE_DIR% && RMDIR /S /Q %BUILD_DIR%\openssl-OpenSSL_%OPENSSL_VERSION% ) # Setup directories for building PostgreSQL librarires - ECHO ******************************************************************* - ECHO Preparing for building PostgreSQL libraries - ECHO ******************************************************************* - SET PGTOP=%BASE_DIR%\postgresql - IF NOT EXIST %PGTOP%\include MKDIR %PGTOP%\include - IF NOT EXIST %PGTOP%\lib MKDIR %PGTOP%\lib - IF NOT EXIST %PGTOP%\bin MKDIR %PGTOP%\bin # Download PostgreSQL source - CD C:\Others - IF NOT EXIST postgres-REL_%POSTGRES_VERSION%.zip ( curl -fsSL -o postgres-REL_%POSTGRES_VERSION%.zip https://github.com/postgres/postgres/archive/REL_%POSTGRES_VERSION%.zip ) # Setup build config file (config.pl) # Hack the Mkvcbuild.pm file so we build the lib version of libpq # Build libpgport, libpgcommon, libpq # Install includes # Copy over built libraries # Prepare local include directory for building from # Build pg_config in place # NOTE: Cannot set and use the same variable inside an IF - SET PGBUILD=%BUILD_DIR%\postgres-REL_%POSTGRES_VERSION% - IF NOT EXIST %PGTOP%\lib\libpq.lib ( CD %BUILD_DIR% && 7z x C:\Others\postgres-REL_%POSTGRES_VERSION%.zip && CD postgres-REL_%POSTGRES_VERSION%\src\tools\msvc && ECHO $config-^>{ldap} = 0; > config.pl && ECHO $config-^>{openssl} = "%OPENSSLTOP:\=\\%"; >> config.pl && ECHO.>> config.pl && ECHO 1;>> config.pl && perl -pi.bak -e "s/'libpq', 'dll'/'libpq', 'lib'/g" Mkvcbuild.pm && build libpgport && build libpgcommon && build libpq && ECHO "" > %PGBUILD%\src\backend\parser\gram.h && perl -pi.bak -e "s/qw\(Install\)/qw\(Install CopyIncludeFiles\)/g" Install.pm && perl -MInstall=CopyIncludeFiles -e"chdir('../../..'); CopyIncludeFiles('%PGTOP%')" && COPY %PGBUILD%\Release\libpgport\libpgport.lib %PGTOP%\lib && COPY %PGBUILD%\Release\libpgcommon\libpgcommon.lib %PGTOP%\lib && COPY %PGBUILD%\Release\libpq\libpq.lib %PGTOP%\lib && XCOPY /Y /S %PGBUILD%\src\include\port\win32\* %PGBUILD%\src\include && XCOPY /Y /S %PGBUILD%\src\include\port\win32_msvc\* %PGBUILD%\src\include && CD %PGBUILD%\src\bin\pg_config && cl pg_config.c /MT /nologo /I%PGBUILD%\src\include /link /LIBPATH:%PGTOP%\lib libpgcommon.lib libpgport.lib advapi32.lib /NODEFAULTLIB:libcmt.lib /OUT:%PGTOP%\bin\pg_config.exe && CD %BASE_DIR% && RMDIR /S /Q %PGBUILD% ) build: off #before_build: build_script: # Add PostgreSQL binaries to the path - PATH=C:\Program Files\PostgreSQL\9.6\bin\;%PATH% - CD C:\Project - "%PYTHON%\\python.exe setup.py build_ext --have-ssl --pg-config %PGTOP%\\bin\\pg_config.exe -l libpgcommon -l libpgport -L %OPENSSLTOP%\\lib -I %OPENSSLTOP%\\include" - "%PYTHON%\\python.exe setup.py build" - "%PYTHON%\\python.exe setup.py install" - RD /S /Q psycopg2.egg-info #after_build: before_test: # Create and setup PostgreSQL database for the tests - createdb %PSYCOPG2_TESTDB% - psql -d %PSYCOPG2_TESTDB% -c "CREATE EXTENSION HSTORE;" test_script: # Print psycopg and libpq versions - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__version__)\"" - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.__libpq_version__)\"" - "%PYTHON%\\python.exe -c \"import psycopg2; print(psycopg2.extensions.libpq_version())\"" - "%PYTHON%\\python.exe -c \"import tests; tests.unittest.main(defaultTest='tests.test_suite')\" --verbose"