diff --git a/.appveyor.yml b/.appveyor.yml index c0a8a023717..ad783f85ed5 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -16,12 +16,6 @@ environment: ARCHITECTURE: x86 - PYTHON: C:/Python35-x64 ARCHITECTURE: x64 - - PYTHON: C:/msys64/mingw32 - EXECUTABLE: bin/python3 - ARCHITECTURE: x86 - PIP_DIR: bin - TEST_OPTIONS: --processes=0 - DEPLOY: NO install: @@ -35,31 +29,15 @@ install: - path c:\nasm-2.14.02;C:\Program Files (x86)\gs\gs9.52\bin;%PATH% - cd c:\pillow\winbuild\ - ps: | - if ($env:PYTHON -eq "c:/msys64/mingw32") - { - c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_install_msys2_deps.sh - } - else - { c:\python37\python.exe c:\pillow\winbuild\build_prepare.py -v --depends=C:\pillow-depends\ c:\pillow\winbuild\build\build_dep_all.cmd $host.SetShouldExit(0) - } - path C:\pillow\winbuild\build\bin;%PATH% build_script: - ps: | - if ($env:PYTHON -eq "c:/msys64/mingw32") - { - c:\msys64\usr\bin\bash -l -c c:\\pillow\\winbuild\\appveyor_build_msys2.sh - Write-Host "through install" - $host.SetShouldExit(0) - } - else - { c:\pillow\winbuild\build\build_pillow.cmd install $host.SetShouldExit(0) - } - cd c:\pillow - '%PYTHON%\%EXECUTABLE% selftest.py --installed' diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml index 24f8406bcfa..7ae26b8834c 100644 --- a/.github/workflows/test-windows.yml +++ b/.github/workflows/test-windows.yml @@ -154,3 +154,76 @@ jobs: with: name: ${{ steps.wheel.outputs.dist }} path: dist\*.whl + + msys: + runs-on: windows-2019 + + strategy: + fail-fast: false + matrix: + mingw: ["MINGW32", "MINGW64"] + include: + - mingw: "MINGW32" + package: "mingw-w64-i686" + - mingw: "MINGW64" + package: "mingw-w64-x86_64" + + defaults: + run: + shell: bash.exe --login -eo pipefail "{0}" + env: + MSYSTEM: ${{ matrix.mingw }} + CHERE_INVOKING: 1 + + timeout-minutes: 30 + name: MSYS2 ${{ matrix.mingw }} + + steps: + - uses: actions/checkout@v2 + + - name: Set up shell + run: echo ::add-path::C:\msys64\usr\bin\ + shell: pwsh + + - name: Install Dependencies + run: | + pacman -S --noconfirm \ + ${{ matrix.package }}-python3-pip \ + ${{ matrix.package }}-python3-setuptools \ + ${{ matrix.package }}-python3-pytest \ + ${{ matrix.package }}-python3-pytest-cov \ + ${{ matrix.package }}-python3-cffi \ + ${{ matrix.package }}-python3-olefile \ + ${{ matrix.package }}-python3-numpy \ + ${{ matrix.package }}-python3-pyqt5 \ + ${{ matrix.package }}-python3-numpy \ + ${{ matrix.package }}-freetype \ + ${{ matrix.package }}-lcms2 \ + ${{ matrix.package }}-libwebp \ + ${{ matrix.package }}-libjpeg-turbo \ + ${{ matrix.package }}-openjpeg2 \ + ${{ matrix.package }}-libimagequant \ + ${{ matrix.package }}-libraqm \ + ${{ matrix.package }}-ghostscript \ + subversion + + python3 -m pip install pyroma + + pushd depends && ./install_extra_test_images.sh && popd + + - name: Build Pillow + run: | + # libtiff is unable to open files + CFLAGS="-coverage" python3 setup.py build_ext --disable-tiff install + + - name: Test Pillow + run: | + python3 selftest.py --installed + python3 -m pytest -vx --cov PIL --cov Tests --cov-report term --cov-report xml Tests + + - name: Upload coverage + run: | + python3 -m pip install codecov + bash <(curl -s https://codecov.io/bash) -F GHA_Windows + env: + CODECOV_NAME: MSYS2 ${{ matrix.mingw }} diff --git a/Tests/helper.py b/Tests/helper.py index a8ca85dc44f..7e8abc9c9a8 100644 --- a/Tests/helper.py +++ b/Tests/helper.py @@ -6,6 +6,7 @@ import os import shutil import sys +import sysconfig import tempfile from io import BytesIO @@ -288,6 +289,10 @@ def is_pypy(): return hasattr(sys, "pypy_translation_info") +def is_mingw(): + return sysconfig.get_platform() == "mingw" + + if sys.platform == "win32": IMCONVERT = os.environ.get("MAGICK_HOME", "") if IMCONVERT: diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 0e642cde28e..bd79f08e39b 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -13,6 +13,7 @@ assert_image_equal, assert_image_similar, assert_image_similar_tofile, + is_mingw, is_pypy, is_win32, skip_unless_feature, @@ -660,6 +661,7 @@ def test_variation_get(self): {"name": b"Size", "minimum": 0, "maximum": 300, "default": 0} ] + @pytest.mark.skipif(is_mingw(), reason="epsilon too high for meaningful test") def test_variation_set_by_name(self): font = self.get_font() @@ -692,6 +694,7 @@ def _check_text(font, path, epsilon): font.set_variation_by_name(name) _check_text(font, "Tests/images/variation_tiny_name.png", 40) + @pytest.mark.skipif(is_mingw(), reason="epsilon too high for meaningful test") def test_variation_set_by_axes(self): font = self.get_font() diff --git a/Tests/test_imagefontctl.py b/Tests/test_imagefontctl.py index 6d7a9c2f485..386dd3be63d 100644 --- a/Tests/test_imagefontctl.py +++ b/Tests/test_imagefontctl.py @@ -60,7 +60,7 @@ def test_complex_unicode_text(): target = "Tests/images/test_complex_unicode_text2.png" with Image.open(target) as target_img: - assert_image_similar(im, target_img, 2.3) + assert_image_similar(im, target_img, 2.33) def test_text_direction_rtl(): diff --git a/setup.py b/setup.py index 8c9f0213f10..b7982a5bac4 100755 --- a/setup.py +++ b/setup.py @@ -711,7 +711,7 @@ def build_extensions(self): if feature.jpeg2000: libs.append(feature.jpeg2000) defs.append(("HAVE_OPENJPEG", None)) - if sys.platform == "win32": + if sys.platform == "win32" and not PLATFORM_MINGW: defs.append(("OPJ_STATIC", None)) if feature.zlib: libs.append(feature.zlib) diff --git a/src/_imagingft.c b/src/_imagingft.c index a9b00431a4e..554c72786e7 100644 --- a/src/_imagingft.c +++ b/src/_imagingft.c @@ -31,7 +31,7 @@ #define KEEP_PY_UNICODE -#if !defined(_MSC_VER) +#ifndef _WIN32 #include #endif @@ -155,20 +155,24 @@ setraqm(void) p_raqm.raqm = NULL; /* Microsoft needs a totally different system */ -#if !defined(_MSC_VER) +#ifndef _WIN32 p_raqm.raqm = dlopen("libraqm.so.0", RTLD_LAZY); if (!p_raqm.raqm) { p_raqm.raqm = dlopen("libraqm.dylib", RTLD_LAZY); } #else p_raqm.raqm = LoadLibrary("libraqm"); + /* MSYS */ + if (!p_raqm.raqm) { + p_raqm.raqm = LoadLibrary("libraqm-0"); + } #endif if (!p_raqm.raqm) { return 1; } -#if !defined(_MSC_VER) +#ifndef _WIN32 p_raqm.version_atleast = (t_raqm_version_atleast)dlsym(p_raqm.raqm, "raqm_version_atleast"); p_raqm.create = (t_raqm_create)dlsym(p_raqm.raqm, "raqm_create"); p_raqm.set_text = (t_raqm_set_text)dlsym(p_raqm.raqm, "raqm_set_text");