name: Test Windows on: [push, pull_request] jobs: build: runs-on: windows-2019 strategy: fail-fast: false matrix: python-version: ["3.5", "3.6", "3.7", "pypy3.6"] architecture: ["x86", "x64"] include: - architecture: "x86" platform-vcvars: "x86" platform-msbuild: "Win32" - architecture: "x64" platform-vcvars: "x86_amd64" platform-msbuild: "x64" - python-version: "pypy3.6" pypy-version: "pypy3.6-v7.2.0-win32" pypy-url: "https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.2.0-win32.zip" exclude: - python-version: "pypy3.6" architecture: "x64" timeout-minutes: 30 name: Python ${{ matrix.python-version }} ${{ matrix.architecture }} steps: - uses: actions/checkout@v1 - name: Install PyPy if: "contains(matrix.python-version, 'pypy')" run: | curl -fsSL -o pypy3.zip "${{ matrix.pypy-url }}" 7z x pypy3.zip "-o$env:RUNNER_WORKSPACE\" mv "$env:RUNNER_WORKSPACE\${{ matrix.pypy-version }}" "$env:RUNNER_WORKSPACE\${{ matrix.python-version }}" $env:PYTHON="$env:RUNNER_WORKSPACE\${{ matrix.python-version }}" # set env: pythonLocation Write-Host "`#`#[set-env name=pythonLocation;]$env:PYTHON" # old syntax https://github.com/actions/toolkit/issues/61 Write-Host "::set-env name=pythonLocation::$env:PYTHON" # new syntax https://github.com/actions/toolkit/blob/5bb77ec03fea98332e41f9347c8fbb1ce1e48f4a/docs/commands.md New-Item -ItemType SymbolicLink -Path "$env:PYTHON\python.exe" -Target "$env:PYTHON\pypy3.exe" curl -fsSL -o get-pip.py https://bootstrap.pypa.io/get-pip.py $env:PATH = "$env:PYTHON\bin;$env:PATH" & $env:PYTHON\python.exe get-pip.py shell: pwsh # sets env: pythonLocation - name: Set up Python if: "!contains(matrix.python-version, 'pypy')" uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} architecture: ${{ matrix.architecture }} - name: pip install wheel pytest pytest-cov codecov run: | "%pythonLocation%\python.exe" -m pip install wheel pytest pytest-cov pip install codecov shell: cmd - name: Fetch dependencies run: | curl -fsSL -o nasm.zip https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/win64/nasm-2.14.02-win64.zip 7z x nasm.zip "-o$env:RUNNER_WORKSPACE\" Write-Host "`#`#[add-path]$env:RUNNER_WORKSPACE\nasm-2.14.02" Write-Host "::add-path::$env:RUNNER_WORKSPACE\nasm-2.14.02" $env:PYTHON=$env:pythonLocation curl -fsSL -o pillow-depends.zip https://github.com/python-pillow/pillow-depends/archive/master.zip 7z x pillow-depends.zip -oc:\ mv c:\pillow-depends-master c:\pillow-depends xcopy c:\pillow-depends\*.zip $env:GITHUB_WORKSPACE\winbuild\ xcopy c:\pillow-depends\*.tar.gz $env:GITHUB_WORKSPACE\winbuild\ xcopy /s c:\pillow-depends\test_images\* $env:GITHUB_WORKSPACE\tests\images\ cd $env:GITHUB_WORKSPACE/winbuild/ python.exe $env:GITHUB_WORKSPACE\winbuild\build_dep.py env: EXECUTABLE: bin\python.exe shell: pwsh - name: Build dependencies / libjpeg if: false run: | REM FIXME uses /MT not /MD, see makefile.vc and win32.mak for more info set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\jpeg-9c call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on nmake -nologo -f makefile.vc setup-vc6 nmake -nologo -f makefile.vc clean nmake -nologo -f makefile.vc nodebug=1 libjpeg.lib cjpeg.exe djpeg.exe copy /Y /B j*.h %INCLIB% copy /Y /B *.lib %INCLIB% copy /Y /B *.exe %INCLIB% shell: cmd - name: Build dependencies / libjpeg-turbo run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\libjpeg-turbo-2.0.3 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DENABLE_SHARED:BOOL=OFF -DWITH_JPEG8:BOOL=TRUE -DWITH_CRT_DLL:BOOL=TRUE -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile jpeg-static cjpeg-static djpeg-static copy /Y /B j*.h %INCLIB% copy /Y /B jpeg-static.lib %INCLIB%\libjpeg.lib copy /Y /B cjpeg-static.exe %INCLIB%\cjpeg.exe copy /Y /B djpeg-static.exe %INCLIB%\djpeg.exe shell: cmd - name: Build dependencies / zlib run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\zlib-1.2.11 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on nmake -nologo -f win32\Makefile.msc clean nmake -nologo -f win32\Makefile.msc zlib.lib copy /Y /B z*.h %INCLIB% copy /Y /B *.lib %INCLIB% copy /Y /B zlib.lib %INCLIB%\z.lib shell: cmd - name: Build dependencies / LibTIFF run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\tiff-4.1.0 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on copy %GITHUB_WORKSPACE%\winbuild\tiff.opt nmake.opt nmake -nologo -f makefile.vc clean nmake -nologo -f makefile.vc lib copy /Y /B libtiff\tiff*.h %INCLIB% copy /Y /B libtiff\*.dll %INCLIB% copy /Y /B libtiff\*.lib %INCLIB% shell: cmd - name: Build dependencies / WebP run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\libwebp-1.0.3 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on rmdir /S /Q output\release-static nmake -nologo -f Makefile.vc CFG=release-static OBJDIR=output ARCH=${{ matrix.architecture }} all mkdir %INCLIB%\webp copy /Y /B src\webp\*.h %INCLIB%\webp copy /Y /B output\release-static\${{ matrix.architecture }}\lib\* %INCLIB% shell: cmd - name: Build dependencies / FreeType run: | REM Toolkit v100 not available; missing VCTargetsPath; Clean fails set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\freetype-2.10.1 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on rmdir /S /Q objs set DefaultPlatformToolset=v142 set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\ set MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" powershell -Command "(gc builds\windows\vc2010\freetype.vcxproj) -replace 'MultiThreaded<', 'MultiThreadedDLL<' | Out-File -encoding ASCII builds\windows\vc2010\freetype.vcxproj" %MSBUILD% builds\windows\vc2010\freetype.sln /t:Build /p:Configuration="Release Static" /p:Platform=${{ matrix.platform-msbuild }} /m xcopy /Y /E /Q include %INCLIB% copy /Y /B "objs\${{ matrix.platform-msbuild }}\Release Static\freetype.lib" %INCLIB% shell: cmd - name: Build dependencies / LCMS2 run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\lcms2-2.8 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on rmdir /S /Q Lib rmdir /S /Q Projects\VC2015\Release set VCTargetsPath=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\VC\v160\ set MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" powershell %GITHUB_WORKSPACE%\winbuild\lcms2_patch.ps1 %MSBUILD% Projects\VC2015\lcms2.sln /t:Clean;lcms2_static /p:Configuration="Release" /p:Platform=${{ matrix.platform-msbuild }} /m xcopy /Y /E /Q include %INCLIB% copy /Y /B Lib\MS\*.lib %INCLIB% shell: cmd - name: Build dependencies / OpenJPEG run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\openjpeg-2.3.1msvcr10-x32 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DBUILD_THIRDPARTY:BOOL=OFF -DBUILD_SHARED_LIBS:BOOL=OFF set CMAKE=%CMAKE% -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile mkdir %INCLIB%\openjpeg-2.3.1 copy /Y /B src\lib\openjp2\*.h %INCLIB%\openjpeg-2.3.1 copy /Y /B bin\*.lib %INCLIB% shell: cmd # GPL licensed; skip if building wheels - name: Build dependencies / libimagequant if: "github.event_name != 'push' || contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build rem ba653c8: Merge tag '2.12.5' into msvc cd /D %BUILD%\libimagequant-ba653c8ccb34dde4e21c6076d85a72d21ed9d971 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on echo (gc CMakeLists.txt) -replace 'add_library', "add_compile_options(-openmp-)`r`nadd_library" ^| Out-File -encoding ASCII CMakeLists.txt > patch.ps1 echo (gc CMakeLists.txt) -replace ' SHARED', ' STATIC' ^| Out-File -encoding ASCII CMakeLists.txt >> patch.ps1 powershell .\patch.ps1 set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile copy /Y /B *.h %INCLIB% copy /Y /B *.lib %INCLIB% shell: cmd # for Raqm - name: Build dependencies / HarfBuzz if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build set INCLUDE=%INCLUDE%;%INCLIB% set LIB=%LIB%;%INCLIB% cd /D %BUILD%\harfbuzz-2.6.1 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DHB_HAVE_FREETYPE:BOOL=ON -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile harfbuzz copy /Y /B src\*.h %INCLIB% copy /Y /B *.lib %INCLIB% shell: cmd # for Raqm - name: Build dependencies / FriBidi if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\fribidi-1.0.7 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on copy /Y /B %GITHUB_WORKSPACE%\winbuild\fribidi.cmake CMakeLists.txt set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile fribidi copy /Y /B lib\*.h %INCLIB% copy /Y /B *.lib %INCLIB% shell: cmd # failing with PyPy3 - name: Build dependencies / Raqm if: "!contains(matrix.python-version, 'pypy')" run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build set INCLUDE=%INCLUDE%;%INCLIB% set LIB=%LIB%;%INCLIB% cd /D %BUILD%\libraqm-0.7.0 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on copy /Y /B %GITHUB_WORKSPACE%\winbuild\raqm.cmake CMakeLists.txt set CMAKE=cmake.exe -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES:BOOL=OFF set CMAKE=%CMAKE% -DCMAKE_BUILD_TYPE=Release %CMAKE% -G "NMake Makefiles" . nmake -nologo -f Makefile clean nmake -nologo -f Makefile libraqm copy /Y /B src\*.h %INCLIB% copy /Y /B libraqm.dll %INCLIB% shell: cmd - name: Build dependencies / ghostscript if: false run: | set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 set BUILD=%GITHUB_WORKSPACE%\winbuild\build cd /D %BUILD%\ghostscript-9.27 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} echo on set MSVC_VERSION=14 set RCOMP="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\RC.Exe" if "${{ matrix.architecture }}"=="x64" set WIN64="" nmake -nologo -f psi\msvc.mak rem Add bin to PATH variable: Copy to INCLIB, then add INCLIB to PATH in Test step. copy /Y /B bin\* %INCLIB% shell: cmd - name: Build Pillow run: | set PYTHON=%pythonLocation% set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set MPLSRC=%GITHUB_WORKSPACE% set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 cd /D %GITHUB_WORKSPACE% set LIB=%INCLIB%;%PYTHON%\tcl set INCLUDE=%INCLIB%;%GITHUB_WORKSPACE%\depends\tcl86\include;%INCLUDE% call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} set DISTUTILS_USE_SDK=1 set py_vcruntime_redist=true %PYTHON%\python.exe setup.py build_ext install rem Add GhostScript and Raqm binaries (copied to INCLIB) to PATH. path %INCLIB%;%PATH% %PYTHON%\python.exe selftest.py --installed shell: cmd # failing with PyPy3 - name: Enable heap verification if: "!contains(matrix.python-version, 'pypy')" run: | c:\"Program Files (x86)"\"Windows Kits"\10\Debuggers\x86\gflags.exe /p /enable %PYTHON%\python.exe shell: cmd - name: Test Pillow run: | set PYTHON=%pythonLocation% set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 rem Add GhostScript and Raqm binaries (copied to INCLIB) to PATH. path %INCLIB%;%PATH% cd /D %GITHUB_WORKSPACE% %PYTHON%\python.exe -m pytest -vx --cov PIL --cov-report term --cov-report xml Tests shell: cmd - name: Upload coverage run: 'codecov --file "%GITHUB_WORKSPACE%\coverage.xml" --name "%pythonLocation%"' shell: cmd - name: Build wheel id: wheel if: "github.event_name == 'push' && !contains(matrix.python-version, 'pypy')" run: | for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ##[set-output name=dist;]dist-%%a for /f "tokens=3 delims=/" %%a in ("${{ github.ref }}") do echo ::set-output name=dist::dist-%%a set PYTHON=%pythonLocation% set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\V7.1A\Include set MPLSRC=%GITHUB_WORKSPACE% set INCLIB=%GITHUB_WORKSPACE%\winbuild\depends\msvcr10-x32 cd /D %GITHUB_WORKSPACE% set LIB=%INCLIB%;%PYTHON%\tcl set INCLUDE=%INCLIB%;%GITHUB_WORKSPACE%\depends\tcl86\include;%INCLUDE% call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.platform-vcvars }} %PYTHON%\python.exe setup.py bdist_wheel shell: cmd - uses: actions/upload-artifact@v1 if: "github.event_name == 'push' && !contains(matrix.python-version, 'pypy')" with: name: ${{ steps.wheel.outputs.dist }} path: dist