Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable Python 2.6 & 3.x on Appveyor, fix builds on 3.x/MSVC #9

Merged
merged 3 commits into from
Aug 20, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 66 additions & 33 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,62 +1,95 @@
environment:

global:
# SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
# /E:ON and /V:ON options are not enabled in the batch script intepreter
# See: https://stackoverflow.com/a/13751649/163740
WITH_COMPILER: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_compiler.cmd"
SWIG: "C:\\swigwin-3.0.5"
SWIG_VERSION: "3.0.5"
SWIG_SHA256: "12b4e1905124f26f4f6970e23948238166aeb44001fa4ee5c1fd6bbbb7d981f4"
CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_env.cmd"

matrix:

- PYTHON: "C:\\Python27"
PYTHON_VERSION: "2.7.8"
PYTHON_VERSION: "2.7.x" # currently 2.7.9
PYTHON_ARCH: "32"

#- PYTHON: "C:\\Python33"
# PYTHON_VERSION: "3.3.5"
# PYTHON_ARCH: "32"
- PYTHON: "C:\\Python27-x64"
PYTHON_VERSION: "2.7.x" # currently 2.7.9
PYTHON_ARCH: "64"

#- PYTHON: "C:\\Python34"
# PYTHON_VERSION: "3.4.1"
# PYTHON_ARCH: "32"
- PYTHON: "C:\\Python33"
PYTHON_VERSION: "3.3.x" # currently 3.3.5
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python27-x64"
PYTHON_VERSION: "2.7.8"
- PYTHON: "C:\\Python33-x64"
PYTHON_VERSION: "3.3.x" # currently 3.3.5
PYTHON_ARCH: "64"

- PYTHON: "C:\\Python34"
PYTHON_VERSION: "3.4.x" # currently 3.4.3
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python34-x64"
PYTHON_VERSION: "3.4.x" # currently 3.4.3
PYTHON_ARCH: "64"
WINDOWS_SDK_VERSION: "v7.0"

#- PYTHON: "C:\\Python33-x64"
# PYTHON_VERSION: "3.3.5"
# PYTHON_ARCH: "64"
# WINDOWS_SDK_VERSION: "v7.1"
# Python versions not pre-installed

#- PYTHON: "C:\\Python34-x64"
# PYTHON_VERSION: "3.4.1"
# PYTHON_ARCH: "64"
# WINDOWS_SDK_VERSION: "v7.1"
# Python 2.6.6 is the latest Python 2.6 with a Windows installer
# See: https://github.com/ogrisel/python-appveyor-demo/issues/10

init:
- "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%"
- PYTHON: "C:\\Python266"
PYTHON_VERSION: "2.6.6"
PYTHON_ARCH: "32"

install:
- "powershell appveyor\\install.ps1"
# Install non-python dependencies using chocolatey package manager
- choco install -y swig

- ECHO "Filesystem root:"
- ps: "ls \"C:/\""

- ECHO "Installed SDKs:"
- ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""

# Install Python (from the official .msi of https://python.org) and pip when
# not already installed.
- ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }

# Prepend newly installed Python to the PATH of this build (this cannot be
# done from inside the powershell script as it would require to restart
# the parent CMD process).
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"

# Check that we have the expected version and architecture for Python
- "python --version"
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""

# Upgrade to the latest version of pip to avoid it displaying warnings
# about it being out of date.
- "pip install --disable-pip-version-check --user --upgrade pip"

# Install the build dependencies of the project. If some dependencies contain
# compiled extensions and are not provided as pre-built wheel packages,
# pip will build them from source using the MSVC compiler matching the
# target Python version and architecture
- "%CMD_IN_ENV% pip install -r dev-requirements.txt"

build: off
build: false # Not a C# project, build stuff at the test step instead.

test_script:
#- "%WITH_COMPILER% %PYTHON%/python setup.py test"
- echo Skipped
# Build the compiled extension and run the project tests
- "%CMD_IN_ENV% python setup.py test"

