diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2022-01-19 12:42:25 -0800 |
---|---|---|
committer | Eli Schwartz <eschwartz93@gmail.com> | 2022-01-28 15:53:20 -0500 |
commit | 11f96380351a88059ec55f1070fdebc1b1033117 (patch) | |
tree | 3577f52920c3e2159f193605a894cb090b95ec10 /mesonbuild/modules/gnome.py | |
parent | b402817fb6f0392812bfa272bdbc05c9c30139fa (diff) | |
download | meson-11f96380351a88059ec55f1070fdebc1b1033117.zip meson-11f96380351a88059ec55f1070fdebc1b1033117.tar.gz meson-11f96380351a88059ec55f1070fdebc1b1033117.tar.bz2 |
build: replace kwargs in CustomTarget initializer
Because we don't want to pass the Interpreter kwargs into the build
layer. This turned out to be a mega commit, as there's really on elegant
way to make this change in an incremental way. On the nice side, mypy
made this change super easy, as nearly all of the calls to
`CustomTarget` are fully type checked!
It also turns out that we're not handling install_tags in custom_target
correctly, since we're not converting the boolean values into Optional
values!
Diffstat (limited to 'mesonbuild/modules/gnome.py')
-rw-r--r-- | mesonbuild/modules/gnome.py | 383 |
1 files changed, 211 insertions, 172 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index ffdfd42..37d4d92 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -148,7 +148,7 @@ if T.TYPE_CHECKING: build_by_default: T.Optional[bool] depend_files: T.List[mesonlib.File] extra_args: T.List[str] - install_dir: T.List[T.Union[str, bool]] + install_dir: T.Union[str, bool] install_header: bool internal: bool nostdinc: bool @@ -404,7 +404,7 @@ class GnomeModule(ExtensionModule): glib_version = self._get_native_glib_version(state) glib_compile_resources = state.find_program('glib-compile-resources') - cmd = [glib_compile_resources, '@INPUT@'] + cmd: T.List[T.Union[ExternalProgram, str]] = [glib_compile_resources, '@INPUT@'] source_dirs = kwargs['source_dir'] dependencies = kwargs['dependencies'] @@ -486,39 +486,47 @@ class GnomeModule(ExtensionModule): if install_header and not kwargs['export']: raise MesonException('GResource header is installed yet export is not enabled') - 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, - } + depfile: T.Optional[str] = None + target_cmd: T.List[T.Union[ExternalProgram, str]] 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 - c_kwargs['command'] = cmd + target_cmd = cmd else: depfile = f'{output}.d' - c_kwargs['depfile'] = depfile - c_kwargs['command'] = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] - target_c = GResourceTarget(name, state.subdir, state.subproject, c_kwargs) + depend_files = [] + target_cmd = copy.copy(cmd) + ['--dependency-file', '@DEPFILE@'] + target_c = GResourceTarget( + name, + state.subdir, + state.subproject, + target_cmd, + [input_file], + [output], + build_by_default=kwargs['build_by_default'], + depfile=depfile, + depend_files=depend_files, + extra_depends=depends, + install=kwargs['install'], + install_dir=[kwargs['install_dir']] if kwargs['install_dir'] else [], + ) if gresource: # Only one target for .gresource files return ModuleReturnValue(target_c, [target_c]) - 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, - 'build_by_default': kwargs['build_by_default'], - 'install_dir': kwargs['install_dir'] or [state.environment.coredata.get_option(mesonlib.OptionKey('includedir'))], - } - if install_header: - h_kwargs['install'] = install_header - target_h = GResourceHeaderTarget(f'{target_name}_h', state.subdir, state.subproject, h_kwargs) + install_dir = kwargs['install_dir'] or state.environment.coredata.get_option(mesonlib.OptionKey('includedir')) + assert isinstance(install_dir, str), 'for mypy' + target_h = GResourceHeaderTarget( + f'{target_name}_h', + state.subdir, + state.subproject, + cmd, + [input_file], + [f'{target_name}.h'], + build_by_default=kwargs['build_by_default'], + extra_depends=depends, + install=install_header, + install_dir=[install_dir], + ) rv = [target_c, target_h] return ModuleReturnValue(rv, rv) @@ -932,18 +940,19 @@ class GnomeModule(ExtensionModule): elif install_dir is False: install = False - scankwargs = { - 'input': generated_files, - 'output': girfile, - 'command': scan_command, - 'depends': depends, - 'install': install, - 'install_dir': install_dir, - 'install_tag': 'devel', - 'build_by_default': kwargs['build_by_default'], - } - - return GirTarget(girfile, state.subdir, state.subproject, scankwargs) + return GirTarget( + girfile, + state.subdir, + state.subproject, + scan_command, + generated_files, + [girfile], + build_by_default=kwargs['build_by_default'], + extra_depends=depends, + install=install, + install_dir=[install_dir], + install_tag=['devel'], + ) @staticmethod def _make_typelib_target(state: 'ModuleState', typelib_output: str, @@ -960,17 +969,18 @@ class GnomeModule(ExtensionModule): elif install_dir is False: install = False - typelib_kwargs = { - 'input': generated_files, - 'output': [typelib_output], - 'command': list(typelib_cmd), - 'install': install, - 'install_dir': install_dir, - 'install_tag': 'typelib', - 'build_by_default': kwargs['build_by_default'], - } - - return TypelibTarget(typelib_output, state.subdir, state.subproject, typelib_kwargs) + return TypelibTarget( + typelib_output, + state.subdir, + state.subproject, + typelib_cmd, + generated_files, + [typelib_output], + install=install, + install_dir=[install_dir], + install_tag=['typelib'], + build_by_default=kwargs['build_by_default'], + ) @staticmethod def _gather_typelib_includes_and_update_depends( @@ -1178,16 +1188,21 @@ class GnomeModule(ExtensionModule): srcdir = os.path.join(state.build_to_src, state.subdir) outdir = state.subdir - cmd = [state.find_program('glib-compile-schemas'), '--targetdir', outdir, srcdir] - ct_kwargs = T.cast(T.Dict[str, T.Any], kwargs.copy()) - ct_kwargs['command'] = cmd - ct_kwargs['input'] = [] - ct_kwargs['output'] = 'gschemas.compiled' + cmd: T.List[T.Union[ExternalProgram, str]] = [state.find_program('glib-compile-schemas'), '--targetdir', outdir, srcdir] if state.subdir == '': targetname = 'gsettings-compile' else: targetname = 'gsettings-compile-' + state.subdir.replace('/', '_') - target_g = build.CustomTarget(targetname, state.subdir, state.subproject, ct_kwargs) + target_g = build.CustomTarget( + targetname, + state.subdir, + state.subproject, + cmd, + [], + ['gschemas.compiled'], + build_by_default=kwargs['build_by_default'], + depend_files=kwargs['depend_files'], + ) self._devenv_prepend('GSETTINGS_SCHEMA_DIR', os.path.join(state.environment.get_build_dir(), state.subdir)) return ModuleReturnValue(target_g, [target_g]) @@ -1289,22 +1304,27 @@ class GnomeModule(ExtensionModule): potargets.append(potarget) gmo_file = project_id + '-' + l + '.gmo' - gmo_kwargs = {'command': [msgfmt, '@INPUT@', '-o', '@OUTPUT@'], - 'input': po_file, - 'output': gmo_file, - } - gmotarget = build.CustomTarget(f'help-{project_id}-{l}-gmo', l_subdir, state.subproject, gmo_kwargs) + gmotarget = build.CustomTarget( + f'help-{project_id}-{l}-gmo', + l_subdir, + state.subproject, + [msgfmt, '@INPUT@', '-o', '@OUTPUT@'], + [po_file], + [gmo_file], + ) targets.append(gmotarget) - merge_kwargs = {'command': [itstool, '-m', os.path.join(l_subdir, gmo_file), - '-o', '@OUTDIR@', '@INPUT@'], - 'input': sources_files, - 'output': sources, - 'depends': gmotarget, - 'install': True, - 'install_dir': l_install_dir, - } - mergetarget = build.CustomTarget(f'help-{project_id}-{l}', l_subdir, state.subproject, merge_kwargs) + mergetarget = build.CustomTarget( + f'help-{project_id}-{l}', + l_subdir, + state.subproject, + [itstool, '-m', os.path.join(l_subdir, gmo_file), '-o', '@OUTDIR@', '@INPUT@'], + sources_files, + sources, + extra_depends=[gmotarget], + install=True, + install_dir=[l_install_dir], + ) targets.append(mergetarget) allpotarget = build.AliasTarget(f'help-{project_id}-update-po', potargets, @@ -1377,15 +1397,16 @@ class GnomeModule(ExtensionModule): else: header_dirs.append(src_dir) - t_args = ['--internal', 'gtkdoc', - '--sourcedir=' + state.environment.get_source_dir(), - '--builddir=' + state.environment.get_build_dir(), - '--subdir=' + state.subdir, - '--headerdirs=' + '@@'.join(header_dirs), - '--mainfile=' + main_file, - '--modulename=' + modulename, - '--moduleversion=' + moduleversion, - '--mode=' + kwargs['mode']] + t_args: T.List[str] = [ + '--internal', 'gtkdoc', + '--sourcedir=' + state.environment.get_source_dir(), + '--builddir=' + state.environment.get_build_dir(), + '--subdir=' + state.subdir, + '--headerdirs=' + '@@'.join(header_dirs), + '--mainfile=' + main_file, + '--modulename=' + modulename, + '--moduleversion=' + moduleversion, + '--mode=' + kwargs['mode']] for tool in ['scan', 'scangobj', 'mkdb', 'mkhtml', 'fixxref']: program_name = 'gtkdoc-' + tool program = state.find_program(program_name) @@ -1432,12 +1453,16 @@ class GnomeModule(ExtensionModule): t_args.append(f'--installdir={"@@".join(kwargs["install_dir"])}') t_args += self._get_build_args(kwargs['c_args'], kwargs['include_directories'], kwargs['dependencies'], state, depends) - custom_kwargs = {'output': modulename + '-decl.txt', - 'command': command + t_args, - 'depends': depends, - 'build_always_stale': True, - } - custom_target = build.CustomTarget(targetname, state.subdir, state.subproject, custom_kwargs) + custom_target = build.CustomTarget( + targetname, + state.subdir, + state.subproject, + command + t_args, + [], + [f'{modulename}-decl.txt'], + build_always_stale=True, + extra_depends=depends, + ) alias_target = build.AliasTarget(targetname, [custom_target], state.subdir, state.subproject) if kwargs['check']: check_cmd = state.find_program('gtkdoc-check') @@ -1555,11 +1580,7 @@ class GnomeModule(ExtensionModule): # Added in https://gitlab.gnome.org/GNOME/glib/commit/e4d68c7b3e8b01ab1a4231bf6da21d045cb5a816 (2.55.2) # Fixed in https://gitlab.gnome.org/GNOME/glib/commit/cd1f82d8fc741a2203582c12cc21b4dacf7e1872 (2.56.2) if mesonlib.version_compare(glib_version, '>= 2.56.2'): - custom_kwargs = {'input': xml_files, - 'output': output, - 'command': cmd + ['--body', '--output', '@OUTPUT@', '@INPUT@'], - 'build_by_default': build_by_default - } + c_cmd = cmd + ['--body', '--output', '@OUTPUT@', '@INPUT@'] else: if kwargs['docbook'] is not None: docbook = kwargs['docbook'] @@ -1572,36 +1593,39 @@ class GnomeModule(ExtensionModule): else: self._print_gdbus_warning() cmd += ['--generate-c-code', '@OUTDIR@/' + namebase, '@INPUT@'] - - custom_kwargs = {'input': xml_files, - 'output': output, - 'command': cmd, - 'build_by_default': build_by_default - } - - cfile_custom_target = build.CustomTarget(output, state.subdir, state.subproject, custom_kwargs) + c_cmd = cmd + + cfile_custom_target = build.CustomTarget( + output, + state.subdir, + state.subproject, + c_cmd, + xml_files, + [output], + build_by_default=build_by_default, + ) targets.append(cfile_custom_target) output = namebase + '.h' if mesonlib.version_compare(glib_version, '>= 2.56.2'): - custom_kwargs = {'input': xml_files, - 'output': output, - 'command': cmd + ['--header', '--output', '@OUTPUT@', '@INPUT@'], - 'build_by_default': build_by_default, - 'install': install_header, - 'install_dir': install_dir - } + hfile_cmd = cmd + ['--header', '--output', '@OUTPUT@', '@INPUT@'] + depends = [] else: - custom_kwargs = {'input': xml_files, - 'output': output, - 'command': cmd, - 'build_by_default': build_by_default, - 'install': install_header, - 'install_dir': install_dir, - 'depends': cfile_custom_target - } - - hfile_custom_target = build.CustomTarget(output, state.subdir, state.subproject, custom_kwargs) + hfile_cmd = cmd + depends = [cfile_custom_target] + + hfile_custom_target = build.CustomTarget( + output, + state.subdir, + state.subproject, + hfile_cmd, + xml_files, + [output], + build_by_default=build_by_default, + extra_depends=depends, + install=install_header, + install_dir=[install_dir], + ) targets.append(hfile_custom_target) if kwargs['docbook'] is not None: @@ -1609,8 +1633,6 @@ class GnomeModule(ExtensionModule): if not isinstance(docbook, str): raise MesonException('docbook value must be a string.') - docbook_cmd = cmd + ['--output-directory', '@OUTDIR@', '--generate-docbook', docbook, '@INPUT@'] - # The docbook output is always ${docbook}-${name_of_xml_file} output = namebase + '-docbook' outputs = [] @@ -1618,20 +1640,22 @@ class GnomeModule(ExtensionModule): outputs.append('{}-{}'.format(docbook, os.path.basename(str(f)))) if mesonlib.version_compare(glib_version, '>= 2.56.2'): - custom_kwargs = {'input': xml_files, - 'output': outputs, - 'command': docbook_cmd, - 'build_by_default': build_by_default - } + docbook_cmd = cmd + ['--output-directory', '@OUTDIR@', '--generate-docbook', docbook, '@INPUT@'] + depends = [] else: - custom_kwargs = {'input': xml_files, - 'output': outputs, - 'command': cmd, - 'build_by_default': build_by_default, - 'depends': cfile_custom_target - } - - docbook_custom_target = build.CustomTarget(output, state.subdir, state.subproject, custom_kwargs) + docbook_cmd = cmd + depends = [cfile_custom_target] + + docbook_custom_target = build.CustomTarget( + output, + state.subdir, + state.subproject, + docbook_cmd, + xml_files, + outputs, + build_by_default=build_by_default, + extra_depends=depends, + ) targets.append(docbook_custom_target) return ModuleReturnValue(targets, targets) @@ -1835,18 +1859,23 @@ class GnomeModule(ExtensionModule): ) -> build.CustomTarget: real_cmd: T.List[T.Union[str, ExternalProgram]] = [state.find_program(['glib-mkenums', 'mkenums'])] real_cmd.extend(cmd) - custom_kwargs = { - 'input': sources, - 'output': [output], - 'capture': True, - 'command': real_cmd, - 'install': install, - 'install_dir': install_dir or state.environment.coredata.get_option(mesonlib.OptionKey('includedir')), - 'depends': list(depends or []), - } - return build.CustomTarget(output, state.subdir, state.subproject, custom_kwargs, - # https://github.com/mesonbuild/meson/issues/973 - absolute_paths=True) + _install_dir = install_dir or state.environment.coredata.get_option(mesonlib.OptionKey('includedir')) + assert isinstance(_install_dir, str), 'for mypy' + + return build.CustomTarget( + output, + state.subdir, + state.subproject, + real_cmd, + sources, + [output], + capture=True, + install=install, + install_dir=[_install_dir], + extra_depends=depends, + # https://github.com/mesonbuild/meson/issues/973 + absolute_paths=True, + ) @typed_pos_args('gnome.genmarshal', str) @typed_kwargs( @@ -1886,36 +1915,45 @@ class GnomeModule(ExtensionModule): cmd.append(f'--{k.replace("_", "-")}') install_header = kwargs['install_header'] - install_dir: T.List[T.Union[str, bool]] = kwargs['install_dir'] or [] - - - custom_kwargs: T.Dict[str, T.Any] = { - 'input': sources, - 'depend_files': kwargs['depend_files'], - 'install_dir': kwargs['install_dir'], - } + capture = False # https://github.com/GNOME/glib/commit/0fbc98097fac4d3e647684f344e508abae109fdf if mesonlib.version_compare(self._get_native_glib_version(state), '>= 2.51.0'): cmd += ['--output', '@OUTPUT@'] else: - custom_kwargs['capture'] = True + capture = True header_file = output + '.h' - custom_kwargs['command'] = cmd + ['--body', '@INPUT@'] + c_cmd = cmd + ['--body', '@INPUT@'] if mesonlib.version_compare(self._get_native_glib_version(state), '>= 2.53.4'): # Silence any warnings about missing prototypes - custom_kwargs['command'] += ['--include-header', header_file] - custom_kwargs['output'] = output + '.c' - body = build.CustomTarget(output + '_c', state.subdir, state.subproject, custom_kwargs) - - custom_kwargs['install'] = install_header - custom_kwargs['install_dir'] = install_dir + c_cmd += ['--include-header', header_file] + body = build.CustomTarget( + output + '_c', + state.subdir, + state.subproject, + c_cmd, + sources, + [f'{output}.c'], + capture=capture, + depend_files=kwargs['depend_files'], + ) + + h_cmd = cmd + ['--header', '@INPUT@'] if new_genmarshal: - cmd += ['--pragma-once'] - custom_kwargs['command'] = cmd + ['--header', '@INPUT@'] - custom_kwargs['output'] = header_file - header = build.CustomTarget(output + '_h', state.subdir, state.subproject, custom_kwargs) + h_cmd += ['--pragma-once'] + header = build.CustomTarget( + output + '_h', + state.subdir, + state.subproject, + h_cmd, + sources, + [header_file], + install=install_header, + install_dir=[kwargs['install_dir']] if kwargs['install_dir'] else [], + capture=capture, + depend_files=kwargs['depend_files'], + ) rv = [body, header] return ModuleReturnValue(rv, rv) @@ -2021,24 +2059,25 @@ class GnomeModule(ExtensionModule): cmd.append(gir_file) vapi_output = library + '.vapi' - custom_kwargs = { - 'command': cmd, - 'input': inputs, - 'output': vapi_output, - 'depends': vapi_depends, - } datadir = state.environment.coredata.get_option(mesonlib.OptionKey('datadir')) assert isinstance(datadir, str), 'for mypy' install_dir = kwargs['install_dir'] or os.path.join(datadir, 'vala', 'vapi') - custom_kwargs['install'] = kwargs['install'] - custom_kwargs['install_dir'] = install_dir - custom_kwargs['packages'] = packages if kwargs['install']: # We shouldn't need this locally but we install it deps_target = self._generate_deps(state, library, vapi_packages, install_dir) created_values.append(deps_target) - vapi_target = VapiTarget(vapi_output, state.subdir, state.subproject, custom_kwargs) + vapi_target = VapiTarget( + vapi_output, + state.subdir, + state.subproject, + command=cmd, + sources=inputs, + outputs=[vapi_output], + extra_depends=vapi_depends, + install=kwargs['install'], + install_dir=[install_dir], + ) # So to try our best to get this to just work we need: # - link with with the correct library |