diff --git a/.gitignore b/.gitignore
index 01566ea..870cec0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/meson-0.58.2.tar.gz
+SOURCES/meson-0.63.3.tar.gz
diff --git a/.meson.metadata b/.meson.metadata
index 5fa6c73..58d726a 100644
--- a/.meson.metadata
+++ b/.meson.metadata
@@ -1 +1 @@
-4058a574a8a1335102b24981d049fd82ccdb4150 SOURCES/meson-0.58.2.tar.gz
+3bce963302f547547c82fda35f84838ebc608e8a SOURCES/meson-0.63.3.tar.gz
diff --git a/SOURCES/0001-accept-positional-arguments-for-python.dependency.patch b/SOURCES/0001-accept-positional-arguments-for-python.dependency.patch
new file mode 100644
index 0000000..bf60c02
--- /dev/null
+++ b/SOURCES/0001-accept-positional-arguments-for-python.dependency.patch
@@ -0,0 +1,34 @@
+From a51e8ddfdc246dd3a03edb18712136c38829799f Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 2 Nov 2022 10:06:40 +0100
+Subject: [PATCH 1/9] accept positional arguments for python.dependency
+Content-Type: text/plain
+
+Partial revert of upstream commit 1f7ab2f0100.
+
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+---
+ mesonbuild/modules/python.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
+index 6728cd401..39967cbae 100644
+--- a/mesonbuild/modules/python.py
++++ b/mesonbuild/modules/python.py
+@@ -576,8 +576,12 @@ class PythonInstallation(ExternalProgramHolder):
+     @disablerIfNotFound
+     @permittedKwargs(permitted_dependency_kwargs | {'embed'})
+     @FeatureNewKwargs('python_installation.dependency', '0.53.0', ['embed'])
+-    @noPosargs
+     def dependency_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> 'Dependency':
++        if args:
++            mlog.warning('python_installation.dependency() does not take any '
++                         'positional arguments. It always returns a Python '
++                         'dependency. This will become an error in the future.',
++                         location=self.interpreter.current_node)
+         disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
+         if disabled:
+             mlog.log('Dependency', mlog.bold('python'), 'skipped: feature', mlog.bold(feature), 'disabled')
+-- 
+2.38.1
+
diff --git a/SOURCES/0002-Revert-decorators-Make-unknown-kwarg-fatal.patch b/SOURCES/0002-Revert-decorators-Make-unknown-kwarg-fatal.patch
new file mode 100644
index 0000000..fd5984e
--- /dev/null
+++ b/SOURCES/0002-Revert-decorators-Make-unknown-kwarg-fatal.patch
@@ -0,0 +1,114 @@
+From cb683b38e0252d545650d55424ba4f7077c5b813 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 2 Nov 2022 10:07:17 +0100
+Subject: [PATCH 2/9] Revert "decorators: Make unknown kwarg fatal"
+Content-Type: text/plain
+
+This reverts commit 88a1bed81b7d9ad262d3b511eb20444c609db235.
+---
+ mesonbuild/interpreterbase/decorators.py         | 16 ++++++++++------
+ .../common/129 build by default/meson.build      |  1 +
+ test cases/frameworks/7 gnome/gir/meson.build    |  4 ++++
+ test cases/unit/22 warning location/meson.build  |  2 +-
+ unittests/allplatformstests.py                   |  6 +++---
+ 5 files changed, 19 insertions(+), 10 deletions(-)
+
+diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py
+index 5dd8b8982..41c959a63 100644
+--- a/mesonbuild/interpreterbase/decorators.py
++++ b/mesonbuild/interpreterbase/decorators.py
+@@ -119,11 +119,11 @@ class permittedKwargs:
+     def __call__(self, f: TV_func) -> TV_func:
+         @wraps(f)
+         def wrapped(*wrapped_args: T.Any, **wrapped_kwargs: T.Any) -> T.Any:
+-            kwargs = get_callee_args(wrapped_args)[2]
+-            unknowns = set(kwargs).difference(self.permitted)
+-            if unknowns:
+-                ustr = ', '.join([f'"{u}"' for u in sorted(unknowns)])
+-                raise InvalidArguments(f'Got unknown keyword arguments {ustr}')
++            node, args, kwargs, _ = get_callee_args(wrapped_args)
++            for k in kwargs:
++                if k not in self.permitted:
++                    mlog.warning(f'''Passed invalid keyword argument "{k}".''', location=node)
++                    mlog.warning('This will become a hard error in the future.')
+             return f(*wrapped_args, **wrapped_kwargs)
+         return T.cast('TV_func', wrapped)
+ 
+@@ -532,8 +532,12 @@ def typed_kwargs(name: str, *types: KwargInfo) -> T.Callable[..., T.Any]:
+             all_names = {t.name for t in types}
+             unknowns = set(kwargs).difference(all_names)
+             if unknowns:
++                # Warn about unknown argumnts, delete them and continue. This
++                # keeps current behavior
+                 ustr = ', '.join([f'"{u}"' for u in sorted(unknowns)])
+-                raise InvalidArguments(f'{name} got unknown keyword arguments {ustr}')
++                mlog.warning(f'{name} got unknown keyword arguments {ustr}')
++                for u in unknowns:
++                    del kwargs[u]
+ 
+             for info in types:
+                 types_tuple = info.types if isinstance(info.types, tuple) else (info.types,)
+diff --git a/test cases/common/129 build by default/meson.build b/test cases/common/129 build by default/meson.build
+index b797f76e9..b28b6347c 100644
+--- a/test cases/common/129 build by default/meson.build	
++++ b/test cases/common/129 build by default/meson.build	
+@@ -9,6 +9,7 @@ executable('fooprog', 'foo.c',
+ 
+ executable('barprog', 'foo.c',
+     build_by_default : false,
++    build_always : true,
+ )
+ 
+ comp = files('mygen.py')
+diff --git a/test cases/frameworks/7 gnome/gir/meson.build b/test cases/frameworks/7 gnome/gir/meson.build
+index fbff2060e..64c49f729 100644
+--- a/test cases/frameworks/7 gnome/gir/meson.build	
++++ b/test cases/frameworks/7 gnome/gir/meson.build	
+@@ -46,6 +46,10 @@ gnome.generate_gir(
+   dependencies : [[fake_dep, dep1_dep]],
+   install : true,
+   build_by_default : true,
++  # Test that unknown kwargs do not crash the parser.
++  # Unknown kwargs will eventually become a hard error.
++  # Once that happens remove this.
++  unknown_kwarg : true,
+ )
+ 
+ test('gobject introspection/c', girexe)
+diff --git a/test cases/unit/22 warning location/meson.build b/test cases/unit/22 warning location/meson.build
+index 132939e04..52a93d18c 100644
+--- a/test cases/unit/22 warning location/meson.build	
++++ b/test cases/unit/22 warning location/meson.build	
+@@ -1,4 +1,4 @@
+-project('warning location', 'c')
++project('warning location', 'c', invalid: 'cheese')
+ a = library('liba', 'a.c')
+ b = library('libb', 'b.c')
+ executable('main', 'main.c', link_with: a, link_with: b)
+diff --git a/unittests/allplatformstests.py b/unittests/allplatformstests.py
+index 0b968e7cf..6ba95b652 100644
+--- a/unittests/allplatformstests.py
++++ b/unittests/allplatformstests.py
+@@ -1931,6 +1931,7 @@ class AllPlatformTests(BasePlatformTests):
+             r'sub' + os.path.sep + r'meson.build:4: WARNING: subdir warning',
+             r'meson.build:7: WARNING: Module unstable-simd has no backwards or forwards compatibility and might not exist in future releases.',
+             r"meson.build:11: WARNING: The variable(s) 'MISSING' in the input file 'conf.in' are not present in the given configuration data.",
++            r'meson.build:1: WARNING: Passed invalid keyword argument "invalid".',
+         ]:
+             self.assertRegex(out, re.escape(expected))
+ 
+@@ -1980,9 +1981,8 @@ class AllPlatformTests(BasePlatformTests):
+ 
+     def test_permitted_method_kwargs(self):
+         tdir = os.path.join(self.unit_test_dir, '25 non-permitted kwargs')
+-        with self.assertRaises(subprocess.CalledProcessError) as cm:
+-            self.init(tdir)
+-        self.assertIn('ERROR: compiler.has_header_symbol got unknown keyword arguments "prefixxx"', cm.exception.output)
++        out = self.init(tdir, allow_fail=True)
++        self.assertIn('Function does not take keyword arguments.', out)
+ 
+     def test_templates(self):
+         ninja = mesonbuild.environment.detect_ninja()
+-- 
+2.38.1
+
diff --git a/SOURCES/0003-Revert-coredata-throw-a-MesonException-on-unknown-op.patch b/SOURCES/0003-Revert-coredata-throw-a-MesonException-on-unknown-op.patch
new file mode 100644
index 0000000..9f186b7
--- /dev/null
+++ b/SOURCES/0003-Revert-coredata-throw-a-MesonException-on-unknown-op.patch
@@ -0,0 +1,71 @@
+From b705e45c48b79348bbb70fddc06b408a19ecedc7 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 2 Nov 2022 10:08:52 +0100
+Subject: [PATCH 3/9] Revert "coredata: throw a MesonException on unknown
+ options"
+Content-Type: text/plain
+
+This reverts commit dbf2ace6ca1ce39aa01497f815b65856079cc581.
+---
+ mesonbuild/coredata.py         | 15 ++++++++-------
+ unittests/allplatformstests.py |  8 +++-----
+ 2 files changed, 11 insertions(+), 12 deletions(-)
+
+diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
+index f34694281..b274a5777 100644
+--- a/mesonbuild/coredata.py
++++ b/mesonbuild/coredata.py
+@@ -803,7 +803,7 @@ class CoreData:
+                 except KeyError:
+                     continue
+ 
+-    def set_options(self, options: T.Dict[OptionKey, T.Any], subproject: str = '') -> None:
++    def set_options(self, options: T.Dict[OptionKey, T.Any], subproject: str = '', warn_unknown: bool = True) -> None:
+         if not self.is_cross_build():
+             options = {k: v for k, v in options.items() if k.machine is not MachineChoice.BUILD}
+         # Set prefix first because it's needed to sanitize other options
+@@ -819,15 +819,16 @@ class CoreData:
+         for k, v in options.items():
+             if k == pfk:
+                 continue
+-            elif k in self.options:
+-                self.set_option(k, v)
+-            elif k.machine != MachineChoice.BUILD:
++            elif k not in self.options:
+                 unknown_options.append(k)
+-        if unknown_options:
++            else:
++                self.set_option(k, v)
++        if unknown_options and warn_unknown:
+             unknown_options_str = ', '.join(sorted(str(s) for s in unknown_options))
+             sub = f'In subproject {subproject}: ' if subproject else ''
+-            raise MesonException(f'{sub}Unknown options: "{unknown_options_str}"')
+-
++            mlog.warning(f'{sub}Unknown options: "{unknown_options_str}"')
++            mlog.log('The value of new options can be set with:')
++            mlog.log(mlog.bold('meson setup <builddir> --reconfigure -Dnew_option=new_value ...'))
+         if not self.is_cross_build():
+             self.copy_build_options_from_regular_ones()
+ 
+diff --git a/unittests/allplatformstests.py b/unittests/allplatformstests.py
+index 6ba95b652..f848cc547 100644
+--- a/unittests/allplatformstests.py
++++ b/unittests/allplatformstests.py
+@@ -2297,11 +2297,9 @@ class AllPlatformTests(BasePlatformTests):
+             self.assertEqual(obj.options[OptionKey('default_library')].value, 'shared')
+         self.wipe()
+ 
+-        # Should fail on unknown options
+-        with self.assertRaises((subprocess.CalledProcessError, RuntimeError)) as cm:
+-            self.init(testdir, extra_args=['-Dbad=1', '-Dfoo=2', '-Dwrong_link_args=foo'])
+-            self.assertNotEqual(0, cm.exception.returncode)
+-            self.assertIn(msg, cm.exception.output)
++        # Should warn on unknown options
++        out = self.init(testdir, extra_args=['-Dbad=1', '-Dfoo=2', '-Dwrong_link_args=foo'])
++        self.assertIn('Unknown options: "bad, foo, wrong_link_args"', out)
+         self.wipe()
+ 
+         # Should fail on malformed option
+-- 
+2.38.1
+
diff --git a/SOURCES/0004-warn-on-equality-inequality-with-different-types.patch b/SOURCES/0004-warn-on-equality-inequality-with-different-types.patch
new file mode 100644
index 0000000..6467508
--- /dev/null
+++ b/SOURCES/0004-warn-on-equality-inequality-with-different-types.patch
@@ -0,0 +1,79 @@
+From 4e6fe24a702b58117e282cf8c9eb612d4e85cd83 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 2 Nov 2022 10:24:39 +0100
+Subject: [PATCH 4/9] warn on equality/inequality with different types
+Content-Type: text/plain
+
+---
+ mesonbuild/interpreterbase/baseobjects.py | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+diff --git a/mesonbuild/interpreterbase/baseobjects.py b/mesonbuild/interpreterbase/baseobjects.py
+index a65b0536d..67f294387 100644
+--- a/mesonbuild/interpreterbase/baseobjects.py
++++ b/mesonbuild/interpreterbase/baseobjects.py
+@@ -12,7 +12,7 @@
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ 
+-from .. import mparser
++from .. import mparser, mlog
+ from .exceptions import InvalidCode, InvalidArguments
+ from .helpers import flatten, resolve_second_level_holders
+ from .operator import MesonOperator
+@@ -98,6 +98,9 @@ class InterpreterObject:
+             if op[0] is None and other is not None:
+                 raise MesonBugException(f'The unary operator `{operator.value}` of {self.display_name()} was passed the object {other} of type {type(other).__name__}')
+             if op[0] is not None and not isinstance(other, op[0]):
++                if operator in (MesonOperator.EQUALS, MesonOperator.NOT_EQUALS):
++                    mlog.warning(f'Trying to compare values of different types ({self.display_name()}, {type(other).__name__})')
++                    return operator == MesonOperator.NOT_EQUALS
+                 raise InvalidArguments(f'The `{operator.value}` operator of {self.display_name()} does not accept objects of type {type(other).__name__} ({other})')
+             return op[1](other)
+         if operator in self.operators:
+@@ -106,12 +109,8 @@ class InterpreterObject:
+ 
+     # Default comparison operator support
+     def _throw_comp_exception(self, other: TYPE_var, opt_type: str) -> T.NoReturn:
+-        raise InvalidArguments(textwrap.dedent(
+-            f'''
+-                Trying to compare values of different types ({self.display_name()}, {type(other).__name__}) using {opt_type}.
+-                This was deprecated and undefined behavior previously and is as of 0.60.0 a hard error.
+-            '''
+-        ))
++        mlog.warning(
++                'Trying to compare values of different types ({self.display_name()}, {type(other).__name__}) using {opt_type}.')
+ 
+     def op_equals(self, other: TYPE_var) -> bool:
+         # We use `type(...) == type(...)` here to enforce an *exact* match for comparison. We
+@@ -119,11 +118,12 @@ class InterpreterObject:
+         # would pass because this comparison must never be true: `derived_obj == base_obj`
+         if type(self) != type(other):
+             self._throw_comp_exception(other, '==')
++            return False
+         return self == other
+ 
+     def op_not_equals(self, other: TYPE_var) -> bool:
+         if type(self) != type(other):
+-            self._throw_comp_exception(other, '!=')
++            return True
+         return self != other
+ 
+ class MesonInterpreterObject(InterpreterObject):
+@@ -157,11 +157,13 @@ class ObjectHolder(InterpreterObject, T.Generic[InterpreterObjectTypeVar]):
+         # See the comment from InterpreterObject why we are using `type()` here.
+         if type(self.held_object) != type(other):
+             self._throw_comp_exception(other, '==')
++            return False
+         return self.held_object == other
+ 
+     def op_not_equals(self, other: TYPE_var) -> bool:
+         if type(self.held_object) != type(other):
+             self._throw_comp_exception(other, '!=')
++            return True
+         return self.held_object != other
+ 
+     def __repr__(self) -> str:
+-- 
+2.38.1
+
diff --git a/SOURCES/0005-accept-positional-arguments-for-i18n.merge_file.patch b/SOURCES/0005-accept-positional-arguments-for-i18n.merge_file.patch
new file mode 100644
index 0000000..d8a4589
--- /dev/null
+++ b/SOURCES/0005-accept-positional-arguments-for-i18n.merge_file.patch
@@ -0,0 +1,39 @@
+From 1e50e285732925c417377cb78e53d075f134ca70 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 2 Nov 2022 10:06:40 +0100
+Subject: [PATCH 5/9] accept positional arguments for i18n.merge_file
+Content-Type: text/plain
+
+Partial revert of upstream commit 61f2866a9f with a warning added.
+
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+---
+ mesonbuild/modules/i18n.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/mesonbuild/modules/i18n.py b/mesonbuild/modules/i18n.py
+index 524a33110..f8d92d211 100644
+--- a/mesonbuild/modules/i18n.py
++++ b/mesonbuild/modules/i18n.py
+@@ -146,7 +146,6 @@ class I18nModule(ExtensionModule):
+         return [path.join(src_dir, d) for d in dirs]
+ 
+     @FeatureNew('i18n.merge_file', '0.37.0')
+-    @noPosargs
+     @typed_kwargs(
+         'i18n.merge_file',
+         CT_BUILD_BY_DEFAULT,
+@@ -161,6 +160,10 @@ class I18nModule(ExtensionModule):
+         KwargInfo('type', str, default='xml', validator=in_set_validator({'xml', 'desktop'})),
+     )
+     def merge_file(self, state: 'ModuleState', args: T.List['TYPE_var'], kwargs: 'MergeFile') -> ModuleReturnValue:
++        if args:
++            mlog.warning('i18n.merge_file() does not take any '
++                         'positional arguments. This will become an error in the future.',
++                         location=self.interpreter.current_node)
+         if self.tools['msgfmt'] is None or not self.tools['msgfmt'].found():
+             self.tools['msgfmt'] = state.find_program('msgfmt', for_machine=mesonlib.MachineChoice.BUILD)
+         podir = path.join(state.build_to_src, state.subdir, kwargs['po_dir'])
+-- 
+2.38.1
+
diff --git a/SOURCES/0006-gnome-allow-custom-targets-as-gdbus-codegen-inputs.patch b/SOURCES/0006-gnome-allow-custom-targets-as-gdbus-codegen-inputs.patch
new file mode 100644
index 0000000..4976dad
--- /dev/null
+++ b/SOURCES/0006-gnome-allow-custom-targets-as-gdbus-codegen-inputs.patch
@@ -0,0 +1,144 @@
+From e03c6d8be0e07dc0a5295867acd3bcde8852d5ba Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 5 Oct 2022 16:40:09 +0200
+Subject: [PATCH 6/9] gnome: allow custom targets as gdbus-codegen inputs
+Content-Type: text/plain
+
+Custom targets as sources to `gnome.gdbus_codegen` worked until version 0.60
+of Meson, but broke in 0.61 because of the conversion to typed_pos_args
+and typed_kwargs.  Reinstate this by adding custom targets to the
+decorators and annotations.
+
+While generators also used to work, they are a bit tricky because
+gdbus_codegen desugars to two custom_targets and therefore the generator
+is invoked twice.  This should not be a problem, but be explicit and
+leave that to a separate commit to highlight the problem.
+
+Fixes: 53a187ba2 ("modules/gnome: use typed_pos_args for gdbus_codegen", 2021-11-01)
+Fixes: ef52e6093 ("modules/gnome: use typed_kwargs for gdbus_codegen", 2021-11-08)
+---
+ mesonbuild/modules/gnome.py                   |  8 +++----
+ test cases/frameworks/7 gnome/copyfile.py     |  6 ++++++
+ .../frameworks/7 gnome/gdbus/meson.build      | 21 +++++++++++++++++++
+ test cases/frameworks/7 gnome/meson.build     |  2 ++
+ .../frameworks/7 gnome/resources/copyfile.py  |  6 ------
+ .../frameworks/7 gnome/resources/meson.build  |  2 --
+ 6 files changed, 33 insertions(+), 12 deletions(-)
+ create mode 100644 test cases/frameworks/7 gnome/copyfile.py
+ delete mode 100644 test cases/frameworks/7 gnome/resources/copyfile.py
+
+diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
+index 25cea6938..00feba45c 100644
+--- a/mesonbuild/modules/gnome.py
++++ b/mesonbuild/modules/gnome.py
+@@ -1556,11 +1556,11 @@ 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])
+ 
+-    @typed_pos_args('gnome.gdbus_codegen', str, optargs=[(str, mesonlib.File)])
++    @typed_pos_args('gnome.gdbus_codegen', str, optargs=[(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex)])
+     @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('sources', ContainerTypeInfo(list, (str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex)), 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)),
+@@ -1578,10 +1578,10 @@ class GnomeModule(ExtensionModule):
+             validator=in_set_validator({'all', 'none', 'objects'})),
+         INSTALL_DIR_KW.evolve(since='0.46.0')
+     )
+-    def gdbus_codegen(self, state: 'ModuleState', args: T.Tuple[str, T.Optional['FileOrString']],
++    def gdbus_codegen(self, state: 'ModuleState', args: T.Tuple[str, T.Optional[T.Union['FileOrString', 'build.GeneratedTypes']]],
+                       kwargs: 'GdbusCodegen') -> ModuleReturnValue:
+         namebase = args[0]
+-        xml_files: T.List['FileOrString'] = [args[1]] if args[1] else []
++        xml_files: T.List[T.Union['FileOrString', 'build.GeneratedTypes']] = [args[1]] if args[1] else []
+         cmd: T.List[T.Union['ExternalProgram', str]] = [state.find_program('gdbus-codegen')]
+         cmd.extend(kwargs['extra_args'])
+ 
+diff --git a/test cases/frameworks/7 gnome/copyfile.py b/test cases/frameworks/7 gnome/copyfile.py
+new file mode 100644
+index 000000000..7e44c48dd
+--- /dev/null
++++ b/test cases/frameworks/7 gnome/copyfile.py	
+@@ -0,0 +1,6 @@
++#!/usr/bin/env python3
++
++import sys
++import shutil
++
++shutil.copy(sys.argv[1], sys.argv[2])
+diff --git a/test cases/frameworks/7 gnome/gdbus/meson.build b/test cases/frameworks/7 gnome/gdbus/meson.build
+index 682abfffe..d749033e9 100644
+--- a/test cases/frameworks/7 gnome/gdbus/meson.build	
++++ b/test cases/frameworks/7 gnome/gdbus/meson.build	
+@@ -58,6 +58,27 @@ else
+   includes = include_directories('..')
+ endif
+ 
++# check that custom targets work
++gdbus_xml_ct = custom_target('built xml sources for gdbus',
++  output: 'com.example.SampleCustomTarget.xml',
++  input: 'data/com.example.Sample.xml',
++  command : [copyfile, '@INPUT@', '@OUTPUT@'])
++
++gdbus_src_ct = gnome.gdbus_codegen(
++  'generated-gdbus-customtarget-src',
++  gdbus_xml_ct,
++  interface_prefix : 'com.example.',
++  namespace : 'Sample',
++  annotations : [],
++)
++gdbus_src_cti = gnome.gdbus_codegen(
++  'generated-gdbus-customtargetindex-src',
++  gdbus_xml_ct[0],
++  interface_prefix : 'com.example.',
++  namespace : 'Sample',
++  annotations : [],
++)
++
+ gdbus_exe = executable('gdbus-test', 'gdbusprog.c',
+   gdbus_src,
+   include_directories : includes,
+diff --git a/test cases/frameworks/7 gnome/meson.build b/test cases/frameworks/7 gnome/meson.build
+index 9f8640609..920bc6a82 100644
+--- a/test cases/frameworks/7 gnome/meson.build	
++++ b/test cases/frameworks/7 gnome/meson.build	
+@@ -1,5 +1,7 @@
+ project('gobject-introspection', 'c')
+ 
++copyfile = find_program('copyfile.py')
++
+ glib = dependency('glib-2.0', required: false)
+ if not glib.found()
+   error('MESON_SKIP_TEST glib not found.')
+diff --git a/test cases/frameworks/7 gnome/resources/copyfile.py b/test cases/frameworks/7 gnome/resources/copyfile.py
+deleted file mode 100644
+index 7e44c48dd..000000000
+--- a/test cases/frameworks/7 gnome/resources/copyfile.py	
++++ /dev/null
+@@ -1,6 +0,0 @@
+-#!/usr/bin/env python3
+-
+-import sys
+-import shutil
+-
+-shutil.copy(sys.argv[1], sys.argv[2])
+diff --git a/test cases/frameworks/7 gnome/resources/meson.build b/test cases/frameworks/7 gnome/resources/meson.build
+index 180b33851..60fc8481e 100644
+--- a/test cases/frameworks/7 gnome/resources/meson.build	
++++ b/test cases/frameworks/7 gnome/resources/meson.build	
+@@ -1,8 +1,6 @@
+ # There are two tests here, because the 2nd one depends on a version of
+ # GLib (2.51.1) that is very recent at the time of writing.
+ 
+-copyfile = find_program('copyfile.py')
+-
+ simple_gresource = configure_file(
+   input : 'simple.gresource.xml',
+   output : 'simple-gen.gresource.xml',
+-- 
+2.38.1
+
diff --git a/SOURCES/0007-gnome-allow-generator-outputs-as-gdbus-codegen-input.patch b/SOURCES/0007-gnome-allow-generator-outputs-as-gdbus-codegen-input.patch
new file mode 100644
index 0000000..11e6882
--- /dev/null
+++ b/SOURCES/0007-gnome-allow-generator-outputs-as-gdbus-codegen-input.patch
@@ -0,0 +1,86 @@
+From 84b2ea237d30a1c93f179d0bc44731ae7962910e Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Wed, 5 Oct 2022 16:40:48 +0200
+Subject: [PATCH 7/9] gnome: allow generator outputs as gdbus-codegen inputs
+Content-Type: text/plain
+
+GeneratedLists as sources to `gnome.gdbus_codegen` worked until
+version 0.60 of Meson, but broke in 0.61 because of the conversion to
+typed_pos_args and typed_kwargs.  Reinstate this by adding them to the
+decorators and annotations.
+
+Note that gdbus_codegen desugars to two custom_targets and therefore the
+generator is invoked twice.  This is not optimal, but it should not be
+an issue and can be changed later.
+
+Fixes: 53a187ba2 ("modules/gnome: use typed_pos_args for gdbus_codegen", 2021-11-01)
+Fixes: ef52e6093 ("modules/gnome: use typed_kwargs for gdbus_codegen", 2021-11-08)
+---
+ mesonbuild/modules/gnome.py                     | 6 +++---
+ test cases/frameworks/7 gnome/gdbus/meson.build | 8 ++++++++
+ test cases/frameworks/7 gnome/meson.build       | 3 +++
+ 3 files changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
+index 00feba45c..d8669bb48 100644
+--- a/mesonbuild/modules/gnome.py
++++ b/mesonbuild/modules/gnome.py
+@@ -32,7 +32,7 @@ from .. import mesonlib
+ from .. import mlog
+ from ..build import CustomTarget, CustomTargetIndex, Executable, GeneratedList, InvalidArguments
+ from ..dependencies import Dependency, PkgConfigDependency, InternalDependency
+-from ..interpreter.type_checking import DEPENDS_KW, DEPEND_FILES_KW, INSTALL_DIR_KW, INSTALL_KW, NoneType, in_set_validator
++from ..interpreter.type_checking import DEPENDS_KW, DEPEND_FILES_KW, INSTALL_DIR_KW, INSTALL_KW, NoneType, SOURCES_KW, in_set_validator
+ from ..interpreterbase import noPosargs, noKwargs, FeatureNew, FeatureDeprecated
+ from ..interpreterbase import typed_kwargs, KwargInfo, ContainerTypeInfo
+ from ..interpreterbase.decorators import typed_pos_args
+@@ -1556,11 +1556,11 @@ 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])
+ 
+-    @typed_pos_args('gnome.gdbus_codegen', str, optargs=[(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex)])
++    @typed_pos_args('gnome.gdbus_codegen', str, optargs=[(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)])
+     @typed_kwargs(
+         'gnome.gdbus_codegen',
+         _BUILD_BY_DEFAULT.evolve(since='0.40.0'),
+-        KwargInfo('sources', ContainerTypeInfo(list, (str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex)), since='0.46.0', default=[], listify=True),
++        SOURCES_KW.evolve(since='0.46.0'),
+         KwargInfo('extra_args', ContainerTypeInfo(list, str), since='0.47.0', default=[], listify=True),
+         KwargInfo('interface_prefix', (str, NoneType)),
+         KwargInfo('namespace', (str, NoneType)),
+diff --git a/test cases/frameworks/7 gnome/gdbus/meson.build b/test cases/frameworks/7 gnome/gdbus/meson.build
+index d749033e9..fdb3896ca 100644
+--- a/test cases/frameworks/7 gnome/gdbus/meson.build	
++++ b/test cases/frameworks/7 gnome/gdbus/meson.build	
+@@ -79,6 +79,14 @@ gdbus_src_cti = gnome.gdbus_codegen(
+   annotations : [],
+ )
+ 
++gdbus_src_gen = gnome.gdbus_codegen(
++  'generated-gdbus-generator-src',
++  copyfile_gen.process('data/com.example.Sample.xml'),
++  interface_prefix : 'com.example.',
++  namespace : 'Sample',
++  annotations : [],
++)
++
+ gdbus_exe = executable('gdbus-test', 'gdbusprog.c',
+   gdbus_src,
+   include_directories : includes,
+diff --git a/test cases/frameworks/7 gnome/meson.build b/test cases/frameworks/7 gnome/meson.build
+index 920bc6a82..5f438cb67 100644
+--- a/test cases/frameworks/7 gnome/meson.build	
++++ b/test cases/frameworks/7 gnome/meson.build	
+@@ -1,6 +1,9 @@
+ project('gobject-introspection', 'c')
+ 
+ copyfile = find_program('copyfile.py')
++copyfile_gen = generator(copyfile,
++  output: '@BASENAME@Gen.xml',
++  arguments : ['@INPUT@', '@OUTPUT@'])
+ 
+ glib = dependency('glib-2.0', required: false)
+ if not glib.found()
+-- 
+2.38.1
+
diff --git a/SOURCES/0008-Revert-use-shared-implementation-to-convert-files-st.patch b/SOURCES/0008-Revert-use-shared-implementation-to-convert-files-st.patch
new file mode 100644
index 0000000..d65c25c
--- /dev/null
+++ b/SOURCES/0008-Revert-use-shared-implementation-to-convert-files-st.patch
@@ -0,0 +1,29 @@
+From 783c55103daac6240dd4117a14873df0ac038cf6 Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Thu, 3 Nov 2022 12:13:10 +0100
+Subject: [PATCH 8/9] Revert "use shared implementation to convert files()
+ strings to File objects"
+Content-Type: text/plain
+
+This reverts commit e6e8159980e9a4c816223fcdac8c729d104c0c02.
+It causes a failure to build gtk-vnc.
+---
+ mesonbuild/interpreter/interpreter.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
+index b52a55890..caf28f8bd 100644
+--- a/mesonbuild/interpreter/interpreter.py
++++ b/mesonbuild/interpreter/interpreter.py
+@@ -645,7 +645,7 @@ class Interpreter(InterpreterBase, HoldableObject):
+     @typed_pos_args('files', varargs=str)
+     @noKwargs
+     def func_files(self, node: mparser.FunctionNode, args: T.Tuple[T.List[str]], kwargs: 'TYPE_kwargs') -> T.List[mesonlib.File]:
+-        return self.source_strings_to_files(args[0])
++        return [mesonlib.File.from_source_file(self.environment.source_dir, self.subdir, fname) for fname in args[0]]
+ 
+     # Used by pkgconfig.generate()
+     def extract_variables(self, kwargs: T.Dict[str, T.Union[T.Dict[str, str], T.List[str], str]],
+-- 
+2.38.1
+
diff --git a/SOURCES/0009-gnome-allow-duplicated-languages-for-gnome.yelp.patch b/SOURCES/0009-gnome-allow-duplicated-languages-for-gnome.yelp.patch
new file mode 100644
index 0000000..d314867
--- /dev/null
+++ b/SOURCES/0009-gnome-allow-duplicated-languages-for-gnome.yelp.patch
@@ -0,0 +1,33 @@
+From 8c0af255ff937329931372b33335ec580a8e9daa Mon Sep 17 00:00:00 2001
+From: Paolo Bonzini <pbonzini@redhat.com>
+Date: Thu, 3 Nov 2022 17:49:25 +0100
+Subject: [PATCH 9/9] gnome: allow duplicated languages for gnome.yelp
+Content-Type: text/plain
+
+This fixes building Glade 3.38.2.
+
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+---
+ mesonbuild/modules/gnome.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
+index d8669bb48..98ec8a5ca 100644
+--- a/mesonbuild/modules/gnome.py
++++ b/mesonbuild/modules/gnome.py
+@@ -1303,7 +1303,12 @@ class GnomeModule(ExtensionModule):
+                                     state.environment)
+         targets.append(pottarget)
+ 
++        langs_done = set()
+         for l in langs:
++            if l in langs_done:
++                mlog.warning(f'duplicate language "{l}" in LINGUAS file')
++                continue
++            langs_done.add(l)
+             l_subdir = os.path.join(state.subdir, l)
+             l_install_dir = os.path.join(install_dir, l, project_id)
+ 
+-- 
+2.38.1
+
diff --git a/SPECS/meson.spec b/SPECS/meson.spec
index d6e9f0f..dcb4223 100644
--- a/SPECS/meson.spec
+++ b/SPECS/meson.spec
@@ -6,7 +6,7 @@
 %bcond_with check
 
 Name:           meson
-Version:        0.58.2
+Version:        0.63.3
 Release:        1%{?dist}
 Summary:        High productivity build system
 
@@ -72,6 +72,58 @@ BuildRequires:  llvm-devel
 BuildRequires:  cups-devel
 %endif
 
+#########################################
+# Revert backwards incompatible changes #
+#########################################
+
+# The upstreaming plan is to turn these into non-fatal warning if
+# VER is old enough in project(..., version: 'VER').  These occur
+# dozens of times on a RHEL rebuild.
+
+# python_installation.dependency stopped taking positional arguments in 0.60.
+Patch0001: 0001-accept-positional-arguments-for-python.dependency.patch
+
+# Unknown keyword arguments started being rejected in 0.60.
+Patch0002: 0002-Revert-decorators-Make-unknown-kwarg-fatal.patch
+
+# Unknown options are being rejected by get_option() in 0.60.
+Patch0003: 0003-Revert-coredata-throw-a-MesonException-on-unknown-op.patch
+
+# Trying to compare values of different types is an error in 0.60
+# (found with gnome-settings-daemon)
+Patch0004: 0004-warn-on-equality-inequality-with-different-types.patch
+
+# i18n.merge_file stopped taking positional arguments in 0.60.
+Patch0005: 0005-accept-positional-arguments-for-i18n.merge_file.patch
+
+############################
+# Already upstream in 0.64 #
+############################
+
+# fix for fprintd, https://github.com/mesonbuild/meson/pull/10895
+Patch0006: 0006-gnome-allow-custom-targets-as-gdbus-codegen-inputs.patch
+Patch0007: 0007-gnome-allow-generator-outputs-as-gdbus-codegen-input.patch
+
+##################################################
+# More reverts of backwards incompatible changes #
+##################################################
+
+# These are unlikely to be accepted upstream and they only affect two
+# packages, so we may consider fixing gtk-vnc and glade as well.
+
+# Fix for gtk-vnc sandbox violations; the fix requires 0.63 and 0.63
+# breaks old versions, so revert at least for now to avoid a lockstep
+# update.  The gtk-vnc fixes are
+#    https://gitlab.com/keycodemap/keycodemapdb/-/commit/e15649b83a78f89f57205927022115536d2c1698
+#    https://gitlab.gnome.org/GNOME/gtk-vnc/-/commit/8da5e173ebdccbca60387ef2347c629be3c78dff
+Patch0008: 0008-Revert-use-shared-implementation-to-convert-files-st.patch
+
+# Just a duplicated line in glade's help/LINGUAS file, but easy to
+# workaround in meson.  I will nevertheless try to upstream it.
+# The glade fix is
+#    https://gitlab.gnome.org/GNOME/glade/-/commit/efdd5338b034a11c5d617684d92d11edc600965e
+Patch0009: 0009-gnome-allow-duplicated-languages-for-gnome.yelp.patch
+
 %description
 Meson is a build system designed to optimize programmer
 productivity. It aims to do this by providing simple, out-of-the-box
@@ -112,6 +164,9 @@ export MESON_PRINT_TEST_OUTPUT=1
 %{_datadir}/polkit-1/actions/com.mesonbuild.install.policy
 
 %changelog
+* Wed Nov 2 2022 Paolo Bonzini <pbonzini@redhat.com> - 0.63.3-1
+- Update to 0.63.3
+
 * Fri Sep 24 2021 Eduardo Lima (Etrunko) <etrunko@redhat.com> - 0.58.2-1
 - Update to 0.58.2
   Resolves: rhbz#1997067