aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/modules/gnome.py121
1 files changed, 70 insertions, 51 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index 73f4e1a..fab5389 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -32,7 +32,7 @@ from .. import mlog
from ..build import CustomTarget, CustomTargetIndex, GeneratedList, InvalidArguments
from ..dependencies import Dependency, PkgConfigDependency, InternalDependency
from ..interpreter.type_checking import DEPEND_FILES_KW, INSTALL_KW, NoneType, in_set_validator
-from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, FeatureNew, FeatureNewKwargs, FeatureDeprecatedKwargs
+from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, FeatureNew, FeatureDeprecatedKwargs
from ..interpreterbase import typed_kwargs, KwargInfo, ContainerTypeInfo
from ..interpreterbase.decorators import typed_pos_args
from ..mesonlib import (
@@ -125,6 +125,20 @@ if T.TYPE_CHECKING:
include_directories: T.List[T.Union[str, build.IncludeDirs]]
dependencies: T.List[T.Union[Dependency, build.SharedLibrary, build.StaticLibrary]]
+ class GdbusCodegen(TypedDict):
+
+ sources: T.List[FileOrString]
+ extra_args: T.List[str]
+ interface_prefix: T.Optional[str]
+ namespace: T.Optional[str]
+ object_manager: bool
+ build_by_default: bool
+ annotations: T.List[str]
+ install_header: bool
+ install_dir: T.Optional[str]
+ docbook: T.Optional[str]
+ autocleanup: Literal['all', 'none', 'objects', 'default']
+
# Differs from the CustomTarget version in that it straight defaults to True
_BUILD_BY_DEFAULT: KwargInfo[bool] = KwargInfo(
'build_by_default', bool, default=True,
@@ -1253,60 +1267,67 @@ class GnomeModule(ExtensionModule):
def gtkdoc_html_dir(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'TYPE_kwargs') -> str:
return os.path.join('share/gtk-doc/html', args[0])
- def _get_autocleanup_args(self, kwargs: T.Dict[str, T.Any], glib_version: str) -> T.List[str]:
- if not mesonlib.version_compare(glib_version, '>= 2.49.1'):
- # Warn if requested, silently disable if not
- if 'autocleanup' in kwargs:
- mlog.warning(f'Glib version ({glib_version}) is too old to support the \'autocleanup\' '
- 'kwarg, need 2.49.1 or newer')
- return []
- autocleanup = kwargs.pop('autocleanup', 'all')
- values = ('none', 'objects', 'all')
- if autocleanup not in values:
- raise MesonException('gdbus_codegen does not support {!r} as an autocleanup value, '
- 'must be one of: {!r}'.format(autocleanup, ', '.join(values)))
- return ['--c-generate-autocleanup', autocleanup]
-
- @FeatureNewKwargs('build target', '0.46.0', ['install_header', 'install_dir', 'sources'])
- @FeatureNewKwargs('build target', '0.40.0', ['build_by_default'])
- @FeatureNewKwargs('build target', '0.47.0', ['extra_args', 'autocleanup'])
- @permittedKwargs({'interface_prefix', 'namespace', 'extra_args', 'autocleanup', 'object_manager', 'build_by_default',
- 'annotations', 'docbook', 'install_header', 'install_dir', 'sources'})
@typed_pos_args('gnome.gdbus_codegen', str, optargs=[str])
- def gdbus_codegen(self, state: 'ModuleState', args: T.Tuple[str, T.Optional[str]], kwargs) -> ModuleReturnValue:
+ @typed_kwargs(
+ 'gnome.gdbus_codegen',
+ _BUILD_BY_DEFAULT.evolve(since='0.40.0'),
+ KwargInfo('sources', ContainerTypeInfo(list, (str, mesonlib.File)), since='0.46.0', default=[], listify=True),
+ KwargInfo('extra_args', ContainerTypeInfo(list, str), since='0.47.0', default=[], listify=True),
+ KwargInfo('interface_prefix', (str, NoneType)),
+ KwargInfo('namespace', (str, NoneType)),
+ KwargInfo('object_manager', bool, default=False),
+ KwargInfo(
+ 'annotations', ContainerTypeInfo(list, str),
+ listify=True,
+ default=[],
+ validator=lambda x: 'must be made up of 3 strings for ELEMENT, KEY, and VALUE' if len(x) != 3 else None
+ ),
+ KwargInfo('install_header', bool, default=False, since='0.46.0'),
+ KwargInfo('install_dir', (str, NoneType), since='0.46.0'),
+ KwargInfo('docbook', (str, NoneType)),
+ KwargInfo(
+ 'autocleanup', str, default='default', since='0.47.0',
+ validator=in_set_validator({'all', 'none', 'objects'})),
+ )
+ def gdbus_codegen(self, state: 'ModuleState', args: T.Tuple[str, T.Optional[str]],
+ kwargs: 'GdbusCodegen') -> ModuleReturnValue:
namebase = args[0]
- xml_files: T.List[str] = [args[1]] if args[1] else []
- cmd = [state.find_program('gdbus-codegen')]
- extra_args = mesonlib.stringlistify(kwargs.pop('extra_args', []))
- cmd += extra_args
+ xml_files: T.List['FileOrString'] = [args[1]] if args[1] else []
+ cmd: T.List[T.Union['ExternalProgram', str]] = [state.find_program('gdbus-codegen')]
+ cmd.extend(kwargs['extra_args'])
+
# Autocleanup supported?
glib_version = self._get_native_glib_version(state)
- cmd += self._get_autocleanup_args(kwargs, glib_version)
- if 'interface_prefix' in kwargs:
- cmd += ['--interface-prefix', kwargs.pop('interface_prefix')]
- if 'namespace' in kwargs:
- cmd += ['--c-namespace', kwargs.pop('namespace')]
- if kwargs.get('object_manager', False):
- cmd += ['--c-generate-object-manager']
- if 'sources' in kwargs:
- xml_files += mesonlib.listify(kwargs.pop('sources'))
- build_by_default = kwargs.get('build_by_default', False)
+ if not mesonlib.version_compare(glib_version, '>= 2.49.1'):
+ # Warn if requested, silently disable if not
+ if kwargs['autocleanup'] != 'default':
+ mlog.warning(f'Glib version ({glib_version}) is too old to support the \'autocleanup\' '
+ 'kwarg, need 2.49.1 or newer')
+ else:
+ # Handle legacy glib versions that don't have autocleanup
+ ac = kwargs['autocleanup']
+ if ac == 'default':
+ ac = 'all'
+ cmd.extend(['--c-generate-autocleanup', ac])
+
+ if kwargs['interface_prefix'] is not None:
+ cmd.extend(['--interface-prefix', kwargs['interface_prefix']])
+ if kwargs['namespace'] is not None:
+ cmd.extend(['--c-namespace', kwargs['namespace']])
+ if kwargs['object_manager']:
+ cmd.extend(['--c-generate-object-manager'])
+ xml_files.extend(kwargs['sources'])
+ build_by_default = kwargs['build_by_default']
# Annotations are a bit ugly in that they are a list of lists of strings...
- annotations = kwargs.pop('annotations', [])
- if not isinstance(annotations, list):
- raise MesonException('annotations takes a list')
- if annotations and isinstance(annotations, list) and not isinstance(annotations[0], list):
- annotations = [annotations]
-
- for annotation in annotations:
- if len(annotation) != 3 or not all(isinstance(i, str) for i in annotation):
- raise MesonException('Annotations must be made up of 3 strings for ELEMENT, KEY, and VALUE')
- cmd += ['--annotate'] + annotation
+ if kwargs['annotations']:
+ cmd.append('--annotate')
+ cmd.extend(kwargs['annotations'])
targets = []
- install_header = kwargs.get('install_header', False)
- install_dir = kwargs.get('install_dir', state.environment.coredata.get_option(mesonlib.OptionKey('includedir')))
+ install_header = kwargs['install_header']
+ install_dir = kwargs['install_dir'] or state.environment.coredata.get_option(mesonlib.OptionKey('includedir'))
+ assert isinstance(install_dir, str), 'for mypy'
output = namebase + '.c'
# Added in https://gitlab.gnome.org/GNOME/glib/commit/e4d68c7b3e8b01ab1a4231bf6da21d045cb5a816 (2.55.2)
@@ -1318,10 +1339,8 @@ class GnomeModule(ExtensionModule):
'build_by_default': build_by_default
}
else:
- if 'docbook' in kwargs:
+ if kwargs['docbook'] is not None:
docbook = kwargs['docbook']
- if not isinstance(docbook, str):
- raise MesonException('docbook value must be a string.')
cmd += ['--generate-docbook', docbook]
@@ -1363,7 +1382,7 @@ class GnomeModule(ExtensionModule):
hfile_custom_target = build.CustomTarget(output, state.subdir, state.subproject, custom_kwargs)
targets.append(hfile_custom_target)
- if 'docbook' in kwargs:
+ if kwargs['docbook'] is not None:
docbook = kwargs['docbook']
if not isinstance(docbook, str):
raise MesonException('docbook value must be a string.')