aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/qt.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2020-07-02 16:39:10 -0400
committerJussi Pakkanen <jpakkane@gmail.com>2020-07-04 13:57:08 +0300
commitf66c8c35dab22f547601a48217ee8a53be28e858 (patch)
tree8efde19c1b3460deb04cbbf61d1bdc4ae58cc348 /mesonbuild/modules/qt.py
parent92075f5ef3c5df3b5e6ec4ae5189e58acb2e7c3f (diff)
downloadmeson-f66c8c35dab22f547601a48217ee8a53be28e858.zip
meson-f66c8c35dab22f547601a48217ee8a53be28e858.tar.gz
meson-f66c8c35dab22f547601a48217ee8a53be28e858.tar.bz2
qt: Fix has_tools() when required=False
Improve logs by making it clear when the program is found but has wrong version.
Diffstat (limited to 'mesonbuild/modules/qt.py')
-rw-r--r--mesonbuild/modules/qt.py51
1 files changed, 15 insertions, 36 deletions
diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py
index c7da530..c2b1e01 100644
--- a/mesonbuild/modules/qt.py
+++ b/mesonbuild/modules/qt.py
@@ -15,8 +15,8 @@
import os
from .. import mlog
from .. import build
-from ..mesonlib import MesonException, Popen_safe, extract_as_list, File, unholder
-from ..dependencies import Dependency, Qt4Dependency, Qt5Dependency
+from ..mesonlib import MesonException, extract_as_list, File, unholder
+from ..dependencies import Dependency, Qt4Dependency, Qt5Dependency, NonExistingExternalProgram
import xml.etree.ElementTree as ET
from . import ModuleReturnValue, get_include_args, ExtensionModule
from ..interpreterbase import noPosargs, permittedKwargs, FeatureNew, FeatureNewKwargs
@@ -36,43 +36,22 @@ class QtBaseModule(ExtensionModule):
self.snippets.add('has_tools')
self.qt_version = qt_version
- def _detect_tools(self, env, method):
+ def _detect_tools(self, env, method, required=True):
if self.tools_detected:
return
+ self.tools_detected = True
mlog.log('Detecting Qt{version} tools'.format(version=self.qt_version))
- # FIXME: We currently require QtX to exist while importing the module.
- # We should make it gracefully degrade and not create any targets if
- # the import is marked as 'optional' (not implemented yet)
- kwargs = {'required': 'true', 'modules': 'Core', 'silent': 'true', 'method': method}
+ kwargs = {'required': required, 'modules': 'Core', 'method': method}
qt = _QT_DEPS_LUT[self.qt_version](env, kwargs)
- # Get all tools and then make sure that they are the right version
- self.moc, self.uic, self.rcc, self.lrelease = qt.compilers_detect(self.interpreter)
- # Moc, uic and rcc write their version strings to stderr.
- # Moc and rcc return a non-zero result when doing so.
- # What kind of an idiot thought that was a good idea?
- for compiler, compiler_name in ((self.moc, "Moc"), (self.uic, "Uic"), (self.rcc, "Rcc"), (self.lrelease, "lrelease")):
- if compiler.found():
- # Workaround since there is no easy way to know which tool/version support which flag
- for flag in ['-v', '-version']:
- p, stdout, stderr = Popen_safe(compiler.get_command() + [flag])[0:3]
- if p.returncode == 0:
- break
- stdout = stdout.strip()
- stderr = stderr.strip()
- if 'Qt {}'.format(self.qt_version) in stderr:
- compiler_ver = stderr
- elif 'version {}.'.format(self.qt_version) in stderr:
- compiler_ver = stderr
- elif ' {}.'.format(self.qt_version) in stdout:
- compiler_ver = stdout
- else:
- raise MesonException('{name} preprocessor is not for Qt {version}. Output:\n{stdo}\n{stderr}'.format(
- name=compiler_name, version=self.qt_version, stdo=stdout, stderr=stderr))
- mlog.log(' {}:'.format(compiler_name.lower()), mlog.green('YES'), '({path}, {version})'.format(
- path=compiler.get_path(), version=compiler_ver.split()[-1]))
- else:
- mlog.log(' {}:'.format(compiler_name.lower()), mlog.red('NO'))
- self.tools_detected = True
+ if qt.found():
+ # Get all tools and then make sure that they are the right version
+ self.moc, self.uic, self.rcc, self.lrelease = qt.compilers_detect(self.interpreter)
+ else:
+ suffix = '-qt{}'.format(self.qt_version)
+ self.moc = NonExistingExternalProgram(name='moc' + suffix)
+ self.uic = NonExistingExternalProgram(name='uic' + suffix)
+ self.rcc = NonExistingExternalProgram(name='rcc' + suffix)
+ self.lrelease = NonExistingExternalProgram(name='lrelease' + suffix)
def parse_qrc(self, state, rcc_file):
if type(rcc_file) is str:
@@ -128,7 +107,7 @@ class QtBaseModule(ExtensionModule):
if disabled:
mlog.log('qt.has_tools skipped: feature', mlog.bold(feature), 'disabled')
return False
- self._detect_tools(state.environment, method)
+ self._detect_tools(state.environment, method, required=False)
for tool in (self.moc, self.uic, self.rcc, self.lrelease):
if not tool.found():
if required: