diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2021-06-01 14:54:57 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2021-06-15 12:35:15 -0700 |
commit | 2322804a4df9811ba75db01230b5df36efd20aee (patch) | |
tree | 8115f092c23fdcf976823db7bdd1fcfc1bc539ce /mesonbuild/modules/qt.py | |
parent | ec592a4ecae1db61b9748ec7d2388f738cdb4737 (diff) | |
download | meson-2322804a4df9811ba75db01230b5df36efd20aee.zip meson-2322804a4df9811ba75db01230b5df36efd20aee.tar.gz meson-2322804a4df9811ba75db01230b5df36efd20aee.tar.bz2 |
modules/qt: Add a compile_moc method
This method only compiles moc resources, nothing else
Diffstat (limited to 'mesonbuild/modules/qt.py')
-rw-r--r-- | mesonbuild/modules/qt.py | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py index f3e6f27..439f995 100644 --- a/mesonbuild/modules/qt.py +++ b/mesonbuild/modules/qt.py @@ -27,6 +27,7 @@ from . import ModuleReturnValue, ExtensionModule from ..interpreterbase import ContainerTypeInfo, FeatureDeprecated, FeatureDeprecatedKwargs, KwargInfo, noPosargs, permittedKwargs, FeatureNew, FeatureNewKwargs, typed_kwargs from ..interpreter import extract_required_kwarg from ..programs import NonExistingExternalProgram +from ..interpreter.interpreterobjects import DependencyHolder, ExternalLibraryHolder, IncludeDirsHolder if T.TYPE_CHECKING: from . import ModuleState @@ -54,6 +55,17 @@ if T.TYPE_CHECKING: extra_args: T.List[str] method: str + class MocCompilerKwArgs(TypedDict): + + """Keyword arguments for the Moc Compiler method.""" + + sources: T.Optional[T.List[mesonlib.FileOrString]] + headers: T.Optional[T.List[mesonlib.FileOrString]] + extra_args: T.Optional[T.List[str]] + method: str + include_directories: T.Optional[T.List[IncludeDirsHolder]] + dependencies: T.Optional[T.List[T.Union[DependencyHolder, ExternalLibraryHolder]]] + class QtBaseModule(ExtensionModule): tools_detected = False @@ -72,6 +84,7 @@ class QtBaseModule(ExtensionModule): 'compile_translations': self.compile_translations, 'compile_resources': self.compile_resources, 'compile_ui': self.compile_ui, + 'compile_moc': self.compile_moc, }) def compilers_detect(self, state, qt_dep: 'QtBaseDependency') -> None: @@ -302,12 +315,57 @@ class QtBaseModule(ExtensionModule): out = gen.process_files(f'Qt{self.qt_version} ui', kwargs['sources'], state) return ModuleReturnValue(out, [out]) # type: ignore + @FeatureNew('qt.compile_moc', '0.59.0') + @noPosargs + @typed_kwargs( + 'qt.compile_moc', + KwargInfo('sources', ContainerTypeInfo(list, (File, str)), listify=True), + KwargInfo('headers', ContainerTypeInfo(list, (File, str)), listify=True), + KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True), + KwargInfo('method', str, default='auto'), + KwargInfo('include_directories', ContainerTypeInfo(list, IncludeDirsHolder), listify=True), + KwargInfo('dependencies', ContainerTypeInfo(list, (DependencyHolder, ExternalLibraryHolder)), listify=True), + ) + def compile_moc(self, state: 'ModuleState', args: T.Tuple, kwargs: 'MocCompilerKwArgs') -> ModuleReturnValue: + self._detect_tools(state, kwargs['method']) + if not self.moc.found(): + err_msg = ("{0} sources specified and couldn't find {1}, " + "please check your qt{2} installation") + raise MesonException(err_msg.format('MOC', f'uic-qt{self.qt_version}', self.qt_version)) + + if not (kwargs['headers'] or kwargs['sources']): + raise build.InvalidArguments('At least one of the "headers" or "sources" keyword arguments must be provied and not empty') + + inc = state.get_include_args(include_dirs=kwargs['include_directories'] or []) + compile_args: T.List[str] = [] + if kwargs['dependencies']: + for dep in unholder(kwargs['dependencies']): + compile_args.extend([a for a in dep.get_all_compile_args() if a.startswith(('-I', '-D'))]) + + output: T.List[build.GeneratedList] = [] + + extra_args: T.List[str] = kwargs['extra_args'] or [] + arguments = extra_args + inc + compile_args + ['@INPUT@', '-o', '@OUTPUT@'] + if kwargs['headers']: + moc_kwargs = {'output': 'moc_@BASENAME@.cpp', + 'arguments': arguments} + moc_gen = build.Generator([self.moc], moc_kwargs) + output.append(moc_gen.process_files(f'Qt{self.qt_version} moc header', kwargs['headers'], state)) + if kwargs['sources']: + moc_kwargs = {'output': '@BASENAME@.moc', + 'arguments': arguments} + moc_gen = build.Generator([self.moc], moc_kwargs) + output.append(moc_gen.process_files(f'Qt{self.qt_version} moc source', kwargs['sources'], state)) + + return ModuleReturnValue(output, [output]) + @FeatureNewKwargs('qt.preprocess', '0.49.0', ['uic_extra_arguments']) @FeatureNewKwargs('qt.preprocess', '0.44.0', ['moc_extra_arguments']) @FeatureNewKwargs('qt.preprocess', '0.49.0', ['rcc_extra_arguments']) @FeatureDeprecatedKwargs('qt.preprocess', '0.59.0', ['sources']) @permittedKwargs({'moc_headers', 'moc_sources', 'uic_extra_arguments', 'moc_extra_arguments', 'rcc_extra_arguments', 'include_directories', 'dependencies', 'ui_files', 'qresources', 'method'}) - def preprocess(self, state, args, kwargs): + # We can't use typed_pos_args here, the signature is ambiguious + def preprocess(self, state: 'ModuleState', args: T.List[str], kwargs): rcc_files, ui_files, moc_headers, moc_sources, uic_extra_arguments, moc_extra_arguments, rcc_extra_arguments, sources, include_directories, dependencies \ = [extract_as_list(kwargs, c, pop=True) for c in ['qresources', 'ui_files', 'moc_headers', 'moc_sources', 'uic_extra_arguments', 'moc_extra_arguments', 'rcc_extra_arguments', 'sources', 'include_directories', 'dependencies']] _sources = args[1:] |