aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/qt.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/modules/qt.py')
-rw-r--r--mesonbuild/modules/qt.py61
1 files changed, 59 insertions, 2 deletions
diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py
index de3a5b1..addc571 100644
--- a/mesonbuild/modules/qt.py
+++ b/mesonbuild/modules/qt.py
@@ -14,8 +14,11 @@
import os
import shutil
+import typing as T
+
from .. import mlog
from .. import build
+from .. import mesonlib
from ..mesonlib import MesonException, extract_as_list, File, unholder, version_compare
from ..dependencies import Dependency, Qt4Dependency, Qt5Dependency, Qt6Dependency
import xml.etree.ElementTree as ET
@@ -24,6 +27,11 @@ from ..interpreterbase import noPosargs, permittedKwargs, FeatureNew, FeatureNew
from ..interpreter import extract_required_kwarg
from ..programs import NonExistingExternalProgram
+if T.TYPE_CHECKING:
+ from .. import Interpreter
+ from ..dependencies.qt import QtBaseDependency
+ from ..programs import ExternalProgram
+
_QT_DEPS_LUT = {
4: Qt4Dependency,
5: Qt5Dependency,
@@ -35,10 +43,59 @@ class QtBaseModule(ExtensionModule):
tools_detected = False
rcc_supports_depfiles = False
- def __init__(self, interpreter, qt_version=5):
+ def __init__(self, interpreter: 'Interpreter', qt_version=5):
ExtensionModule.__init__(self, interpreter)
self.snippets.add('has_tools')
self.qt_version = qt_version
+ self.moc: 'ExternalProgram' = NonExistingExternalProgram('moc')
+ self.uic: 'ExternalProgram' = NonExistingExternalProgram('uic')
+ self.rcc: 'ExternalProgram' = NonExistingExternalProgram('rcc')
+ self.lrelease: 'ExternalProgram' = NonExistingExternalProgram('lrelease')
+
+ def compilers_detect(self, qt_dep: 'QtBaseDependency') -> None:
+ """Detect Qt (4 or 5) moc, uic, rcc in the specified bindir or in PATH"""
+ # It is important that this list does not change order as the order of
+ # the returned ExternalPrograms will change as well
+ bins = ['moc', 'uic', 'rcc', 'lrelease']
+ found = {b: NonExistingExternalProgram(name=f'{b}-{qt_dep.name}')
+ for b in bins}
+ wanted = f'== {qt_dep.version}'
+
+ def gen_bins() -> T.Generator[T.Tuple[str, str], None, None]:
+ for b in bins:
+ if qt_dep.bindir:
+ yield os.path.join(qt_dep.bindir, b), b
+ # 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 f'{b}-{qt_dep.name}', b
+ yield b, b
+
+ for b, name in gen_bins():
+ if found[name].found():
+ continue
+
+ if name == 'lrelease':
+ arg = ['-version']
+ elif mesonlib.version_compare(qt_dep.version, '>= 5'):
+ arg = ['--version']
+ else:
+ arg = ['-v']
+
+ # Ensure that the version of qt and each tool are the same
+ def get_version(p: 'ExternalProgram') -> str:
+ _, out, err = mesonlib.Popen_safe(p.get_command() + arg)
+ if b.startswith('lrelease') or not qt_dep.version.startswith('4'):
+ care = out
+ else:
+ care = err
+ return care.split(' ')[-1].replace(')', '').strip()
+
+ p = self.interpreter.find_program_impl(
+ [b], required=False,
+ version_func=get_version,
+ wanted=wanted).held_object
+ if p.found():
+ setattr(self, name, p)
def _detect_tools(self, env, method, required=True):
if self.tools_detected:
@@ -49,7 +106,7 @@ class QtBaseModule(ExtensionModule):
qt = _QT_DEPS_LUT[self.qt_version](env, kwargs)
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)
+ self.compilers_detect(qt)
if version_compare(qt.version, '>=5.14.0'):
self.rcc_supports_depfiles = True
else: