From 69aafd141eba8a60ce5f092438bae65211a23db3 Mon Sep 17 00:00:00 2001 From: Nirbheek Chauhan Date: Sun, 13 Nov 2016 15:54:30 +0530 Subject: qt: Fix qmake detection on Linux and Windows qmake for both Qt4 and Qt5 detection was assuming that it was only used on Windows, which is incorrect. It can also be used on Linux for cross-compilation or in general when pkg-config is not available. It was also not failing properly for both Qt5 and Qt4 when no libraries were found, and was assuming that the .dll was always available. Qt4 detection with qmake was also completely broken. Also prevents unwanted injection of partially-found qt dependencies in targets by unsetting self.cargs and self.largs --- mesonbuild/dependencies.py | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) (limited to 'mesonbuild/dependencies.py') diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py index d336c21..daf7652 100644 --- a/mesonbuild/dependencies.py +++ b/mesonbuild/dependencies.py @@ -26,7 +26,7 @@ from collections import OrderedDict from . mesonlib import MesonException from . import mlog from . import mesonlib -from .environment import detect_cpu_family +from .environment import detect_cpu_family, for_windows class DependencyException(MesonException): def __init__(self, *args, **kwargs): @@ -821,6 +821,10 @@ class QtBaseDependency(Dependency): self.name = name self.qtname = name.capitalize() self.qtver = name[-1] + if self.qtver == "4": + self.qtpkgname = 'Qt' + else: + self.qtpkgname = self.qtname self.root = '/usr' self.bindir = None self.silent = kwargs.get('silent', False) @@ -838,13 +842,17 @@ class QtBaseDependency(Dependency): if len(mods) == 0: raise DependencyException('No ' + self.qtname + ' modules specified.') type_text = 'cross' if env.is_cross_build() else 'native' - found_msg = '{} {} `{{}}` dependency found:'.format(self.qtname, type_text) - from_text = 'pkg-config' + found_msg = '{} {} {{}} dependency (modules: {}) found:' \ + ''.format(self.qtname, type_text, ', '.join(mods)) + from_text = '`pkg-config`' # Prefer pkg-config, then fallback to `qmake -query` self._pkgconfig_detect(mods, env, kwargs) if not self.is_found: from_text = self._qmake_detect(mods, env, kwargs) if not self.is_found: + # Reset compile args and link args + self.cargs = [] + self.largs = [] from_text = '(checked pkg-config, qmake-{}, and qmake)' \ ''.format(self.name) self.version = 'none' @@ -855,6 +863,7 @@ class QtBaseDependency(Dependency): if not self.silent: mlog.log(found_msg.format(from_text), mlog.red('NO')) return + from_text = '`{}`'.format(from_text) if not self.silent: mlog.log(found_msg.format(from_text), mlog.green('YES')) @@ -873,17 +882,14 @@ class QtBaseDependency(Dependency): return moc, uic, rcc def _pkgconfig_detect(self, mods, env, kwargs): - if self.qtver == "4": - qtpkgname = 'Qt' - else: - qtpkgname = self.qtname modules = OrderedDict() for module in mods: - modules[module] = PkgConfigDependency(qtpkgname + module, env, kwargs) + modules[module] = PkgConfigDependency(self.qtpkgname + module, env, kwargs) self.is_found = True for m in modules.values(): if not m.found(): self.is_found = False + return self.cargs += m.get_compile_args() self.largs += m.get_link_args() self.version = m.modversion @@ -892,7 +898,7 @@ class QtBaseDependency(Dependency): core = modules['Core'] else: corekwargs = {'required': 'false', 'silent': 'true'} - core = PkgConfigDependency(qtpkgname + 'Core', env, corekwargs) + core = PkgConfigDependency(self.qtpkgname + 'Core', env, corekwargs) # Used by self.compilers_detect() self.bindir = core.get_pkgconfig_variable('host_bins') if not self.bindir: @@ -947,16 +953,24 @@ class QtBaseDependency(Dependency): libdir = qvars['QT_INSTALL_LIBS'] # Used by self.compilers_detect() self.bindir = qvars['QT_INSTALL_BINS'] - #self.largs.append('-L' + libdir) + self.is_found = True for module in mods: mincdir = os.path.join(incdir, 'Qt' + module) self.cargs.append('-I' + mincdir) - libfile = os.path.join(libdir, self.qtname + module + '.lib') - if not os.path.isfile(libfile): - # MinGW links directly to .dll, not to .lib. - libfile = os.path.join(self.bindir, self.qtname + module + '.dll') + if for_windows(env.is_cross_build(), env): + libfile = os.path.join(libdir, self.qtpkgname + module + '.lib') + if not os.path.isfile(libfile): + # MinGW can link directly to .dll + libfile = os.path.join(self.bindir, self.qtpkgname + module + '.dll') + if not os.path.isfile(libfile): + self.is_found = False + break + else: + libfile = os.path.join(libdir, 'lib{}{}.so'.format(self.qtpkgname, module)) + if not os.path.isfile(libfile): + self.is_found = False + break self.largs.append(libfile) - self.is_found = True return qmake def _framework_detect(self, qvars, modules, kwargs): -- cgit v1.1