The windows binaries build

This commit is contained in:
Kovid Goyal 2014-06-07 20:35:27 +05:30
parent 1a478dd15e
commit b43fd024d7
3 changed files with 41 additions and 23 deletions

View File

@ -117,9 +117,24 @@ icu_lib_dirs = []
zlib_inc_dirs = [] zlib_inc_dirs = []
zlib_lib_dirs = [] zlib_lib_dirs = []
zlib_libs = ['z'] zlib_libs = ['z']
ICU = sw = ''
QT_DLLS = ['Qt5' + x for x in (
'Core', 'Gui', 'Multimedia', 'MultimediaWidgets', 'OpenGL', 'Network',
'PrintSupport', 'Positioning', 'Quick', 'Qml', 'Sensors', 'Sql', 'Svg',
'WebKit', 'WebKitWidgets', 'Widgets', # 'Xml', 'XmlPatterns'
)]
QT_PLUGINS = ('imageformats', 'audio', 'iconengines', 'mediaservice', 'platforms', 'playlistformats', 'printsupport', 'sqldrivers')
PYQT_MODULES = ('Qt', 'QtCore', 'QtGui', 'QtNetwork', 'QtMultimedia', 'QtMultimediaWidgets',
'QtPrintSupport', 'QtSensors', 'QtSvg', 'QtWebKit', 'QtWebKitWidgets', 'QtWidgets')
if iswindows: if iswindows:
prefix = r'C:\cygwin64\home\kovid\sw' QT_DLLS += ['Qt5WinExtras']
QT_DLLS = {x + '.dll' for x in QT_DLLS}
PYQT_MODULES += ('QtWinExtras',)
PYQT_MODULES = {x + '.pyd' for x in PYQT_MODULES}
prefix = sw = os.environ.get('SW', r'C:\cygwin64\home\kovid\sw')
sw_inc_dir = os.path.join(prefix, 'include') sw_inc_dir = os.path.join(prefix, 'include')
sw_lib_dir = os.path.join(prefix, 'lib') sw_lib_dir = os.path.join(prefix, 'lib')
ICU = os.environ.get('ICU_DIR', os.path.join(prefix, 'private', 'icu')) ICU = os.environ.get('ICU_DIR', os.path.join(prefix, 'private', 'icu'))

View File

