Define the extensions as pure data

This commit is contained in:
Kovid Goyal 2016-07-20 15:59:02 +05:30
parent f910c1201a
commit 3466aaff4c
3 changed files with 369 additions and 337 deletions

View File

@ -6,20 +6,12 @@ __license__ = 'GPL v3'
__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>' __copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en' __docformat__ = 'restructuredtext en'
import textwrap, os, shlex, subprocess, glob, shutil, re, sys import textwrap, os, shlex, subprocess, glob, shutil, re, sys, json
from distutils import sysconfig from collections import namedtuple
from setup import Command, islinux, isbsd, isosx, SRC, iswindows, __version__ from setup import Command, islinux, isbsd, isosx, SRC, iswindows, __version__
from setup.build_environment import (
chmlib_inc_dirs, podofo_inc, podofo_lib, podofo_error, pyqt, NMAKE, QMAKE,
msvc, win_inc, win_lib, chmlib_lib_dirs, sqlite_inc_dirs, icu_inc_dirs,
icu_lib_dirs, ft_libs, ft_lib_dirs, ft_inc_dirs, is64bit,
glib_flags, fontconfig_flags, openssl_inc_dirs, openssl_lib_dirs,
zlib_inc_dirs, zlib_lib_dirs, zlib_libs, qmakespec, icu_libs)
from setup.parallel_build import create_job, parallel_build, cpu_count
isunix = islinux or isosx or isbsd isunix = islinux or isosx or isbsd
make = 'make' if isunix else NMAKE
py_lib = os.path.join(sys.prefix, 'libs', 'python%d%d.lib' % sys.version_info[:2]) py_lib = os.path.join(sys.prefix, 'libs', 'python%d%d.lib' % sys.version_info[:2])
def absolutize(paths): def absolutize(paths):
@ -30,8 +22,8 @@ class Extension(object):
def __init__(self, name, sources, **kwargs): def __init__(self, name, sources, **kwargs):
self.data = d = {} self.data = d = {}
self.name = d['name'] = name self.name = d['name'] = name
self.needs_cxx = d['needs_cxx'] = bool([1 for x in sources if os.path.splitext(x)[1] in ('.cpp', '.c++', '.cxx')])
self.sources = d['sources'] = absolutize(sources) self.sources = d['sources'] = absolutize(sources)
self.needs_cxx = d['needs_cxx'] = bool([1 for x in self.sources if os.path.splitext(x)[1] in ('.cpp', '.c++', '.cxx')])
self.headers = d['headers'] = absolutize(kwargs.get('headers', [])) self.headers = d['headers'] = absolutize(kwargs.get('headers', []))
self.sip_files = d['sip_files'] = absolutize(kwargs.get('sip_files', [])) self.sip_files = d['sip_files'] = absolutize(kwargs.get('sip_files', []))
self.inc_dirs = d['inc_dirs'] = absolutize(kwargs.get('inc_dirs', [])) self.inc_dirs = d['inc_dirs'] = absolutize(kwargs.get('inc_dirs', []))
@ -51,264 +43,92 @@ class Extension(object):
self.cflags.insert(0, of) self.cflags.insert(0, of)
self.qt_private_headers = d['qt_private_headers'] = kwargs.get('qt_private', []) self.qt_private_headers = d['qt_private_headers'] = kwargs.get('qt_private', [])
reflow_sources = glob.glob(os.path.join(SRC, 'calibre', 'ebooks', 'pdf', '*.cpp'))
reflow_headers = glob.glob(os.path.join(SRC, 'calibre', 'ebooks', 'pdf', '*.h'))
extensions = [ def lazy_load(name):
if name.startswith('!'):
Extension('lzma_binding', name = name[1:]
glob.glob(os.path.join(SRC, 'lzma', '*.c')), from setup import build_environment
headers=glob.glob(os.path.join(SRC, 'lzma', '*.h')), try:
cflags=[('/' if iswindows else '-') + 'D' + x for x in ('_7ZIP_ST',)], return getattr(build_environment, name)
), except AttributeError:
raise ImportError('The setup.build_environment module has no symbol named: %s' % name)
Extension('dukpy',
['duktape/%s.c' % x for x in 'errors context conversions proxy module duktape/duktape'.split()],
headers=['duktape/dukpy.h', 'duktape/duktape/duk_config.h', 'duktape/duktape/duktape.h'],
optimize_level=2,
),
Extension('hunspell',
['hunspell/'+x for x in
'affentry.cxx affixmgr.cxx csutil.cxx dictmgr.cxx filemgr.cxx hashmgr.cxx hunspell.cxx phonet.cxx replist.cxx suggestmgr.cxx'.split()
] + ['calibre/utils/spell/hunspell_wrapper.cpp',],
inc_dirs=['hunspell'],
cflags='/DHUNSPELL_STATIC /D_CRT_SECURE_NO_WARNINGS /DUNICODE /D_UNICODE'.split() if iswindows else ['-DHUNSPELL_STATIC'],
optimize_level=2,
),
Extension('_regex',
['regex/_regex.c', 'regex/_regex_unicode.c'],
headers=['regex/_regex.h'],
optimize_level=2,
),
Extension('monotonic',
['calibre/utils/monotonic.c'],
libraries=['rt'] if islinux else [],
),
Extension('speedup',
['calibre/utils/speedup.c'],
libraries=[] if iswindows else ['m']
),
Extension('zlib2',
['calibre/utils/zlib2.c'],
inc_dirs=zlib_inc_dirs,
libraries=zlib_libs, lib_dirs=zlib_lib_dirs
),
Extension('certgen',
['calibre/utils/certgen.c'],
libraries=['libeay32'] if iswindows else ['crypto'],
inc_dirs=openssl_inc_dirs, lib_dirs=openssl_lib_dirs,
),
Extension('html',
['calibre/gui2/tweak_book/editor/syntax/html.c'],
),
Extension('tokenizer',
['tinycss/tokenizer.c'],
),
Extension('_patiencediff_c',
['calibre/gui2/tweak_book/diff/_patiencediff_c.c'],
),
Extension('icu',
['calibre/utils/icu.c'],
headers=['calibre/utils/icu_calibre_utils.h'],
libraries=icu_libs,
lib_dirs=icu_lib_dirs,
inc_dirs=icu_inc_dirs
),
Extension('sqlite_custom',
['calibre/library/sqlite_custom.c'],
inc_dirs=sqlite_inc_dirs
),
Extension('chmlib',
['calibre/utils/chm/swig_chm.c'],
libraries=['ChmLib' if iswindows else 'chm'],
inc_dirs=chmlib_inc_dirs,
lib_dirs=chmlib_lib_dirs,
cflags=["-DSWIG_COBJECT_TYPES"]),
Extension('chm_extra',
['calibre/utils/chm/extra.c'],
libraries=['ChmLib' if iswindows else 'chm'],
inc_dirs=chmlib_inc_dirs,
lib_dirs=chmlib_lib_dirs,
cflags=["-D__PYTHON__"]),
Extension('lzx',
['calibre/utils/lzx/lzxmodule.c',
'calibre/utils/lzx/compressor.c',
'calibre/utils/lzx/lzxd.c',
'calibre/utils/lzx/lzc.c',
'calibre/utils/lzx/lzxc.c'],
headers=['calibre/utils/lzx/msstdint.h',
'calibre/utils/lzx/lzc.h',
'calibre/utils/lzx/lzxmodule.h',
'calibre/utils/lzx/system.h',
'calibre/utils/lzx/lzxc.h',
'calibre/utils/lzx/lzxd.h',
'calibre/utils/lzx/mspack.h'],
inc_dirs=['calibre/utils/lzx']),
Extension('freetype',
['calibre/utils/fonts/freetype.cpp'],
inc_dirs=ft_inc_dirs,
libraries=ft_libs,
lib_dirs=ft_lib_dirs),
Extension('msdes',
['calibre/utils/msdes/msdesmodule.c',
'calibre/utils/msdes/des.c'],
headers=['calibre/utils/msdes/spr.h',
'calibre/utils/msdes/d3des.h'],
inc_dirs=['calibre/utils/msdes']),
Extension('cPalmdoc',
['calibre/ebooks/compression/palmdoc.c']),
Extension('bzzdec',
['calibre/ebooks/djvu/bzzdecoder.c'],
inc_dirs=(['calibre/utils/chm'] if iswindows else []) # For stdint.h
),
Extension('matcher',
['calibre/utils/matcher.c'],
headers=['calibre/utils/icu_calibre_utils.h'],
libraries=icu_libs,
lib_dirs=icu_lib_dirs,
inc_dirs=icu_inc_dirs
),
Extension('podofo',
[
'calibre/utils/podofo/utils.cpp',
'calibre/utils/podofo/output.cpp',
'calibre/utils/podofo/doc.cpp',
'calibre/utils/podofo/outline.cpp',
'calibre/utils/podofo/podofo.cpp',
],
headers=[
'calibre/utils/podofo/global.h',
],
libraries=['podofo'],
lib_dirs=[podofo_lib],
inc_dirs=[podofo_inc, os.path.dirname(podofo_inc)],
error=podofo_error),
Extension('pictureflow',
['calibre/gui2/pictureflow/pictureflow.cpp'],
inc_dirs=['calibre/gui2/pictureflow'],
headers=['calibre/gui2/pictureflow/pictureflow.h'],
sip_files=['calibre/gui2/pictureflow/pictureflow.sip']
),
Extension('progress_indicator',
['calibre/gui2/progress_indicator/QProgressIndicator.cpp'],
inc_dirs=['calibre/gui2/progress_indicator'],
headers=['calibre/gui2/progress_indicator/QProgressIndicator.h'],
sip_files=['calibre/gui2/progress_indicator/QProgressIndicator.sip']
),
Extension('imageops',
['calibre/utils/imageops/imageops.cpp', 'calibre/utils/imageops/quantize.cpp'],
inc_dirs=['calibre/utils/imageops'],
headers=['calibre/utils/imageops/imageops.h'],
sip_files=['calibre/utils/imageops/imageops.sip']
),
Extension('qt_hack',
['calibre/ebooks/pdf/render/qt_hack.cpp'],
inc_dirs=['calibre/ebooks/pdf/render'],
headers=['calibre/ebooks/pdf/render/qt_hack.h'],
qt_private=['core', 'gui'],
sip_files=['calibre/ebooks/pdf/render/qt_hack.sip']
),
Extension('unrar',
['unrar/%s.cpp'%(x.partition('.')[0]) for x in '''
rar.o strlist.o strfn.o pathfn.o savepos.o smallfn.o global.o file.o
filefn.o filcreat.o archive.o arcread.o unicode.o system.o
isnt.o crypt.o crc.o rawread.o encname.o resource.o match.o
timefn.o rdwrfn.o consio.o options.o ulinks.o errhnd.o rarvm.o
secpassword.o rijndael.o getbits.o sha1.o extinfo.o extract.o
volume.o list.o find.o unpack.o cmddata.o filestr.o scantree.o
'''.split()] + ['calibre/utils/unrar.cpp'],
inc_dirs=['unrar'],
cflags=[('/' if iswindows else '-') + x for x in (
'DSILENT', 'DRARDLL', 'DUNRAR')] + (
[] if iswindows else ['-D_FILE_OFFSET_BITS=64',
'-D_LARGEFILE_SOURCE']),
optimize_level=2,
libraries=['User32', 'Advapi32', 'kernel32', 'Shell32'] if iswindows else []
),
]
if iswindows: def expand_file_list(items, is_paths=True):
extensions.extend([ if not items:
Extension('winutil', return []
['calibre/utils/windows/winutil.c'], ans = []
libraries=['shell32', 'wininet'], for item in items:
cflags=['/X'] if item.startswith('!'):
), item = lazy_load(item)
Extension('wpd', if isinstance(item, basestring):
[ item = [item]
'calibre/devices/mtp/windows/utils.cpp', ans.extend(expand_file_list(item, is_paths=is_paths))
'calibre/devices/mtp/windows/device_enumeration.cpp', else:
'calibre/devices/mtp/windows/content_enumeration.cpp', if '*' in item:
'calibre/devices/mtp/windows/device.cpp', ans.extend(expand_file_list(glob.glob(os.path.join(SRC, item)), is_paths=is_paths))
'calibre/devices/mtp/windows/wpd.cpp', else:
], item = [item]
headers=[ if is_paths:
'calibre/devices/mtp/windows/global.h', item = absolutize(item)
], ans.extend(item)
libraries=['ole32', 'oleaut32', 'portabledeviceguids', 'user32'], return ans
cflags=['/X']
),
Extension('winfonts',
['calibre/utils/fonts/winfonts.cpp'],
libraries=['Gdi32', 'User32'],
cflags=['/X']
),
])
if isosx: def is_ext_allowed(ext):
extensions.append(Extension('usbobserver', only = ext.get('only', '')
['calibre/devices/usbobserver/usbobserver.c'], if only:
ldflags=['-framework', 'CoreServices', '-framework', 'IOKit']) only = only.split()
) if iswindows and 'windows' not in only:
return False
if isosx and 'osx' not in only:
return False
if 'linux' not in only:
return False
return True
if islinux or isosx: def parse_extension(ext):
extensions.append(Extension('libusb', ext = ext.copy()
['calibre/devices/libusb/libusb.c'], ext.pop('only', None)
libraries=['usb-1.0'] kw = {}
)) name = ext.pop('name')
def get(k, default=''):
ans = ext.pop(k, default)
if iswindows:
ans = ext.pop('windows_' + k, ans)
elif isosx:
ans = ext.pop('osx_' + k, ans)
else:
ans = ext.pop('linux_' + k, ans)
return ans
for k in 'libraries qt_private ldflags cflags error'.split():
kw[k] = expand_file_list(get(k).split(), is_paths=False)
defines = get('defines')
if defines:
if 'cflags' not in kw:
kw['cflags'] = []
cflags = kw['cflags']
prefix = '/D' if iswindows else '-D'
cflags.extend(prefix + x for x in defines.split())
for k in 'inc_dirs sources headers sip_files'.split():
v = get(k)
if v:
kw[k] = expand_file_list(v.split())
kw.update(ext)
return Extension(name, **kw)
extensions.append(Extension('libmtp',
[
'calibre/devices/mtp/unix/devices.c',
'calibre/devices/mtp/unix/libmtp.c'
],
headers=[
'calibre/devices/mtp/unix/devices.h',
'calibre/devices/mtp/unix/upstream/music-players.h',
'calibre/devices/mtp/unix/upstream/device-flags.h',
],
libraries=['mtp']
))
if isunix: def read_extensions():
if hasattr(read_extensions, 'extensions'):
return read_extensions.extensions
ans = read_extensions.extensions = json.load(open(os.path.dirname(os.path.abspath(__file__)) + '/extensions.json', 'rb'))
return ans
def init_env():
from setup.build_environment import msvc, is64bit, win_inc, win_lib, NMAKE
from distutils import sysconfig
if isunix:
cc = os.environ.get('CC', 'gcc') cc = os.environ.get('CC', 'gcc')
cxx = os.environ.get('CXX', 'g++') cxx = os.environ.get('CXX', 'g++')
debug = '' debug = ''
@ -321,27 +141,25 @@ if isunix:
cflags += shlex.split(os.environ.get('CFLAGS', '')) cflags += shlex.split(os.environ.get('CFLAGS', ''))
ldflags += shlex.split(os.environ.get('LDFLAGS', '')) ldflags += shlex.split(os.environ.get('LDFLAGS', ''))
if islinux: if islinux:
cflags.append('-pthread') cflags.append('-pthread')
ldflags.append('-shared') ldflags.append('-shared')
cflags.append('-I'+sysconfig.get_python_inc()) cflags.append('-I'+sysconfig.get_python_inc())
ldflags.append('-lpython'+sysconfig.get_python_version()) ldflags.append('-lpython'+sysconfig.get_python_version())
if isbsd:
if isbsd:
cflags.append('-pthread') cflags.append('-pthread')
ldflags.append('-shared') ldflags.append('-shared')
cflags.append('-I'+sysconfig.get_python_inc()) cflags.append('-I'+sysconfig.get_python_inc())
ldflags.append('-lpython'+sysconfig.get_python_version()) ldflags.append('-lpython'+sysconfig.get_python_version())
if isosx:
if isosx:
cflags.append('-D_OSX') cflags.append('-D_OSX')
ldflags.extend('-bundle -undefined dynamic_lookup'.split()) ldflags.extend('-bundle -undefined dynamic_lookup'.split())
cflags.extend(['-fno-common', '-dynamic']) cflags.extend(['-fno-common', '-dynamic'])
cflags.append('-I'+sysconfig.get_python_inc()) cflags.append('-I'+sysconfig.get_python_inc())
if iswindows: if iswindows:
cc = cxx = msvc.cc cc = cxx = msvc.cc
cflags = '/c /nologo /MD /W3 /EHsc /DNDEBUG'.split() cflags = '/c /nologo /MD /W3 /EHsc /DNDEBUG'.split()
ldflags = '/DLL /nologo /INCREMENTAL:NO /NODEFAULTLIB:libcmt.lib'.split() ldflags = '/DLL /nologo /INCREMENTAL:NO /NODEFAULTLIB:libcmt.lib'.split()
@ -356,6 +174,8 @@ if iswindows:
ldflags.append('/LIBPATH:'+p) ldflags.append('/LIBPATH:'+p)
cflags.append('-I%s'%sysconfig.get_python_inc()) cflags.append('-I%s'%sysconfig.get_python_inc())
ldflags.append('/LIBPATH:'+os.path.join(sysconfig.PREFIX, 'libs')) ldflags.append('/LIBPATH:'+os.path.join(sysconfig.PREFIX, 'libs'))
return namedtuple('Environment', 'cc cxx debug cflags ldflags make')(
cc=cc, cxx=cxx, debug=debug, cflags=cflags, ldflags=ldflags, make=NMAKE if iswindows else 'make')
class Build(Command): class Build(Command):
@ -385,7 +205,7 @@ class Build(Command):
''') ''')
def add_options(self, parser): def add_options(self, parser):
choices = [e.name for e in extensions]+['all', 'headless'] choices = [e['name'] for e in read_extensions() if is_ext_allowed(e)]+['all', 'headless']
parser.add_option('-1', '--only', choices=choices, default='all', parser.add_option('-1', '--only', choices=choices, default='all',
help=('Build only the named extension. Available: '+ help=('Build only the named extension. Available: '+
', '.join(choices)+'. Default:%default')) ', '.join(choices)+'. Default:%default'))
@ -400,6 +220,8 @@ class Build(Command):
if opts.no_compile: if opts.no_compile:
self.info('--no-compile specified, skipping compilation') self.info('--no-compile specified, skipping compilation')
return return
self.env = init_env()
extensions = map(parse_extension, filter(is_ext_allowed, read_extensions()))
self.build_dir = os.path.abspath(opts.build_dir or os.path.join(os.path.dirname(SRC), 'build')) self.build_dir = os.path.abspath(opts.build_dir or os.path.join(os.path.dirname(SRC), 'build'))
self.output_dir = os.path.abspath(opts.output_dir or os.path.join(SRC, 'calibre', 'plugins')) self.output_dir = os.path.abspath(opts.output_dir or os.path.join(SRC, 'calibre', 'plugins'))
self.obj_dir = os.path.join(self.build_dir, 'objects') self.obj_dir = os.path.join(self.build_dir, 'objects')
@ -409,7 +231,7 @@ class Build(Command):
for ext in extensions: for ext in extensions:
if opts.only != 'all' and opts.only != ext.name: if opts.only != 'all' and opts.only != ext.name:
continue continue
if ext.error is not None: if ext.error:
if ext.optional: if ext.optional:
self.warn(ext.error) self.warn(ext.error)
continue continue
@ -440,10 +262,11 @@ class Build(Command):
return [pref+x+suff for x in dirs] return [pref+x+suff for x in dirs]
def build(self, ext, dest): def build(self, ext, dest):
from setup.parallel_build import create_job, parallel_build
if ext.sip_files: if ext.sip_files:
return self.build_pyqt_extension(ext, dest) return self.build_pyqt_extension(ext, dest)
compiler = cxx if ext.needs_cxx else cc compiler = self.env.cxx if ext.needs_cxx else self.env.cc
linker = msvc.linker if iswindows else compiler linker = self.env.msvc.linker if iswindows else compiler
objects = [] objects = []
obj_dir = self.j(self.obj_dir, ext.name) obj_dir = self.j(self.obj_dir, ext.name)
einc = self.inc_dirs_to_cflags(ext.inc_dirs) einc = self.inc_dirs_to_cflags(ext.inc_dirs)
@ -458,7 +281,7 @@ class Build(Command):
inf = '/Tp' if src.endswith('.cpp') or src.endswith('.cxx') else '/Tc' inf = '/Tp' if src.endswith('.cpp') or src.endswith('.cxx') else '/Tc'
sinc = [inf+src] if iswindows else ['-c', src] sinc = [inf+src] if iswindows else ['-c', src]
oinc = ['/Fo'+obj] if iswindows else ['-o', obj] oinc = ['/Fo'+obj] if iswindows else ['-o', obj]
cmd = [compiler] + cflags + ext.cflags + einc + sinc + oinc cmd = [compiler] + self.env.cflags + ext.cflags + einc + sinc + oinc
jobs.append(create_job(cmd)) jobs.append(create_job(cmd))
if jobs: if jobs:
self.info('Compiling', ext.name) self.info('Compiling', ext.name)
@ -472,10 +295,10 @@ class Build(Command):
self.info('Linking', ext.name) self.info('Linking', ext.name)
cmd = [linker] cmd = [linker]
if iswindows: if iswindows:
cmd += ldflags + ext.ldflags + elib + xlib + \ cmd += self.env.ldflags + ext.ldflags + elib + xlib + \
['/EXPORT:init'+ext.name] + objects + ext.extra_objs + ['/OUT:'+dest] ['/EXPORT:init'+ext.name] + objects + ext.extra_objs + ['/OUT:'+dest]
else: else:
cmd += objects + ext.extra_objs + ['-o', dest] + ldflags + ext.ldflags + elib + xlib cmd += objects + ext.extra_objs + ['-o', dest] + self.env.ldflags + ext.ldflags + elib + xlib
self.info('\n\n', ' '.join(cmd), '\n\n') self.info('\n\n', ' '.join(cmd), '\n\n')
self.check_call(cmd) self.check_call(cmd)
if iswindows: if iswindows:
@ -499,8 +322,10 @@ class Build(Command):
raise raise
def build_headless(self): def build_headless(self):
from setup.parallel_build import cpu_count
if iswindows or isosx: if iswindows or isosx:
return # Dont have headless operation on these platforms return # Dont have headless operation on these platforms
from setup.build_environment import glib_flags, fontconfig_flags, ft_inc_dirs, QMAKE
from PyQt5.QtCore import QT_VERSION from PyQt5.QtCore import QT_VERSION
self.info('\n####### Building headless QPA plugin', '#'*7) self.info('\n####### Building headless QPA plugin', '#'*7)
a = absolutize a = absolutize
@ -556,11 +381,12 @@ class Build(Command):
os.chdir(bdir) os.chdir(bdir)
try: try:
self.check_call([QMAKE] + [self.b(pf)]) self.check_call([QMAKE] + [self.b(pf)])
self.check_call([make] + ['-j%d'%(cpu_count or 1)]) self.check_call([self.env.make] + ['-j%d'%(cpu_count or 1)])
finally: finally:
os.chdir(cwd) os.chdir(cwd)
def build_sip_files(self, ext, src_dir): def build_sip_files(self, ext, src_dir):
from setup.build_environment import pyqt
sip_files = ext.sip_files sip_files = ext.sip_files
ext.sip_files = [] ext.sip_files = []
sipf = sip_files[0] sipf = sip_files[0]
@ -580,6 +406,9 @@ class Build(Command):
return {x:read(x) for x in ('target', 'sources', 'headers')} return {x:read(x) for x in ('target', 'sources', 'headers')}
def build_pyqt_extension(self, ext, dest): def build_pyqt_extension(self, ext, dest):
from setup.build_environment import pyqt, qmakespec, QMAKE
from setup.parallel_build import cpu_count
from distutils import sysconfig
pyqt_dir = self.j(self.build_dir, 'pyqt') pyqt_dir = self.j(self.build_dir, 'pyqt')
src_dir = self.j(pyqt_dir, ext.name) src_dir = self.j(pyqt_dir, ext.name)
if not os.path.exists(src_dir): if not os.path.exists(src_dir):
@ -630,7 +459,7 @@ class Build(Command):
os.chdir(src_dir) os.chdir(src_dir)
if self.newer(dest, sip['headers'] + sip['sources'] + ext.sources + ext.headers): if self.newer(dest, sip['headers'] + sip['sources'] + ext.sources + ext.headers):
self.check_call([QMAKE] + qmc + [proname]) self.check_call([QMAKE] + qmc + [proname])
self.check_call([make]+([] if iswindows else ['-j%d'%(cpu_count or 1)])) self.check_call([self.env.make]+([] if iswindows else ['-j%d'%(cpu_count or 1)]))
shutil.copy2(os.path.realpath(name), dest) shutil.copy2(os.path.realpath(name), dest)
if iswindows and os.path.exists(name + '.manifest'): if iswindows and os.path.exists(name + '.manifest'):
shutil.copy2(name + '.manifest', dest + '.manifest') shutil.copy2(name + '.manifest', dest + '.manifest')
@ -639,6 +468,7 @@ class Build(Command):
os.chdir(cwd) os.chdir(cwd)
def clean(self): def clean(self):
extensions = map(parse_extension, filter(is_ext_allowed, read_extensions()))
for ext in extensions: for ext in extensions:
dest = self.dest(ext) dest = self.dest(ext)
for x in (dest, dest+'.manifest'): for x in (dest, dest+'.manifest'):

