Pillow/winbuild/build.py
Jon Dufresne d244fbb299 Remove unnecessary calls to dict.keys()
iter(dict) is equivalent to iter(dict.keys()), so simply act on the dict
instead of adding the extra call.

Inspired by Lennart Regebro's PyCon 2017 presentation "Prehistoric
Patterns in Python". Available at:

https://www.youtube.com/watch?v=V5-JH23Vk0I
2017-05-28 09:55:38 -07:00

159 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python3
import subprocess
import shutil
import sys
import getopt
import os
from config import (compilers, compiler_from_env, pythons, pyversion_from_env,
VIRT_BASE, X64_EXT)
def setup_vms():
ret = []
for py in pythons:
for arch in ('', X64_EXT):
ret.append("virtualenv -p c:/Python%s%s/python.exe --clear %s%s%s"
% (py, arch, VIRT_BASE, py, arch))
ret.append(r"%s%s%s\Scripts\pip.exe install nose" %
(VIRT_BASE, py, arch))
return "\n".join(ret)
def run_script(params):
(version, script) = params
try:
print("Running %s" % version)
filename = 'build_pillow_%s.cmd' % version
with open(filename, 'w') as f:
f.write(script)
command = ['powershell', "./%s" % filename]
proc = subprocess.Popen(command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
(trace, stderr) = proc.communicate()
status = proc.returncode
print("-- stderr --")
print(stderr)
print("-- stdout --")
print(trace)
print("Done with %s: %s" % (version, status))
return (version, status, trace, stderr)
except Exception as msg:
print("Error with %s: %s" % (version, str(msg)))
return (version, -1, "", str(msg))
def header(op):
return r"""
setlocal
set MPLSRC=%%~dp0\..
set INCLIB=%%~dp0\depends
set BLDOPT=%s
cd /D %%MPLSRC%%
""" % (op)
def footer():
return """endlocal
exit
"""
def build_one(py_ver, compiler):
# UNDONE virtual envs if we're not running on appveyor
args = {}
args.update(compiler)
if 'PYTHON' in os.environ:
args['python_path'] = "%PYTHON%"
else:
args['python_path'] = "%s%s\\Scripts" % (VIRT_BASE, py_ver)
args['py_ver'] = py_ver
if '34' in py_ver:
args['tcl_ver'] = '86'
else:
args['tcl_ver'] = '85'
return r"""
setlocal EnableDelayedExpansion
call "%%ProgramFiles%%\Microsoft SDKs\Windows\%(env_version)s\Bin\SetEnv.Cmd" /Release %(env_flags)s
set DISTUTILS_USE_SDK=1
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\python.exe setup.py %%BLDOPT%%
endlocal
endlocal
""" % args
def clean():
try:
shutil.rmtree('../build')
except:
# could already be removed
pass
run_script(('virtualenvs', setup_vms()))
def main(op):
scripts = []
for py_version, compiler_version in pythons.items():
scripts.append((py_version,
"\n".join([header(op),
build_one(py_version,
compilers[(compiler_version,
32)]),
footer()])))
scripts.append(("%s%s" % (py_version, X64_EXT),
"\n".join([header(op),
build_one("%sx64" % py_version,
compilers[(compiler_version,
64)]),
footer()])))
results = map(run_script, scripts)
for (version, status, trace, err) in results:
print("Compiled %s: %s" % (version, status and 'ERR' or 'OK'))
def run_one(op):
compiler = compiler_from_env()
py_version = pyversion_from_env()
run_script((py_version,
"\n".join([header(op),
build_one(py_version, compiler),
footer()])
))
if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], '', ['clean', 'dist', 'wheel'])
opts = dict(opts)
if '--clean' in opts:
clean()
op = 'install'
if '--dist' in opts:
op = "bdist_wininst --user-access-control=auto"
elif '--wheel' in opts:
op = "bdist_wheel"
if 'PYTHON' in os.environ:
run_one(op)
else:
main(op)