From 3dcc7125833cae138987aa4535c88dbd4dbd960d Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Tue, 5 Oct 2021 11:08:02 -0700 Subject: [PATCH] modules/gnome: use typed_pos_args for compile_resources --- mesonbuild/modules/gnome.py | 53 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index d98c1178f..a766ec6e5 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -32,6 +32,7 @@ from ..build import CustomTarget, CustomTargetIndex, GeneratedList from ..dependencies import Dependency, PkgConfigDependency, InternalDependency from ..interpreterbase import noPosargs, noKwargs, permittedKwargs, FeatureNew, FeatureNewKwargs, FeatureDeprecatedKwargs, FeatureDeprecated from ..interpreterbase import typed_kwargs, KwargInfo, ContainerTypeInfo +from ..interpreterbase.decorators import typed_pos_args from ..mesonlib import ( MachineChoice, MesonException, OrderedSet, Popen_safe, extract_as_list, join_args, HoldableObject @@ -45,6 +46,7 @@ if T.TYPE_CHECKING: from ..compilers import Compiler from ..interpreter import Interpreter from ..interpreterbase import TYPE_var + from ..mesonlib import FileOrString class PostInstall(TypedDict): glib_compile_schemas: bool @@ -190,7 +192,8 @@ class GnomeModule(ExtensionModule): @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'}) - def compile_resources(self, state: 'ModuleState', args, kwargs) -> 'ModuleReturnValue': + @typed_pos_args('gnome.compile_resources', str, (str, mesonlib.File)) + def compile_resources(self, state: 'ModuleState', args: T.Tuple[str, 'FileOrString'], kwargs) -> 'ModuleReturnValue': self.__print_gresources_warning(state) glib_version = self._get_native_glib_version(state) @@ -199,9 +202,7 @@ class GnomeModule(ExtensionModule): source_dirs, dependencies = (mesonlib.extract_as_list(kwargs, c, pop=True) for c in ['source_dir', 'dependencies']) - if len(args) < 2: - raise MesonException('Not enough arguments; the name of the resource ' - 'and the path to the XML file are required') + target_name, input_file = args # Validate dependencies subdirs = [] @@ -224,27 +225,21 @@ class GnomeModule(ExtensionModule): raise MesonException(m) if not mesonlib.version_compare(glib_version, gresource_dep_needed_version): - ifile = args[1] - if isinstance(ifile, mesonlib.File): + # Resource xml files generated at build-time cannot be used with + # gnome.compile_resources() because we need to scan the xml for + # dependencies. Use configure_file() instead to generate it at + # configure-time + if isinstance(input_file, mesonlib.File): # glib-compile-resources will be run inside the source dir, # so we need either 'src_to_build' or the absolute path. # Absolute path is the easiest choice. - if ifile.is_built: - ifile = os.path.join(state.environment.get_build_dir(), ifile.subdir, ifile.fname) + if input_file.is_built: + ifile = os.path.join(state.environment.get_build_dir(), input_file.subdir, input_file.fname) else: - ifile = os.path.join(ifile.subdir, ifile.fname) - elif isinstance(ifile, str): - ifile = os.path.join(state.subdir, ifile) - elif isinstance(ifile, (build.CustomTarget, - build.CustomTargetIndex, - build.GeneratedList)): - m = 'Resource xml files generated at build-time cannot be used ' \ - 'with gnome.compile_resources() because we need to scan ' \ - 'the xml for dependencies. Use configure_file() instead ' \ - 'to generate it at configure-time.' - raise MesonException(m) + ifile = os.path.join(input_file.subdir, input_file.fname) else: - raise MesonException(f'Invalid file argument: {ifile!r}') + ifile = os.path.join(state.subdir, input_file) + depend_files, depends, subdirs = self._get_gresource_dependencies( state, ifile, source_dirs, dependencies) @@ -270,15 +265,15 @@ class GnomeModule(ExtensionModule): gresource = kwargs.pop('gresource_bundle', False) if gresource: - output = args[0] + '.gresource' - name = args[0] + '_gresource' + output = f'{target_name}.gresource' + name = f'{target_name}_gresource' else: if 'c' in state.environment.coredata.compilers.host.keys(): - output = args[0] + '.c' - name = args[0] + '_c' + output = f'{target_name}.c' + name = f'{target_name}_c' elif 'cpp' in state.environment.coredata.compilers.host.keys(): - output = args[0] + '.cpp' - name = args[0] + '_cpp' + output = f'{target_name}.cpp' + name = f'{target_name}_cpp' else: raise MesonException('Compiling GResources into code is only supported in C and C++ projects') @@ -311,8 +306,8 @@ class GnomeModule(ExtensionModule): h_kwargs = { 'command': cmd, - 'input': args[1], - 'output': args[0] + '.h', + 'input': input_file, + 'output': f'{target_name}.h', # The header doesn't actually care about the files yet it errors if missing 'depends': depends } @@ -322,7 +317,7 @@ class GnomeModule(ExtensionModule): h_kwargs['install'] = install_header h_kwargs['install_dir'] = kwargs.get('install_dir', state.environment.coredata.get_option(mesonlib.OptionKey('includedir'))) - target_h = GResourceHeaderTarget(args[0] + '_h', state.subdir, state.subproject, h_kwargs) + target_h = GResourceHeaderTarget(f'{target_name}_h', state.subdir, state.subproject, h_kwargs) rv = [target_c, target_h] return ModuleReturnValue(rv, rv)