@ -7,21 +7,20 @@ __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time, textwrap import sys, os, shutil, glob, py_compile, subprocess, re, zipfile, time, textwrap
from itertools import chain
from setup import (Command, modules, functions, basenames, __version__, from setup import (Command, modules, functions, basenames, __version__,
__appname__) __appname__)
from setup.build_environment import msvc, MT, RC, is64bit from setup.build_environment import (
msvc, MT, RC, is64bit, ICU as ICU_DIR, sw as SW, QT_DLLS, QMAKE, QT_PLUGINS, PYQT_MODULES)
from setup.installer.windows.wix import WixMixIn from setup.installer.windows.wix import WixMixIn
ICU_DIR = os.environ.get('ICU_DIR', r'Q:\icu') OPENSSL_DIR = os.environ.get('OPENSSL_DIR', os.path.join(SW, 'private', 'openssl'))
OPENSSL_DIR = os.environ.get('OPENSSL_DIR', r'Q:\openssl') SW = r'C:\cygwin64\home\kovid\sw'
QT_DIR = os.environ.get('QT_DIR', 'Q:\\Qt\\current') IMAGEMAGICK = os.path.join(SW, 'build', 'ImageMagick-*\\VisualMagick\\bin')
QT_DLLS = ['Core', 'Gui', 'Network', 'Svg', 'WebKit', 'Xml', 'XmlPatterns']
SW = r'C:\cygwin\home\kovid\sw'
IMAGEMAGICK = os.path.join(SW, 'build',
'ImageMagick-*\\VisualMagick\\bin')
CRT = r'C:\Microsoft.VC90.CRT' CRT = r'C:\Microsoft.VC90.CRT'
LZMA = r'Q:\easylzma\build\easylzma-0.0.8' LZMA = os.path.join(SW, *('private/easylzma/build/easylzma-0.0.8'.split('/')))
QT_DIR = subprocess.check_output([QMAKE, '-query', 'QT_INSTALL_PREFIX']).decode('utf-8').strip()
VERSION = re.sub('[a-z]\d+', '', __version__) VERSION = re.sub('[a-z]\d+', '', __version__)
WINVER = VERSION+'.0' WINVER = VERSION+'.0'
@ -106,9 +105,10 @@ class Win32Freeze(Command, WixMixIn):
repl_pat = re.compile( repl_pat = re.compile(
r'(?is)<dependency>.*?Microsoft\.VC\d+\.CRT.*?</dependency>') r'(?is)<dependency>.*?Microsoft\.VC\d+\.CRT.*?</dependency>')
for dll in (glob.glob(self.j(self.dll_dir, '*.dll')) + for dll in chain(walk(self.dll_dir), walk(self.plugins_dir)):
glob.glob(self.j(self.plugins_dir, '*.pyd'))):
bn = self.b(dll) bn = self.b(dll)
if bn.rpartition('.')[-1] not in {'dll', 'pyd'}:
continue
with open(dll, 'rb') as f: with open(dll, 'rb') as f:
raw = f.read() raw = f.read()
match = search_pat.search(raw) match = search_pat.search(raw)
@ -175,10 +175,8 @@ class Win32Freeze(Command, WixMixIn):
shutil.copy2(x, self.dll_dir) shutil.copy2(x, self.dll_dir)
for x in glob.glob(self.j(ICU_DIR, 'source', 'lib', '*.dll')): for x in glob.glob(self.j(ICU_DIR, 'source', 'lib', '*.dll')):
shutil.copy2(x, self.dll_dir) shutil.copy2(x, self.dll_dir)
for x in QT_DLLS: for x in QT_DLLS:
x += '4.dll'
if not x.startswith('phonon'):
x = 'Qt'+x
shutil.copy2(os.path.join(QT_DIR, 'bin', x), self.dll_dir) shutil.copy2(os.path.join(QT_DIR, 'bin', x), self.dll_dir)
shutil.copy2(r'C:\windows\system32\python%s.dll'%self.py_ver, shutil.copy2(r'C:\windows\system32\python%s.dll'%self.py_ver,
self.dll_dir) self.dll_dir)
@ -219,6 +217,9 @@ class Win32Freeze(Command, WixMixIn):
for pat in (r'PyQt5\uic\port_v3', ): for pat in (r'PyQt5\uic\port_v3', ):
x = glob.glob(self.j(self.lib_dir, 'site-packages', pat))[0] x = glob.glob(self.j(self.lib_dir, 'site-packages', pat))[0]
shutil.rmtree(x) shutil.rmtree(x)
pyqt = self.j(self.lib_dir, 'site-packages', 'PyQt5')
for x in {x for x in os.listdir(pyqt) if x.endswith('.pyd')} - PYQT_MODULES:
os.remove(self.j(pyqt, x))
self.info('Adding calibre sources...') self.info('Adding calibre sources...')
for x in glob.glob(self.j(self.SRC, '*')): for x in glob.glob(self.j(self.SRC, '*')):
@ -262,7 +263,7 @@ class Win32Freeze(Command, WixMixIn):
qt_prefix = QT_DIR qt_prefix = QT_DIR
plugdir = self.j(qt_prefix, 'plugins') plugdir = self.j(qt_prefix, 'plugins')
tdir = self.j(self.base, 'qt_plugins') tdir = self.j(self.base, 'qt_plugins')
for d in ('imageformats', 'codecs', 'iconengines'): for d in QT_PLUGINS:
self.info('\t', d) self.info('\t', d)
imfd = os.path.join(plugdir, d) imfd = os.path.join(plugdir, d)
tg = os.path.join(tdir, d) tg = os.path.join(tdir, d)
@ -655,12 +656,12 @@ class Win32Freeze(Command, WixMixIn):
sp = self.j(self.lib_dir, 'site-packages') sp = self.j(self.lib_dir, 'site-packages')
# Special handling for PIL and pywin32 # Special handling for PIL and pywin32
handled = set(['PIL.pth', 'pywin32.pth', 'PIL', 'win32']) handled = set(['pywin32.pth', 'win32'])
pil_dir = glob.glob(self.j(sp, 'Pillow*', 'PIL'))[-1]
if is64bit: if is64bit:
# PIL can raise exceptions, which cause crashes on 64bit # PIL can raise exceptions, which cause crashes on 64bit
shutil.copytree(self.j(sp, 'PIL'), self.j(self.dll_dir, 'PIL')) shutil.copytree(pil_dir, self.j(self.dll_dir, 'PIL'))
else: handled.add(self.b(self.d(pil_dir)))
self.add_to_zipfile(zf, 'PIL', sp)
base = self.j(sp, 'win32', 'lib') base = self.j(sp, 'win32', 'lib')
for x in os.listdir(base): for x in os.listdir(base):
if os.path.splitext(x)[1] not in ('.exe',): if os.path.splitext(x)[1] not in ('.exe',):
@ -676,7 +677,10 @@ class Win32Freeze(Command, WixMixIn):
handled.add('site.pyo') handled.add('site.pyo')
for d in self.get_pth_dirs(self.j(sp, 'easy-install.pth')): for d in self.get_pth_dirs(self.j(sp, 'easy-install.pth')):
handled.add(self.b(d)) hname = self.b(d)
if hname in handled:
continue
handled.add(hname)
if os.path.basename(d).startswith('six-'): if os.path.basename(d).startswith('six-'):
continue # We prefer the version bundled with calibre continue # We prefer the version bundled with calibre
for x in os.listdir(d): for x in os.listdir(d):

View File

@ -11,12 +11,11 @@ import os, shutil, subprocess, sys
from setup import __appname__, __version__, basenames from setup import __appname__, __version__, basenames
from setup.build_environment import is64bit from setup.build_environment import is64bit
WIXP = r'C:\Program Files (x86)\WiX Toolset v3.8'
if is64bit: if is64bit:
WIXP = r'C:\Program Files (x86)\WiX Toolset v3.6'
UPGRADE_CODE = '5DD881FF-756B-4097-9D82-8C0F11D521EA' UPGRADE_CODE = '5DD881FF-756B-4097-9D82-8C0F11D521EA'
MINVERHUMAN = 'Windows Vista' MINVERHUMAN = 'Windows Vista'
else: else:
WIXP = r'C:\Program Files\WiX Toolset v3.6'
UPGRADE_CODE = 'BEB2A80D-E902-4DAD-ADF9-8BD2DA42CFE1' UPGRADE_CODE = 'BEB2A80D-E902-4DAD-ADF9-8BD2DA42CFE1'
MINVERHUMAN = 'Windows XP SP3' MINVERHUMAN = 'Windows XP SP3'