after_test:
- SET PATH=%SWIG%;%PATH%
- "%WITH_COMPILER% %PYTHON%/python setup.py bdist_wheel"
- "%WITH_COMPILER% %PYTHON%/python setup.py bdist_wininst"
- "%WITH_COMPILER% %PYTHON%/python setup.py bdist_msi"
# If tests are successful, create binary packages for the project.
- "%CMD_IN_ENV% python setup.py bdist_wheel"
- "%CMD_IN_ENV% python setup.py bdist_wininst"
- "%CMD_IN_ENV% python setup.py bdist_msi"
- ps: "ls dist"

artifacts:
# Archive the generated packages in the ci.appveyor.com build report.
- path: dist\*

#on_success:
# - TODO: upload the content of dist/*.whl to a public wheelhouse
#
136 changes: 95 additions & 41 deletions appveyor/install.ps1
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
# Sample script to install Python and pip under Windows
# Authors: Olivier Grisel and Kyle Kastner
# Authors: Olivier Grisel, Jonathan Helmus and Kyle Kastner
# License: CC0 1.0 Universal: https://creativecommons.org/publicdomain/zero/1.0/

$MINICONDA_URL = "https://repo.continuum.io/miniconda/"
$BASE_URL = "https://www.python.org/ftp/python/"
$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
$GET_PIP_PATH = "C:\get-pip.py"
$SWIG_BASE_URL = "https://prdownloads.sourceforge.net/swig/"

