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')
QMAKE = '/Volumes/sw/qt/bin/qmake' if isosx else 'qmake'
if find_executable('qmake-qt4'):
QMAKE = find_executable('qmake-qt4')
elif find_executable('qmake'):
QMAKE = find_executable('qmake')
for x in ('qmake-qt5', 'qt5-qmake', 'qmake'):
q = find_executable(x)
if q:
QMAKE = q
break
QMAKE = os.environ.get('QMAKE', QMAKE)
# QT5XX: Change this to real qmake detection
QMAKE = '/opt/qt5/bin/qmake'
PKGCONFIG = find_executable('pkg-config')
PKGCONFIG = os.environ.get('PKG_CONFIG', PKGCONFIG)
def run_pkgconfig(name, envvar, default, flag, prefix):
ans = []
if envvar:
ans = os.environ.get(envvar, default)
ans = [x.strip() for x in ans.split(os.pathsep)]
ans = [x for x in ans if x and (prefix=='-l' or os.path.exists(x))]
ev = os.environ.get(envvar, None)
if ev:
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:
try:
raw = subprocess.Popen([PKGCONFIG, flag, name],
@ -70,7 +69,7 @@ def run_pkgconfig(name, envvar, default, flag, prefix):
except:
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):
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):
return re.search('%s:(.+)$' % name, qraw, flags=re.M).group(1).strip()
pyqt = {x:readvar(y) for x, y in (
('inc', 'QT_INSTALL_HEADERS'), ('lib', 'QT_INSTALL_LIBS')
)}
@ -97,9 +97,16 @@ c = sipconfig.Configuration()
pyqt['sip_bin'] = c.sip_bin
from PyQt5.QtCore import PYQT_CONFIGURATION
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
glib_flags = subprocess.check_output([PKGCONFIG, '--libs', 'glib-2.0']) if islinux else ''
qt_inc = pyqt['inc']
qt_lib = pyqt['lib']
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,
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,
zlib_libs, zlib_lib_dirs, zlib_inc_dirs, is64bit)
zlib_libs, zlib_lib_dirs, zlib_inc_dirs, is64bit, glib_flags)
MT
isunix = islinux or isosx or isbsd
@ -514,6 +514,13 @@ class Build(Command):
target = self.dest('headless')
if not self.newer(target, headers + sources + others):
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(
'''\
TARGET = headless
@ -526,8 +533,9 @@ class Build(Command):
OTHER_FILES = {others}
DESTDIR = {destdir}
CONFIG -= create_cmake # Prevent qmake from generating a cmake build file which it puts in the calibre src directory
QMAKE_LIBS_PRIVATE += {glib}
''').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')
if not os.path.exists(bdir):
os.makedirs(bdir)
@ -550,7 +558,7 @@ class Build(Command):
sbf = self.j(src_dir, self.b(sipf)+'.sbf')
if self.newer(sbf, [sipf]+ext.headers):
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.check_call(cmd)
self.info('')