From afb6ba562684265dc632d23887355df1cad1160e Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 8 Oct 2018 19:43:11 +1100 Subject: [PATCH 1/2] Added Python 3.5-3.7 AppVeyor builds --- .appveyor.yml | 8 ++- setup.py | 5 +- winbuild/build.py | 44 ++++++++++------ winbuild/build_dep.py | 32 ++++++----- winbuild/config.py | 120 +++++++++++++++++++++++++++--------------- 5 files changed, 135 insertions(+), 74 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 95d816a98..da8c1708b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -18,8 +18,14 @@ environment: PIP_DIR: bin VENV: YES - PYTHON: C:/Python27-x64 - - PYTHON: C:/Python34 + - PYTHON: C:/Python37 - PYTHON: C:/Python27 + - PYTHON: C:/Python37-x64 + - PYTHON: C:/Python36 + - PYTHON: C:/Python36-x64 + - PYTHON: C:/Python35 + - PYTHON: C:/Python35-x64 + - PYTHON: C:/Python34 - PYTHON: C:/Python34-x64 - PYTHON: C:/msys64/mingw32 EXECUTABLE: bin/python3 diff --git a/setup.py b/setup.py index 15d81e465..c0278fd19 100755 --- a/setup.py +++ b/setup.py @@ -191,10 +191,11 @@ class pil_build_ext(build_ext): ('disable-platform-guessing', None, 'Disable platform guessing on Linux'), ('debug', None, 'Debug logging') - ] + ] + [('add-imaging-libs=', None, 'Add libs to _imaging build')] def initialize_options(self): self.disable_platform_guessing = None + self.add_imaging_libs = "" build_ext.initialize_options(self) for x in self.feature: setattr(self, 'disable_%s' % x, None) @@ -598,7 +599,7 @@ class pil_build_ext(build_ext): for src_file in _LIB_IMAGING: files.append(os.path.join("src/libImaging", src_file + ".c")) - libs = [] + libs = self.add_imaging_libs.split() defs = [] if feature.jpeg: libs.append(feature.jpeg) diff --git a/winbuild/build.py b/winbuild/build.py index 859a40277..ad8b2a2a9 100755 --- a/winbuild/build.py +++ b/winbuild/build.py @@ -7,7 +7,7 @@ import getopt import os from config import (compilers, compiler_from_env, pythons, pyversion_from_env, - VIRT_BASE, X64_EXT) + bit_from_env, VIRT_BASE, X64_EXT) def setup_vms(): @@ -64,7 +64,15 @@ exit """ -def build_one(py_ver, compiler): +def vc_setup(compiler, bit): + script = "" + if compiler['vc_version'] == '2015': + arch = "x86" if bit == 32 else "x86_amd64" + script = r""" +call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %s""" % arch + return script + +def build_one(py_ver, compiler, bit): # UNDONE virtual envs if we're not running on appveyor args = {} args.update(compiler) @@ -78,12 +86,17 @@ def build_one(py_ver, compiler): args['executable'] = "%EXECUTABLE%" args['py_ver'] = py_ver - if '34' in py_ver: - args['tcl_ver'] = '86' - else: + if '27' in py_ver: args['tcl_ver'] = '85' + else: + args['tcl_ver'] = '86' - return r""" + if compiler['vc_version'] == '2015': + args['imaging_libs'] = ' build_ext --add-imaging-libs=msvcrt' + else: + args['imaging_libs'] = '' + + script = r""" setlocal EnableDelayedExpansion call "%%ProgramFiles%%\Microsoft SDKs\Windows\%(env_version)s\Bin\SetEnv.Cmd" /Release %(env_flags)s set DISTUTILS_USE_SDK=1 @@ -91,12 +104,13 @@ set LIB=%%LIB%%;%%INCLIB%%\%(inc_dir)s set INCLUDE=%%INCLUDE%%;%%INCLIB%%\%(inc_dir)s;%%INCLIB%%\tcl%(tcl_ver)s\include setlocal -set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl -call %(python_path)s\%(executable)s setup.py %%BLDOPT%% +set LIB=%%LIB%%;C:\Python%(py_ver)s\tcl""" + vc_setup(compiler, bit) + r""" +call %(python_path)s\%(executable)s setup.py %(imaging_libs)s %%BLDOPT%% endlocal endlocal -""" % args +""" + return script % args def clean(): @@ -111,19 +125,18 @@ def clean(): def main(op): scripts = [] - for py_version, compiler_version in pythons.items(): + for py_version, py_info in pythons.items(): + py_compilers = compilers[py_info['compiler']][py_info['vc']] scripts.append((py_version, "\n".join([header(op), build_one(py_version, - compilers[(compiler_version, - 32)]), + py_compilers[32], 32), footer()]))) scripts.append(("%s%s" % (py_version, X64_EXT), "\n".join([header(op), build_one("%sx64" % py_version, - compilers[(compiler_version, - 64)]), + py_compilers[64], 64), footer()]))) results = map(run_script, scripts) @@ -136,10 +149,11 @@ def run_one(op): compiler = compiler_from_env() py_version = pyversion_from_env() + bit = bit_from_env() run_script((py_version, "\n".join([header(op), - build_one(py_version, compiler), + build_one(py_version, compiler, bit), footer()]) )) diff --git a/winbuild/build_dep.py b/winbuild/build_dep.py index 6ac3baa47..3eefb2611 100644 --- a/winbuild/build_dep.py +++ b/winbuild/build_dep.py @@ -3,7 +3,9 @@ from untar import untar import os from fetch import fetch -from config import compilers, compiler_from_env, libs +from config import (compilers, all_compilers, compiler_from_env, bit_from_env, + libs) +from build import vc_setup def _relpath(*args): @@ -28,7 +30,7 @@ def mkdirs(): os.mkdir(inc_dir) except OSError: pass - for compiler in compilers.values(): + for compiler in all_compilers(): try: os.mkdir(os.path.join(inc_dir, compiler['inc_dir'])) except OSError: @@ -48,7 +50,7 @@ def extract_libs(): if not os.path.exists(filename): filename = fetch(lib['url']) if name == 'openjpeg': - for compiler in compilers.values(): + for compiler in all_compilers(): if not os.path.exists(os.path.join( build_dir, lib['dir']+compiler['inc_dir'])): extract(filename, build_dir) @@ -148,11 +150,12 @@ endlocal """ % atts -def nmake_libs(compiler): +def nmake_libs(compiler, bit): # undone -- pre, makes, headers, libs - return r""" + script = r""" rem Build libjpeg setlocal +""" + vc_setup(compiler, bit) + r""" cd /D %%JPEG%% nmake -f makefile.vc setup-vc6 nmake -f makefile.vc clean @@ -176,6 +179,7 @@ endlocal rem Build webp setlocal +""" + vc_setup(compiler, bit) + r""" cd /D %%WEBP%% rd /S /Q %%WEBP%%\output\release-static nmake -f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output all @@ -186,6 +190,7 @@ endlocal rem Build libtiff setlocal +""" + vc_setup(compiler, bit) + r""" rem do after building jpeg and zlib copy %%~dp0\nmake.opt %%TIFF%% @@ -196,9 +201,8 @@ copy /Y /B libtiff\*.dll %%INCLIB%% copy /Y /B libtiff\*.lib %%INCLIB%% copy /Y /B libtiff\tiff*.h %%INCLIB%% endlocal - - -""" % compiler +""" + return script % compiler def msbuild_freetype(compiler): @@ -273,9 +277,9 @@ endlocal """ % compiler -def add_compiler(compiler): +def add_compiler(compiler, bit): script.append(setup_compiler(compiler)) - script.append(nmake_libs(compiler)) + script.append(nmake_libs(compiler, bit)) # script.append(extract_openjpeg(compiler)) @@ -293,12 +297,12 @@ script = [header(), if 'PYTHON' in os.environ: - add_compiler(compiler_from_env()) + add_compiler(compiler_from_env(), bit_from_env()) else: - # for compiler in compilers.values(): + # for compiler in all_compilers(): # add_compiler(compiler) - add_compiler(compilers[(7.0, 32)]) - # add_compiler(compilers[(7.1, 64)]) + add_compiler(compilers[7.0][2008][32], 32) + # add_compiler(compilers[7.1][2010][64]) with open('build_deps.cmd', 'w') as f: f.write("\n".join(script)) diff --git a/winbuild/config.py b/winbuild/config.py index 404ce16a7..2bd49552a 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -3,12 +3,13 @@ import os SF_MIRROR = 'http://iweb.dl.sourceforge.net' PILLOW_DEPENDS_DIR = 'C:\\pillow-depends\\' -pythons = { # '26': 7, - '27': 7, - 'pypy2': 7, - # '32': 7, - '33': 7.1, - '34': 7.1} +pythons = {'27': {'compiler':7, 'vc':2008}, + 'pypy2': {'compiler':7, 'vc':2008}, + '33': {'compiler':7.1, 'vc':2010}, + '34': {'compiler':7.1, 'vc':2010}, + '35': {'compiler':7.1, 'vc':2015}, + '36': {'compiler':7.1, 'vc':2015}, + '37': {'compiler':7.1, 'vc':2015}} VIRT_BASE = "c:/vp/" X64_EXT = os.environ.get('X64_EXT', "x64") @@ -78,38 +79,64 @@ libs = { } compilers = { - (7, 64): { - 'env_version': 'v7.0', - 'vc_version': '2008', - 'env_flags': '/x64 /xp', - 'inc_dir': 'msvcr90-x64', - 'platform': 'x64', - 'webp_platform': 'x64', - }, - (7, 32): { - 'env_version': 'v7.0', - 'vc_version': '2008', - 'env_flags': '/x86 /xp', - 'inc_dir': 'msvcr90-x32', - 'platform': 'Win32', - 'webp_platform': 'x86', - }, - (7.1, 64): { - 'env_version': 'v7.1', - 'vc_version': '2010', - 'env_flags': '/x64 /vista', - 'inc_dir': 'msvcr10-x64', - 'platform': 'x64', - 'webp_platform': 'x64', - }, - (7.1, 32): { - 'env_version': 'v7.1', - 'vc_version': '2010', - 'env_flags': '/x86 /vista', - 'inc_dir': 'msvcr10-x32', - 'platform': 'Win32', - 'webp_platform': 'x86', + 7: { + 2008: { + 64: { + 'env_version': 'v7.0', + 'vc_version': '2008', + 'env_flags': '/x64 /xp', + 'inc_dir': 'msvcr90-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.0', + 'vc_version': '2008', + 'env_flags': '/x86 /xp', + 'inc_dir': 'msvcr90-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + } }, + 7.1: { + 2010: { + 64: { + 'env_version': 'v7.1', + 'vc_version': '2010', + 'env_flags': '/x64 /vista', + 'inc_dir': 'msvcr10-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.1', + 'vc_version': '2010', + 'env_flags': '/x86 /vista', + 'inc_dir': 'msvcr10-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + }, + 2015: { + 64: { + 'env_version': 'v7.1', + 'vc_version': '2015', + 'env_flags': '/x64 /vista', + 'inc_dir': 'msvcr10-x64', + 'platform': 'x64', + 'webp_platform': 'x64', + }, + 32: { + 'env_version': 'v7.1', + 'vc_version': '2015', + 'env_flags': '/x86 /vista', + 'inc_dir': 'msvcr10-x32', + 'platform': 'Win32', + 'webp_platform': 'x86', + } + } + } } @@ -133,11 +160,20 @@ def compiler_from_env(): for k, v in pythons.items(): if k in py: - compiler_version = v + py_info = v break - bit = 32 - if '64' in py: - bit = 64 + bit = bit_from_env() + return compilers[py_info['compiler']][py_info['vc']][bit] - return compilers[(compiler_version, bit)] +def bit_from_env(): + py = os.environ['PYTHON'] + + return 64 if '64' in py else 32 + +def all_compilers(): + all = [] + for vc_compilers in compilers.values(): + for bit_compilers in vc_compilers.values(): + all += bit_compilers.values() + return all From 3d8024c45fb3d2e717871c4570aac99bb3911249 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Tue, 9 Oct 2018 06:11:09 +1100 Subject: [PATCH 2/2] Removed unused line --- winbuild/config.py | 1 - 1 file changed, 1 deletion(-) diff --git a/winbuild/config.py b/winbuild/config.py index 2bd49552a..bfce09b03 100644 --- a/winbuild/config.py +++ b/winbuild/config.py @@ -5,7 +5,6 @@ PILLOW_DEPENDS_DIR = 'C:\\pillow-depends\\' pythons = {'27': {'compiler':7, 'vc':2008}, 'pypy2': {'compiler':7, 'vc':2008}, - '33': {'compiler':7.1, 'vc':2010}, '34': {'compiler':7.1, 'vc':2010}, '35': {'compiler':7.1, 'vc':2015}, '36': {'compiler':7.1, 'vc':2015},