Fix building of headless QPA extension on Arch

This commit is contained in:
Kovid Goyal 2014-04-29 08:35:06 +05:30
parent 8da98e8ba4
commit 96dcc8c939
2 changed files with 30 additions and 15 deletions

View File

@ -43,24 +43,23 @@ if iswindows:
ICU = os.environ.get('ICU_DIR', r'Q:\icu') ICU = os.environ.get('ICU_DIR', r'Q:\icu')
QMAKE = '/Volumes/sw/qt/bin/qmake' if isosx else 'qmake' QMAKE = '/Volumes/sw/qt/bin/qmake' if isosx else 'qmake'
if find_executable('qmake-qt4'): for x in ('qmake-qt5', 'qt5-qmake', 'qmake'):
QMAKE = find_executable('qmake-qt4') q = find_executable(x)
elif find_executable('qmake'): if q:
QMAKE = find_executable('qmake') QMAKE = q
break
QMAKE = os.environ.get('QMAKE', QMAKE) QMAKE = os.environ.get('QMAKE', QMAKE)
# QT5XX: Change this to real qmake detection
QMAKE = '/opt/qt5/bin/qmake'
PKGCONFIG = find_executable('pkg-config') PKGCONFIG = find_executable('pkg-config')
PKGCONFIG = os.environ.get('PKG_CONFIG', PKGCONFIG) PKGCONFIG = os.environ.get('PKG_CONFIG', PKGCONFIG)
def run_pkgconfig(name, envvar, default, flag, prefix): def run_pkgconfig(name, envvar, default, flag, prefix):
ans = [] ans = []
if envvar: if envvar:
ans = os.environ.get(envvar, default) ev = os.environ.get(envvar, None)
ans = [x.strip() for x in ans.split(os.pathsep)] if ev:
ans = [x for x in ans if x and (prefix=='-l' or os.path.exists(x))] ans = [x.strip() for x in ev.split(os.pathsep)]
ans = [x for x in ans if x and (prefix=='-l' or os.path.exists(x))]
if not ans: if not ans:
try: try:
raw = subprocess.Popen([PKGCONFIG, flag, name], raw = subprocess.Popen([PKGCONFIG, flag, name],
@ -70,7 +69,7 @@ def run_pkgconfig(name, envvar, default, flag, prefix):
except: except:
print 'Failed to run pkg-config:', PKGCONFIG, 'for:', name print 'Failed to run pkg-config:', PKGCONFIG, 'for:', name
return ans return ans or ([default] if default else [])
def pkgconfig_include_dirs(name, envvar, default): def pkgconfig_include_dirs(name, envvar, default):
return run_pkgconfig(name, envvar, default, '--cflags-only-I', '-I') return run_pkgconfig(name, envvar, default, '--cflags-only-I', '-I')
@ -90,6 +89,7 @@ qraw = subprocess.check_output([QMAKE, '-query']).decode('utf-8')
def readvar(name): def readvar(name):
return re.search('%s:(.+)$' % name, qraw, flags=re.M).group(1).strip() return re.search('%s:(.+)$' % name, qraw, flags=re.M).group(1).strip()
pyqt = {x:readvar(y) for x, y in ( pyqt = {x:readvar(y) for x, y in (
('inc', 'QT_INSTALL_HEADERS'), ('lib', 'QT_INSTALL_LIBS') ('inc', 'QT_INSTALL_HEADERS'), ('lib', 'QT_INSTALL_LIBS')
)} )}
@ -97,9 +97,16 @@ c = sipconfig.Configuration()
pyqt['sip_bin'] = c.sip_bin pyqt['sip_bin'] = c.sip_bin
from PyQt5.QtCore import PYQT_CONFIGURATION from PyQt5.QtCore import PYQT_CONFIGURATION
pyqt['sip_flags'] = PYQT_CONFIGURATION['sip_flags'] pyqt['sip_flags'] = PYQT_CONFIGURATION['sip_flags']
pyqt['default_sip_dir'] = c.default_sip_dir def get_sip_dir(q):
for x in ('', 'PyQt5', 'sip/PyQt5'):
base = os.path.join(q, x)
if os.path.exists(os.path.join(base, 'QtWidgets')):
return base
return q
pyqt['pyqt_sip_dir'] = get_sip_dir(c.default_sip_dir)
pyqt['sip_inc_dir'] = c.sip_inc_dir pyqt['sip_inc_dir'] = c.sip_inc_dir
glib_flags = subprocess.check_output([PKGCONFIG, '--libs', 'glib-2.0']) if islinux else ''
qt_inc = pyqt['inc'] qt_inc = pyqt['inc']
qt_lib = pyqt['lib'] qt_lib = pyqt['lib']
ft_lib_dirs = [] ft_lib_dirs = []

View File

@ -16,7 +16,7 @@ from setup.build_environment import (chmlib_inc_dirs,
msvc, MT, win_inc, win_lib, win_ddk, magick_inc_dirs, magick_lib_dirs, msvc, MT, win_inc, win_lib, win_ddk, magick_inc_dirs, magick_lib_dirs,
magick_libs, chmlib_lib_dirs, sqlite_inc_dirs, icu_inc_dirs, magick_libs, chmlib_lib_dirs, sqlite_inc_dirs, icu_inc_dirs,
icu_lib_dirs, win_ddk_lib_dirs, ft_libs, ft_lib_dirs, ft_inc_dirs, icu_lib_dirs, win_ddk_lib_dirs, ft_libs, ft_lib_dirs, ft_inc_dirs,
zlib_libs, zlib_lib_dirs, zlib_inc_dirs, is64bit) zlib_libs, zlib_lib_dirs, zlib_inc_dirs, is64bit, glib_flags)
MT MT
isunix = islinux or isosx or isbsd isunix = islinux or isosx or isbsd
@ -514,6 +514,13 @@ class Build(Command):
target = self.dest('headless') target = self.dest('headless')
if not self.newer(target, headers + sources + others): if not self.newer(target, headers + sources + others):
return return
# Arch monkey patches qmake as a result of which it fails to add
# glib-2.0 to the list of library dependencies. Compiling QPA
# plugins uses the static libQt5PlatformSupport.a which needs glib
# to be specified after it for linking to succeed, so we add it to
# QMAKE_LIBS_PRIVATE (we cannot use LIBS as that would put -lglib-2.0
# before libQt5PlatformSupport.
pro = textwrap.dedent( pro = textwrap.dedent(
'''\ '''\
TARGET = headless TARGET = headless
@ -526,8 +533,9 @@ class Build(Command):
OTHER_FILES = {others} OTHER_FILES = {others}
DESTDIR = {destdir} DESTDIR = {destdir}
CONFIG -= create_cmake # Prevent qmake from generating a cmake build file which it puts in the calibre src directory CONFIG -= create_cmake # Prevent qmake from generating a cmake build file which it puts in the calibre src directory
QMAKE_LIBS_PRIVATE += {glib}
''').format( ''').format(
headers=' '.join(headers), sources=' '.join(sources), others=' '.join(others), destdir=self.d(target)) headers=' '.join(headers), sources=' '.join(sources), others=' '.join(others), destdir=self.d(target), glib=glib_flags)
bdir = self.j(self.d(self.SRC), 'build', 'headless') bdir = self.j(self.d(self.SRC), 'build', 'headless')
if not os.path.exists(bdir): if not os.path.exists(bdir):
os.makedirs(bdir) os.makedirs(bdir)
@ -550,7 +558,7 @@ class Build(Command):
sbf = self.j(src_dir, self.b(sipf)+'.sbf') sbf = self.j(src_dir, self.b(sipf)+'.sbf')
if self.newer(sbf, [sipf]+ext.headers): if self.newer(sbf, [sipf]+ext.headers):
cmd = [pyqt['sip_bin'], '-w', '-c', src_dir, '-b', sbf, '-I'+ cmd = [pyqt['sip_bin'], '-w', '-c', src_dir, '-b', sbf, '-I'+
pyqt['default_sip_dir']+'/sip/PyQt5'] + shlex.split(pyqt['sip_flags']) + [sipf] pyqt['pyqt_sip_dir']] + shlex.split(pyqt['sip_flags']) + [sipf]
self.info(' '.join(cmd)) self.info(' '.join(cmd))
self.check_call(cmd) self.check_call(cmd)
self.info('') self.info('')