function DownloadFile ($url, $filename) {

function Download ($filename, $url) {
$webclient = New-Object System.Net.WebClient

$basedir = $pwd.Path + "\"
Expand All @@ -17,9 +18,9 @@ function DownloadFile ($url, $filename) {
return $filepath
}

# Download and retry up to 5 times in case of network transient errors.
# Download and retry up to 3 times in case of network transient errors.
Write-Host "Downloading" $filename "from" $url
$retry_attempts = 3
$retry_attempts = 2
for($i=0; $i -lt $retry_attempts; $i++){
try {
$webclient.DownloadFile($url, $filepath)
Expand All @@ -28,24 +29,28 @@ function DownloadFile ($url, $filename) {
Catch [Exception]{
Start-Sleep 1
}
}
Write-Host "File saved at" $filepath
return $filepath
}
if (Test-Path $filepath) {
Write-Host "File saved at" $filepath
} else {
# Retry once to get the error message if any at the last try
$webclient.DownloadFile($url, $filepath)
}
return $filepath
}


function DownloadPython ($python_version, $platform_suffix) {
$version_obj = [version]$python_version
if ($version_obj -lt [version]'3.3.0' -and $version_obj.Build -eq 0) {
$python_version = "$($version_obj.Major).$($version_obj.Minor)"
}
$filename = "python-" + $python_version + $platform_suffix + ".msi"
$url = $BASE_URL + $python_version + "/" + $filename
$filepath = DownloadFile $url $filename
$filepath = Download $filename $url
return $filepath
}

function DownloadSwig ($swig_version) {
$filename = "swigwin-" + $swig_version + ".zip"
$url = $SWIG_BASE_URL + $filename
$filepath = DownloadFile $url $filename
return $filepath
}

function InstallPython ($python_version, $architecture, $python_home) {
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
Expand All @@ -58,32 +63,35 @@ function InstallPython ($python_version, $architecture, $python_home) {
} else {
$platform_suffix = ".amd64"
}
$filepath = DownloadPython $python_version $platform_suffix
Write-Host "Installing" $filepath "to" $python_home
$args = "/qn /i $filepath TARGETDIR=$python_home"
Write-Host "msiexec.exe" $args
Start-Process -FilePath "msiexec.exe" -ArgumentList $args -Wait -Passthru
Write-Host "Python $python_version ($architecture) installation complete"
return $true
$msipath = DownloadPython $python_version $platform_suffix
Write-Host "Installing" $msipath "to" $python_home
$install_log = $python_home + ".log"
$install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
$uninstall_args = "/qn /x $msipath"
RunCommand "msiexec.exe" $install_args
if (-not(Test-Path $python_home)) {
Write-Host "Python seems to be installed else-where, reinstalling."
RunCommand "msiexec.exe" $uninstall_args
RunCommand "msiexec.exe" $install_args
}
if (Test-Path $python_home) {
Write-Host "Python $python_version ($architecture) installation complete"
} else {
Write-Host "Failed to install Python in $python_home"
Get-Content -Path $install_log
Exit 1
}
}

function InstallSwig ($swig_version, $swig_home, $python_home) {
Write-Host "Installing Swig" $swig_version "to" $swig_home
if (Test-Path $swig_home) {
Write-Host $swig_home "already exists, skipping."
return $false
}
$filepath = DownloadSwig $swig_version
Write-Host "Unzipping" $filepath "to" $swig_home
$python_path = $python_home + "/python.exe"
$args = "-m zipfile -e $filepath C:/"
Write-Host "Executing:" $python_path $args
Start-Process -FilePath "$python_path" -ArgumentList $args -Wait -Passthru
function RunCommand ($command, $command_args) {
Write-Host $command $command_args
Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
}


function InstallPip ($python_home) {
$pip_path = $python_home + "/Scripts/pip.exe"
$python_path = $python_home + "/python.exe"
$pip_path = $python_home + "\Scripts\pip.exe"
$python_path = $python_home + "\python.exe"
if (-not(Test-Path $pip_path)) {
Write-Host "Installing pip..."
$webclient = New-Object System.Net.WebClient
Expand All @@ -95,16 +103,62 @@ function InstallPip ($python_home) {
}
}

function InstallPackage ($python_home, $pkg) {
$pip_path = $python_home + "/Scripts/pip.exe"
& $pip_path install $pkg

function DownloadMiniconda ($python_version, $platform_suffix) {
if ($python_version -eq "3.4") {
$filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe"
} else {
$filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe"
}
$url = $MINICONDA_URL + $filename
$filepath = Download $filename $url
return $filepath
}


function InstallMiniconda ($python_version, $architecture, $python_home) {
Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
if (Test-Path $python_home) {
Write-Host $python_home "already exists, skipping."
return $false
}
if ($architecture -eq "32") {
$platform_suffix = "x86"
} else {
$platform_suffix = "x86_64"
}
$filepath = DownloadMiniconda $python_version $platform_suffix
Write-Host "Installing" $filepath "to" $python_home
$install_log = $python_home + ".log"
$args = "/S /D=$python_home"
Write-Host $filepath $args
Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru
if (Test-Path $python_home) {
Write-Host "Python $python_version ($architecture) installation complete"
} else {
Write-Host "Failed to install Python in $python_home"
Get-Content -Path $install_log
Exit 1
}
}


function InstallMinicondaPip ($python_home) {
$pip_path = $python_home + "\Scripts\pip.exe"
$conda_path = $python_home + "\Scripts\conda.exe"
if (-not(Test-Path $pip_path)) {
Write-Host "Installing pip..."
$args = "install --yes pip"
Write-Host $conda_path $args
Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru
} else {
Write-Host "pip already installed."
}
}

function main () {
InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
InstallSwig $env:SWIG_VERSION $env:SWIG $env:PYTHON
InstallPip $env:PYTHON
InstallPackage $env:PYTHON wheel
}

main
File renamed without changes.
2 changes: 1 addition & 1 deletion dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
coverage
coveralls

wheel
5 changes: 4 additions & 1 deletion smartcard/scard/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,16 @@ static int _ReaderStateFromTuple( PyObject* o, READERSTATELIST* prl, unsigned in
{
char* psz;
PyObject* o2;
#if PY_MAJOR_VERSION >= 3
PyObject* temp_bytes;
#endif

// first tuple item is reader name
o2=PyTuple_GetItem(o, 0);

#if PY_MAJOR_VERSION >= 3
// Convert the readername from string (unicode) to bytes (ascii)
PyObject * temp_bytes = PyUnicode_AsEncodedString(o2, "ASCII", "strict"); // Owned reference
temp_bytes = PyUnicode_AsEncodedString(o2, "ASCII", "strict"); // Owned reference
if (temp_bytes != NULL)
{
psz = PyBytes_AsString(temp_bytes); // Borrowed pointer
Expand Down