diff options
-rw-r--r-- | mesonbuild/dependencies/ui.py | 27 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 8 | ||||
-rw-r--r-- | mesonbuild/modules/qt.py | 51 |
3 files changed, 36 insertions, 50 deletions
diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py index 3bba3dc..95dfe2b 100644 --- a/mesonbuild/dependencies/ui.py +++ b/mesonbuild/dependencies/ui.py @@ -229,11 +229,14 @@ class QtBaseDependency(ExternalDependency): bins = ['moc', 'uic', 'rcc', 'lrelease'] found = {b: NonExistingExternalProgram(name='{}-{}'.format(b, self.name)) for b in bins} + wanted = '== {}'.format(self.version) def gen_bins(): for b in bins: if self.bindir: yield os.path.join(self.bindir, b), b, False + # prefer the <tool>-qt<version> of the tool to the plain one, as we + # don't know what the unsuffixed one points to without calling it. yield '{}-{}'.format(b, self.name), b, False yield b, b, self.required if b != 'lrelease' else False @@ -241,12 +244,6 @@ class QtBaseDependency(ExternalDependency): if found[name].found(): continue - # prefer the <tool>-qt<version> of the tool to the plain one, as we - # don't know what the unsuffixed one points to without calling it. - p = interp_obj.find_program_impl([b], silent=True, required=required).held_object - if not p.found(): - continue - if name == 'lrelease': arg = ['-version'] elif mesonlib.version_compare(self.version, '>= 5'): @@ -255,12 +252,18 @@ class QtBaseDependency(ExternalDependency): arg = ['-v'] # Ensure that the version of qt and each tool are the same - _, out, err = mesonlib.Popen_safe(p.get_command() + arg) - if b.startswith('lrelease') or not self.version.startswith('4'): - care = out - else: - care = err - if mesonlib.version_compare(self.version, '== {}'.format(care.split(' ')[-1])): + def get_version(p): + _, out, err = mesonlib.Popen_safe(p.get_command() + arg) + if b.startswith('lrelease') or not self.version.startswith('4'): + care = out + else: + care = err + return care.split(' ')[-1].replace(')', '') + + p = interp_obj.find_program_impl([b], required=required, + version_func=get_version, + wanted=wanted).held_object + if p.found(): found[name] = p return tuple([found[b] for b in bins]) diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index aad77b0..633615d 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -3320,7 +3320,8 @@ external dependencies (including libraries) must go to "dependencies".''') # TODO update modules to always pass `for_machine`. It is bad-form to assume # the host machine. def find_program_impl(self, args, for_machine: MachineChoice = MachineChoice.HOST, - required=True, silent=True, wanted='', search_dirs=None): + required=True, silent=True, wanted='', search_dirs=None, + version_func=None): args = mesonlib.listify(args) extra_info = [] @@ -3336,7 +3337,10 @@ external dependencies (including libraries) must go to "dependencies".''') return progobj if wanted: - version = progobj.get_version(self) + if version_func: + version = version_func(progobj) + else: + version = progobj.get_version(self) is_found, not_found, found = mesonlib.version_compare_many(version, wanted) if not is_found: mlog.log('Program', mlog.bold(progobj.get_name()), 'found:', mlog.red('NO'), 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: |