View File

@ -104,8 +104,6 @@ qt_lib = pyqt['lib']
ft_lib_dirs = [] ft_lib_dirs = []
ft_libs = [] ft_libs = []
ft_inc_dirs = [] ft_inc_dirs = []
jpg_libs = []
jpg_lib_dirs = []
podofo_inc = '/usr/include/podofo' podofo_inc = '/usr/include/podofo'
podofo_lib = '/usr/lib' podofo_lib = '/usr/lib'
chmlib_inc_dirs = chmlib_lib_dirs = [] chmlib_inc_dirs = chmlib_lib_dirs = []
@ -114,7 +112,6 @@ icu_inc_dirs = []
icu_lib_dirs = [] icu_lib_dirs = []
zlib_inc_dirs = [] zlib_inc_dirs = []
zlib_lib_dirs = [] zlib_lib_dirs = []
zlib_libs = ['z']
openssl_inc_dirs, openssl_lib_dirs = [], [] openssl_inc_dirs, openssl_lib_dirs = [], []
icu_libs = ['icudata', 'icui18n', 'icuuc', 'icuio'] icu_libs = ['icudata', 'icui18n', 'icuuc', 'icuio']
ICU = sw = '' ICU = sw = ''
@ -154,17 +151,11 @@ if iswindows:
'build', 'chmlib-0.40', 'src')) 'build', 'chmlib-0.40', 'src'))
chmlib_lib_dirs = consolidate('CHMLIB_LIB_DIR', os.path.join(prefix, chmlib_lib_dirs = consolidate('CHMLIB_LIB_DIR', os.path.join(prefix,
'build', 'chmlib-0.40', 'src', 'Release')) 'build', 'chmlib-0.40', 'src', 'Release'))
png_inc_dirs = [sw_inc_dir]
png_lib_dirs = [sw_lib_dir]
png_libs = ['png16']
jpg_lib_dirs = [sw_lib_dir]
jpg_libs = ['jpeg']
ft_lib_dirs = [sw_lib_dir] ft_lib_dirs = [sw_lib_dir]
ft_libs = ['freetype'] ft_libs = ['freetype']
ft_inc_dirs = [os.path.join(sw_inc_dir, 'freetype2'), sw_inc_dir] ft_inc_dirs = [os.path.join(sw_inc_dir, 'freetype2'), sw_inc_dir]
zlib_inc_dirs = [sw_inc_dir] zlib_inc_dirs = [sw_inc_dir]
zlib_lib_dirs = [sw_lib_dir] zlib_lib_dirs = [sw_lib_dir]
zlib_libs = ['zlib']
podofo_inc = os.path.join(sw_inc_dir, 'podofo') podofo_inc = os.path.join(sw_inc_dir, 'podofo')
podofo_lib = sw_lib_dir podofo_lib = sw_lib_dir
@ -174,9 +165,6 @@ elif isosx:
sw = os.environ.get('SW', os.path.expanduser('~/sw')) sw = os.environ.get('SW', os.path.expanduser('~/sw'))
podofo_inc = os.path.join(sw, 'include', 'podofo') podofo_inc = os.path.join(sw, 'include', 'podofo')
podofo_lib = os.path.join(sw, 'lib') podofo_lib = os.path.join(sw, 'lib')
png_inc_dirs = consolidate('PNG_INC_DIR', sw + '/include')
png_lib_dirs = consolidate('PNG_LIB_DIR', sw + '/lib')
png_libs = ['png12']
ft_libs = ['freetype'] ft_libs = ['freetype']
ft_inc_dirs = [sw + '/include/freetype2'] ft_inc_dirs = [sw + '/include/freetype2']
icu_inc_dirs = [sw + '/include'] icu_inc_dirs = [sw + '/include']
@ -187,15 +175,6 @@ elif isosx:
else: else:
QT_DLLS += ['Qt5DBus', 'Qt5XcbQpa'] QT_DLLS += ['Qt5DBus', 'Qt5XcbQpa']
# PYQT_MODULES += ('QtDBus',) # PYQT_MODULES += ('QtDBus',)
# Include directories
png_inc_dirs = pkgconfig_include_dirs('libpng', 'PNG_INC_DIR',
'/usr/include')
# Library directories
png_lib_dirs = pkgconfig_lib_dirs('libpng', 'PNG_LIB_DIR', '/usr/lib')
# Libraries
png_libs = ['png']
ft_inc_dirs = pkgconfig_include_dirs('freetype2', 'FT_INC_DIR', ft_inc_dirs = pkgconfig_include_dirs('freetype2', 'FT_INC_DIR',
'/usr/include/freetype2') '/usr/include/freetype2')
ft_lib_dirs = pkgconfig_lib_dirs('freetype2', 'FT_LIB_DIR', '/usr/lib') ft_lib_dirs = pkgconfig_lib_dirs('freetype2', 'FT_LIB_DIR', '/usr/lib')
@ -214,6 +193,7 @@ podofo_error = None if os.path.exists(os.path.join(podofo_inc, 'podofo.h')) else
('PoDoFo not found on your system. Various PDF related', ('PoDoFo not found on your system. Various PDF related',
' functionality will not work. Use the PODOFO_INC_DIR and', ' functionality will not work. Use the PODOFO_INC_DIR and',
' PODOFO_LIB_DIR environment variables.') ' PODOFO_LIB_DIR environment variables.')
podofo_inc = [podofo_inc, os.path.dirname(podofo_inc)]
BUILD_HOST='192.168.81.1' BUILD_HOST='192.168.81.1'
PROJECT=os.path.basename(os.path.abspath('.')) PROJECT=os.path.basename(os.path.abspath('.'))

222
setup/extensions.json Normal file
View File

@ -0,0 +1,222 @@
[
{
"name": "hunspell",
"sources": "hunspell/affentry.cxx hunspell/affixmgr.cxx hunspell/csutil.cxx hunspell/dictmgr.cxx hunspell/filemgr.cxx hunspell/hashmgr.cxx hunspell/hunspell.cxx hunspell/phonet.cxx hunspell/replist.cxx hunspell/suggestmgr.cxx calibre/utils/spell/hunspell_wrapper.cpp",
"inc_dirs": "hunspell",
"defines": "HUNSPELL_STATIC",
"windows_defines": "HUNSPELL_STATIC _CRT_SECURE_NO_WARNINGS UNICODE _UNICODE",
"optimize_level": 2
},
{
"name": "monotonic",
"sources": "calibre/utils/monotonic.c",
"linux_libraries": "rt"
},
{
"name": "speedup",
"sources": "calibre/utils/speedup.c",
"windows_libraries": "m"
},
{
"name": "zlib2",
"sources": "calibre/utils/zlib2.c",
"inc_dirs": "!zlib_inc_dirs",
"lib_dirs": "!zlib_lib_dirs",
"libraries": "z",
"windows_libraries": "zlib"
},
{
"name": "certgen",
"sources": "calibre/utils/certgen.c",
"libraries": "crypto",
"windows_libraries": "libeay32",
"inc_dirs": "!openssl_inc_dirs",
"lib_dirs": "!openssl_lib_dirs"
},
{
"name": "html",
"sources": "calibre/gui2/tweak_book/editor/syntax/html.c"
},
{
"name": "tokenizer",
"sources": "tinycss/tokenizer.c"
},
{
"name": "_patiencediff_c",
"sources": "calibre/gui2/tweak_book/diff/_patiencediff_c.c"
},
{
"name": "icu",
"sources": "calibre/utils/icu.c",
"headers": "calibre/utils/icu_calibre_utils.h",
"libraries": "icudata icui18n icuuc icuio",
"windows_libraries": "icudt icuin icuuc icuio",
"lib_dirs": "!icu_lib_dirs",
"inc_dirs": "!icu_inc_dirs"
},
{
"name": "matcher",
"sources": "calibre/utils/matcher.c",
"headers": "calibre/utils/icu_calibre_utils.h",
"libraries": "icudata icui18n icuuc icuio",
"windows_libraries": "icudt icuin icuuc icuio",
"lib_dirs": "!icu_lib_dirs",
"inc_dirs": "!icu_inc_dirs"
},
{
"name": "sqlite_custom",
"sources": "calibre/library/sqlite_custom.c"
},
{
"name": "chmlib",
"sources": "calibre/utils/chm/swig_chm.c",
"libraries": "chm",
"windows_libraries": "ChmLib",
"inc_dirs": "!chmlib_inc_dirs",
"lib_dirs": "!chmlib_lib_dirs",
"defines": "SWIG_COBJECT_TYPES"
},
{
"name": "chm_extra",
"sources": "calibre/utils/chm/extra.c",
"libraries": "chm",
"windows_libraries": "ChmLib",
"inc_dirs": "!chmlib_inc_dirs",
"lib_dirs": "!chmlib_lib_dirs",
"defines": "__PYTHON__"
},
{
"name": "lzx",
"sources": "calibre/utils/lzx/lzxmodule.c calibre/utils/lzx/compressor.c calibre/utils/lzx/lzxd.c calibre/utils/lzx/lzc.c calibre/utils/lzx/lzxc.c",
"inc_dirs": "calibre/utils/lzx",
"headers": "calibre/utils/lzx/msstdint.h calibre/utils/lzx/lzc.h calibre/utils/lzx/lzxmodule.h calibre/utils/lzx/system.h calibre/utils/lzx/lzxc.h calibre/utils/lzx/lzxd.h calibre/utils/lzx/mspack.h"
},
{
"name": "freetype",
"sources": "calibre/utils/fonts/freetype.cpp",
"libraries": "!ft_libs",
"inc_dirs": "!ft_inc_dirs",
"lib_dirs": "!ft_lib_dirs"
},
{
"name": "msdes",
"sources": "calibre/utils/msdes/msdesmodule.c calibre/utils/msdes/des.c",
"headers": "calibre/utils/msdes/spr.h calibre/utils/msdes/d3des.h",
"inc_dirs": "calibre/utils/msdes"
},
{
"name": "cPalmdoc",
"sources": "calibre/ebooks/compression/palmdoc.c"
},
{
"name": "bzzdec",
"sources": "calibre/ebooks/djvu/bzzdecoder.c",
"windows_inc_dirs": "calibre/utils/chm"
},
{
"name": "_regex",
"sources": "regex/_regex.c regex/_regex_unicode.c",
"headers": "regex/_regex.h",
"optimize_level": 2
},
{
"name": "dukpy",
"sources": "duktape/errors.c duktape/context.c duktape/conversions.c duktape/proxy.c duktape/module.c duktape/duktape/duktape.c",
"headers": "duktape/dukpy.h duktape/duktape/duk_config.h duktape/duktape/duktape.h",
"optimize_level": 2
},
{
"name": "podofo",
"sources": "calibre/utils/podofo/utils.cpp calibre/utils/podofo/output.cpp calibre/utils/podofo/doc.cpp calibre/utils/podofo/outline.cpp calibre/utils/podofo/podofo.cpp",
"headers": "calibre/utils/podofo/global.h",
"libraries": "podofo",
"lib_dirs": "!podofo_lib",
"inc_dirs": "!podofo_inc",
"error": "!podofo_error"
},
{
"name": "pictureflow",
"sources": "calibre/gui2/pictureflow/pictureflow.cpp",
"headers": "calibre/gui2/pictureflow/pictureflow.h",
"sip_files": "calibre/gui2/pictureflow/pictureflow.sip",
"inc_dirs": "calibre/gui2/pictureflow"
},
{
"name": "progress_indicator",
"sources": "calibre/gui2/progress_indicator/QProgressIndicator.cpp",
"headers": "calibre/gui2/progress_indicator/QProgressIndicator.h",
"sip_files": "calibre/gui2/progress_indicator/QProgressIndicator.sip",
"inc_dirs": "calibre/gui2/progress_indicator"
},
{
"name": "imageops",
"sources": "calibre/utils/imageops/imageops.cpp calibre/utils/imageops/quantize.cpp",
"headers": "calibre/utils/imageops/imageops.h",
"sip_files": "calibre/utils/imageops/imageops.sip",
"inc_dirs": "calibre/utils/imageops"
},
{
"name": "qt_hack",
"sources": "calibre/ebooks/pdf/render/qt_hack.cpp",
"headers": "calibre/ebooks/pdf/render/qt_hack.h",
"sip_files": "calibre/ebooks/pdf/render/qt_hack.sip",
"inc_dirs": "calibre/ebooks/pdf/render",
"qt_private": "core gui"
},
{
"name": "lzma_binding",
"sources": "lzma/*.c",
"headers": "lzma/*.h",
"defines": "_7ZIP_ST"
},
{
"name": "winutil",
"only": "windows",
"sources": "calibre/utils/windows/winutil.c",
"libraries": "shell32 wininet",
"cflags": "/X"
},
{
"name": "wpd",
"only": "windows",
"sources": "calibre/devices/mtp/windows/utils.cpp calibre/devices/mtp/windows/device_enumeration.cpp calibre/devices/mtp/windows/content_enumeration.cpp calibre/devices/mtp/windows/device.cpp calibre/devices/mtp/windows/wpd.cpp",
"headers": "calibre/devices/mtp/windows/global.h",
"libraries": "ole32 oleaut32 portabledeviceguids user32",
"cflags": "/X"
},
{
"name": "winfonts",
"only": "windows",
"sources": "calibre/utils/fonts/winfonts.cpp",
"libraries": "Gdi32 User32",
"cflags": "/X"
},
{
"name": "usbobserver",
"only": "osx",
"sources": "calibre/devices/usbobserver/usbobserver.c",
"ldflags": "-framework CoreServices -framework IOKit"
},
{
"name": "libusb",
"only": "osx linux",
"sources": "calibre/devices/libusb/libusb.c",
"libraries": "usb-1.0"
},
{
"name": "libmtp",
"only": "osx linux",
"sources": "calibre/devices/mtp/unix/devices.c calibre/devices/mtp/unix/libmtp.c",
"headers": "calibre/devices/mtp/unix/devices.h calibre/devices/mtp/unix/upstream/music-players.h calibre/devices/mtp/unix/upstream/device-flags.h",
"libraries": "mtp"
},
{
"name": "unrar",
"sources": "unrar/rar.cpp unrar/strlist.cpp unrar/strfn.cpp unrar/pathfn.cpp unrar/savepos.cpp unrar/smallfn.cpp unrar/global.cpp unrar/file.cpp unrar/filefn.cpp unrar/filcreat.cpp unrar/archive.cpp unrar/arcread.cpp unrar/unicode.cpp unrar/system.cpp unrar/isnt.cpp unrar/crypt.cpp unrar/crc.cpp unrar/rawread.cpp unrar/encname.cpp unrar/resource.cpp unrar/match.cpp unrar/timefn.cpp unrar/rdwrfn.cpp unrar/consio.cpp unrar/options.cpp unrar/ulinks.cpp unrar/errhnd.cpp unrar/rarvm.cpp unrar/secpassword.cpp unrar/rijndael.cpp unrar/getbits.cpp unrar/sha1.cpp unrar/extinfo.cpp unrar/extract.cpp unrar/volume.cpp unrar/list.cpp unrar/find.cpp unrar/unpack.cpp unrar/cmddata.cpp unrar/filestr.cpp unrar/scantree.cpp calibre/utils/unrar.cpp",
"inc_dirs": "unrar",
"defines": "SILENT RARDLL UNRAR _FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE",
"windows_defines": "SILENT RARDLL UNRAR",
"optimize_level": 2,
"windows_libraries": "User32 Advapi32 kernel32 Shell32"
}
]