aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/markdown/Gnome-module.md13
-rw-r--r--mesonbuild/modules/gnome.py96
2 files changed, 74 insertions, 35 deletions
diff --git a/docs/markdown/Gnome-module.md b/docs/markdown/Gnome-module.md
index ccdb1f2..41a8bbd 100644
--- a/docs/markdown/Gnome-module.md
+++ b/docs/markdown/Gnome-module.md
@@ -21,6 +21,19 @@ with anything else.
### gnome.compile_resources()
+```
+ gnome.compile_resources(id: string, input_file: string | File,
+ build_by_default: bool = false,
+ c_name: string | None = None,
+ dependencies: [](File, CustomTarget, CustomTargetIndex) = [],
+ export: bool = false,
+ extra_args: []string = [],
+ gresource_bundle: bool = false,
+ install_dir: string | None = None,
+ source_dir: [string] = [],
+ ): (CustomTarget, CustomTarget) | CustomTarget
+```
+
This function compiles resources specified in an XML file into code
that can be embedded inside the main binary. Similar a build target it
takes two positional arguments. The first one is the name of the
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index fbdd7c9..3096a84 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -31,7 +31,7 @@ from .. import mesonlib
from .. import mlog
from ..build import CustomTarget, CustomTargetIndex, GeneratedList
from ..dependencies import Dependency, PkgConfigDependency, InternalDependency
-from ..interpreter.type_checking import DEPEND_FILES_KW
+from ..interpreter.type_checking import DEPEND_FILES_KW, INSTALL_KW, NoneType
from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, FeatureNew, FeatureNewKwargs, FeatureDeprecatedKwargs
from ..interpreterbase import typed_kwargs, KwargInfo, ContainerTypeInfo
from ..interpreterbase.decorators import typed_pos_args
@@ -68,11 +68,31 @@ if T.TYPE_CHECKING:
sources: T.List[str]
symlink_media: bool
+ class CompileResources(TypedDict):
+
+ build_by_default: bool
+ c_name: T.Optional[str]
+ dependencies: T.List[T.Union[mesonlib.File, build.CustomTarget, build.CustomTargetIndex]]
+ export: bool
+ extra_args: T.List[str]
+ gresource_bundle: bool
+ install: bool
+ install_dir: T.Optional[str]
+ install_header: bool
+ source_dir: T.List[str]
+
# Differs from the CustomTarget version in that it straight defaults to True
_BUILD_BY_DEFAULT: KwargInfo[bool] = KwargInfo(
'build_by_default', bool, default=True,
)
+_EXTRA_ARGS_KW: KwargInfo[T.List[str]] = KwargInfo(
+ 'extra_args',
+ ContainerTypeInfo(list, str),
+ default=[],
+ listify=True,
+)
+
# gresource compilation is broken due to the way
# the resource compiler and Ninja clash about it
#
@@ -207,28 +227,40 @@ class GnomeModule(ExtensionModule):
rv.append(script)
return ModuleReturnValue(None, rv)
- @FeatureNewKwargs('gnome.compile_resources', '0.37.0', ['gresource_bundle', 'export', 'install_header'])
- @permittedKwargs({'source_dir', 'c_name', 'dependencies', 'export', 'gresource_bundle', 'install_header',
- 'install', 'install_dir', 'extra_args', 'build_by_default'})
@typed_pos_args('gnome.compile_resources', str, (str, mesonlib.File))
- def compile_resources(self, state: 'ModuleState', args: T.Tuple[str, 'FileOrString'], kwargs) -> 'ModuleReturnValue':
+ @typed_kwargs(
+ 'gnome.compile_resources',
+ _BUILD_BY_DEFAULT,
+ _EXTRA_ARGS_KW,
+ INSTALL_KW,
+ INSTALL_KW.evolve(name='install_header', since='0.37.0'),
+ KwargInfo('c_name', (str, NoneType)),
+ KwargInfo('dependencies', ContainerTypeInfo(list, (mesonlib.File, build.CustomTarget, build.CustomTargetIndex)), default=[], listify=True),
+ KwargInfo('export', bool, default=False, since='0.37.0'),
+ KwargInfo('gresource_bundle', bool, default=False, since='0.37.0'),
+ KwargInfo('install_dir', (str, NoneType)),
+ KwargInfo('source_dir', ContainerTypeInfo(list, str), default=[], listify=True),
+ )
+ def compile_resources(self, state: 'ModuleState', args: T.Tuple[str, 'FileOrString'],
+ kwargs: 'CompileResources') -> 'ModuleReturnValue':
self.__print_gresources_warning(state)
glib_version = self._get_native_glib_version(state)
glib_compile_resources = state.find_program('glib-compile-resources')
cmd = [glib_compile_resources, '@INPUT@']
- source_dirs, dependencies = (mesonlib.extract_as_list(kwargs, c, pop=True) for c in ['source_dir', 'dependencies'])
+ source_dirs = kwargs['source_dir']
+ dependencies = kwargs['dependencies']
target_name, input_file = args
# Validate dependencies
- subdirs = []
- depends = []
+ subdirs: T.List[str] = []
+ depends: T.List[T.Union[build.CustomTarget, build.CustomTargetIndex]] = []
for dep in dependencies:
if isinstance(dep, mesonlib.File):
subdirs.append(dep.subdir)
- elif isinstance(dep, (build.CustomTarget, build.CustomTargetIndex)):
+ else:
depends.append(dep)
subdirs.append(dep.get_subdir())
if not mesonlib.version_compare(glib_version, gresource_dep_needed_version):
@@ -236,11 +268,6 @@ class GnomeModule(ExtensionModule):
'be used with the current version of glib-compile-resources due to\n' \
'<https://bugzilla.gnome.org/show_bug.cgi?id=774368>'
raise MesonException(m)
- else:
- m = f'Unexpected dependency type {dep!r} for gnome.compile_resources() ' \
- '"dependencies" argument.\nPlease pass the return value of ' \
- 'custom_target() or configure_file()'
- raise MesonException(m)
if not mesonlib.version_compare(glib_version, gresource_dep_needed_version):
# Resource xml files generated at build-time cannot be used with
@@ -271,17 +298,15 @@ class GnomeModule(ExtensionModule):
for source_dir in OrderedSet(source_dirs):
cmd += ['--sourcedir', source_dir]
- if 'c_name' in kwargs:
- cmd += ['--c-name', kwargs.pop('c_name')]
- export = kwargs.pop('export', False)
- if not export:
+ if kwargs['c_name']:
+ cmd += ['--c-name', kwargs['c_name']]
+ if not kwargs['export']:
cmd += ['--internal']
cmd += ['--generate', '--target', '@OUTPUT@']
+ cmd += kwargs['extra_args']
- cmd += mesonlib.stringlistify(kwargs.pop('extra_args', []))
-
- gresource = kwargs.pop('gresource_bundle', False)
+ gresource = kwargs['gresource_bundle']
if gresource:
output = f'{target_name}.gresource'
name = f'{target_name}_gresource'
@@ -295,20 +320,23 @@ class GnomeModule(ExtensionModule):
else:
raise MesonException('Compiling GResources into code is only supported in C and C++ projects')
- if kwargs.get('install', False) and not gresource:
+ if kwargs['install'] and not gresource:
raise MesonException('The install kwarg only applies to gresource bundles, see install_header')
- install_header = kwargs.pop('install_header', False)
+ install_header = kwargs['install_header']
if install_header and gresource:
raise MesonException('The install_header kwarg does not apply to gresource bundles')
- if install_header and not export:
+ if install_header and not kwargs['export']:
raise MesonException('GResource header is installed yet export is not enabled')
- c_kwargs = kwargs.copy()
- c_kwargs['input'] = args[1]
- c_kwargs['output'] = output
- c_kwargs['depends'] = depends
- c_kwargs.setdefault('install_dir', [])
+ c_kwargs: T.Dict[str, T.Any] = {
+ 'build_by_default': kwargs['build_by_default'],
+ 'depends': depends,
+ 'input': input_file,
+ 'install': kwargs['install'],
+ 'install_dir': kwargs['install_dir'] or [],
+ 'output': output,
+ }
if not mesonlib.version_compare(glib_version, gresource_dep_needed_version):
# This will eventually go out of sync if dependencies are added
c_kwargs['depend_files'] = depend_files
@@ -322,19 +350,17 @@ class GnomeModule(ExtensionModule):
if gresource: # Only one target for .gresource files
return ModuleReturnValue(target_c, [target_c])
- h_kwargs = {
+ h_kwargs: T.Dict[str, T.Any] = {
'command': cmd,
'input': input_file,
'output': f'{target_name}.h',
# The header doesn't actually care about the files yet it errors if missing
- 'depends': depends
+ 'depends': depends,
+ 'build_by_default': kwargs['build_by_default'],
+ 'install_dir': kwargs['install_dir'] or [state.environment.coredata.get_option(mesonlib.OptionKey('includedir'))],
}
- if 'build_by_default' in kwargs:
- h_kwargs['build_by_default'] = kwargs['build_by_default']
if install_header:
h_kwargs['install'] = install_header
- h_kwargs['install_dir'] = kwargs.get('install_dir',
- state.environment.coredata.get_option(mesonlib.OptionKey('includedir')))
target_h = GResourceHeaderTarget(f'{target_name}_h', state.subdir, state.subproject, h_kwargs)
rv = [target_c, target_h]
return ModuleReturnValue(rv, rv)