threads / patch / 63735

patch, 8 partsA handful of Meson cleanups and improvements

Subject: [PATCH 0/8] A handful of Meson cleanups and improvements

## tl;dr

46 messages between Jul 3, 2025 and Jul 10, 2025. Diffs are folded; open one to read it.

replies: 45people: 7as markdown or json

Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · lore
Hi,

this patch series contains a couple of more-or-less random cleanups and improvements for Meson that I have accumulated over the last two months.

Thanks!
Patrick
---
Patrick Steinhardt (8):
      meson: stop discovering native version of Python
      meson: stop printing 'https' option twice in our summaries
      meson: improve summary of auto-detected features
      meson: clean up unnecessary variables
      meson: fix lookup of shell on MINGW64
      meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=
      meson: update subproject wrappers
      ci: use Meson's new `--slice` option
 .github/workflows/main.yml |  2 +-
 .gitlab-ci.yml             |  2 +-
 Documentation/meson.build  |  5 ++---
 meson.build                | 26 ++++++++++++--------------
 subprojects/expat.wrap     | 18 +++++++++---------
 subprojects/pcre2.wrap     | 18 +++++++++---------
 6 files changed, 34 insertions(+), 37 deletions(-)

--- base-commit: 8b6f19ccfc3aefbd0f22f6b7d56ad6a3fc5e4f37 change-id: 20250703-b4-pks-meson-cleanups-f53858d694f3

Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 1/8] meson: stop discovering native version of Python

When Python features are enabled we search both for a native and non-native version of Python. This is wrong though: we don't use Python in our build process, so there is no need to search for it in the first place.

There is one location where we use the native version of Python, namely when deciding whether or not we want to wire up git-p4(1). This check is invalid though, as we shouldn't check for the build host to have Python, but for the target host.

Fix this invalid check to use the non-native version of Python and stop searching for a native version of Python altogether.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
Show changes to meson.build +4 −5
diff --git a/meson.build b/meson.build
index 7fea4a34d68..21fdff0f496 100644
--- a/meson.build
+++ b/meson.build
@@ -866,9 +866,8 @@ if host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
 endif
 build_options_config.set_quoted('X', executable_suffix)
 
-python = import('python').find_installation('python3', required: get_option('python'))
-target_python = find_program('python3', native: false, required: python.found())
-if python.found()
+target_python = find_program('python3', native: false, required: get_option('python'))
+if target_python.found()
   build_options_config.set('NO_PYTHON', '')
 else
   libgit_c_args += '-DNO_PYTHON'
@@ -1979,7 +1978,7 @@ if perl_features_enabled
   subdir('perl')
 endif
 
-if python.found()
+if target_python.found()
   scripts_python = [
     'git-p4.py'
   ]
@@ -2202,7 +2201,7 @@ summary({
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-  'python': python.found(),
+  'python': target_python.found(),
 }, section: 'Auto-detected features')
 
 summary({
-- 
2.50.0.195.g74e6fc65d0.dirty
Justin Tobler· Jul 8, 2025, 19:38 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 1/8] meson: stop discovering native version of Python

On 25/07/03 11:28AM, Patrick Steinhardt wrote:
Show 9 quoted lines
> When Python features are enabled we search both for a native and
> non-native version of Python. This is wrong though: we don't use Python
> in our build process, so there is no need to search for it in the first
> place.
> 
> There is one location where we use the native version of Python, namely
> when deciding whether or not we want to wire up git-p4(1). This check is
> invalid though, as we shouldn't check for the build host to have Python,
> but for the target host.

Ok, we are using the native python version, but we should really care wether the target host has python.

Show 21 quoted lines
> Fix this invalid check to use the non-native version of Python and stop
> searching for a native version of Python altogether.
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index 7fea4a34d68..21fdff0f496 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -866,9 +866,8 @@ if host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
>  endif
>  build_options_config.set_quoted('X', executable_suffix)
>  
> -python = import('python').find_installation('python3', required: get_option('python'))
> -target_python = find_program('python3', native: false, required: python.found())
> -if python.found()
> +target_python = find_program('python3', native: false, required: get_option('python'))
> +if target_python.found()

Ok, so here we are not actually using python to build, but instead need to know whether to include this build configuration which is dependent on the target host having python. Makes sense.

It might be nice to leave a comment here to explain this. The changes in this patch look good though.

Show 26 quoted lines
>    build_options_config.set('NO_PYTHON', '')
>  else
>    libgit_c_args += '-DNO_PYTHON'
> @@ -1979,7 +1978,7 @@ if perl_features_enabled
>    subdir('perl')
>  endif
>  
> -if python.found()
> +if target_python.found()
>    scripts_python = [
>      'git-p4.py'
>    ]
> @@ -2202,7 +2201,7 @@ summary({
>    'iconv': iconv.found(),
>    'pcre2': pcre2.found(),
>    'perl': perl_features_enabled,
> -  'python': python.found(),
> +  'python': target_python.found(),
>  }, section: 'Auto-detected features')
>  
>  summary({
> 
> -- 
> 2.50.0.195.g74e6fc65d0.dirty
> 
> 
Patrick Steinhardt· Jul 9, 2025, 06:16 UTC · re: Justin Tobler · lore

Re: [PATCH 1/8] meson: stop discovering native version of Python

On Tue, Jul 08, 2025 at 02:38:49PM -0500, Justin Tobler wrote:
Show 21 quoted lines
> On 25/07/03 11:28AM, Patrick Steinhardt wrote:
> > diff --git a/meson.build b/meson.build
> > index 7fea4a34d68..21fdff0f496 100644
> > --- a/meson.build
> > +++ b/meson.build
> > @@ -866,9 +866,8 @@ if host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
> >  endif
> >  build_options_config.set_quoted('X', executable_suffix)
> >  
> > -python = import('python').find_installation('python3', required: get_option('python'))
> > -target_python = find_program('python3', native: false, required: python.found())
> > -if python.found()
> > +target_python = find_program('python3', native: false, required: get_option('python'))
> > +if target_python.found()
> 
> Ok, so here we are not actually using python to build, but instead need
> to know whether to include this build configuration which is dependent
> on the target host having python. Makes sense.
> 
> It might be nice to leave a comment here to explain this. The changes in
> this patch look good though.
Makes sense, will do.
Patrick
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 2/8] meson: stop printing 'https' option twice in our summaries

The value for the 'https' backend option is printed twice: once via the summary of auto-detected features and once via our summary of backends. Drop it from the former summary.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 1 -
 1 file changed, 1 deletion(-)
Show changes to meson.build +0 −1
diff --git a/meson.build b/meson.build
index 21fdff0f496..4e41c3007bb 100644
--- a/meson.build
+++ b/meson.build
@@ -2197,7 +2197,6 @@ summary({
   'expat': expat.found(),
   'gettext': intl.found(),
   'gitweb': gitweb_option.allowed(),
-  'https': https_backend,
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 3/8] meson: improve summary of auto-detected features

The summary of auto-detected features prints a boolean for every option to tell the user whether or not the feature has been auto-enabled or not. This summary can be improved though, as in some cases this boolean is derived from a dependency. So if we pass in the dependency directly, then Meson knows to both print a boolean and, if the dependency was found, it also prints a version number.

Adapt the code accordingly and enable `bool_yn` so that actual booleans are formatted similarly to dependencies. Before this change:

  Auto-detected features
    benchmarks      : true
    curl            : true
    expat           : true
    gettext         : true
    gitweb          : true
    iconv           : true
    pcre2           : true
    perl            : true
    python          : true
And after this change, we now see the version numbers as expected:
  Auto-detected features
    benchmarks      : YES
    curl            : YES 8.14.1
    expat           : YES 2.7.1
    gettext         : YES
    gitweb          : YES
    iconv           : YES
    pcre2           : YES 10.44
    perl            : YES
    python          : YES

Note that this change also enables colorization of the boolean options, green for "YES" and red for "NO".

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
Show changes to meson.build +6 −6
diff --git a/meson.build b/meson.build
index 4e41c3007bb..4f22d72641e 100644
--- a/meson.build
+++ b/meson.build
@@ -2193,15 +2193,15 @@ meson.add_dist_script(
 
 summary({
   'benchmarks': get_option('tests') and perl.found() and time.found(),
-  'curl': curl.found(),
-  'expat': expat.found(),
-  'gettext': intl.found(),
+  'curl': curl,
+  'expat': expat,
+  'gettext': intl,
   'gitweb': gitweb_option.allowed(),
-  'iconv': iconv.found(),
-  'pcre2': pcre2.found(),
+  'iconv': iconv,
+  'pcre2': pcre2,
   'perl': perl_features_enabled,
   'python': target_python.found(),
-}, section: 'Auto-detected features')
+}, section: 'Auto-detected features', bool_yn: true)
 
 summary({
   'csprng': csprng_backend,
-- 
2.50.0.195.g74e6fc65d0.dirty
Justin Tobler· Jul 8, 2025, 19:56 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 3/8] meson: improve summary of auto-detected features

On 25/07/03 11:28AM, Patrick Steinhardt wrote:
Show 9 quoted lines
> The summary of auto-detected features prints a boolean for every option
> to tell the user whether or not the feature has been auto-enabled or
> not. This summary can be improved though, as in some cases this boolean
> is derived from a dependency. So if we pass in the dependency directly,
> then Meson knows to both print a boolean and, if the dependency was
> found, it also prints a version number.
> 
> Adapt the code accordingly and enable `bool_yn` so that actual booleans
> are formatted similarly to dependencies. Before this change:

Ok so without `bool_yn` enabled, only the dependencies listed directly would say YES/NO and not match the other entries.

Show 26 quoted lines
>   Auto-detected features
>     benchmarks      : true
>     curl            : true
>     expat           : true
>     gettext         : true
>     gitweb          : true
>     iconv           : true
>     pcre2           : true
>     perl            : true
>     python          : true
> 
> And after this change, we now see the version numbers as expected:
> 
>   Auto-detected features
>     benchmarks      : YES
>     curl            : YES 8.14.1
>     expat           : YES 2.7.1
>     gettext         : YES
>     gitweb          : YES
>     iconv           : YES
>     pcre2           : YES 10.44
>     perl            : YES
>     python          : YES
> 
> Note that this change also enables colorization of the boolean options,
> green for "YES" and red for "NO".

Ok, it looks like colorization it not an explicit option, but comes automatically with the `bool_yn` and dependency change. Nice.

Show 28 quoted lines
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/meson.build b/meson.build
> index 4e41c3007bb..4f22d72641e 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2193,15 +2193,15 @@ meson.add_dist_script(
>  
>  summary({
>    'benchmarks': get_option('tests') and perl.found() and time.found(),
> -  'curl': curl.found(),
> -  'expat': expat.found(),
> -  'gettext': intl.found(),
> +  'curl': curl,
> +  'expat': expat,
> +  'gettext': intl,
>    'gitweb': gitweb_option.allowed(),
> -  'iconv': iconv.found(),
> -  'pcre2': pcre2.found(),
> +  'iconv': iconv,
> +  'pcre2': pcre2,
>    'perl': perl_features_enabled,
>    'python': target_python.found(),
> -}, section: 'Auto-detected features')
> +}, section: 'Auto-detected features', bool_yn: true)
Looks good!
-Justin
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 4/8] meson: clean up unnecessary variables

The `manpage_target` variable isn't used at all, and the `manpage_path` variable is only used in a single location. Remove the former variable and inline the latter.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/meson.build | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
Show changes to Documentation/meson.build +2 −3
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 2fe1a1369d4..4404c623f00 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -375,8 +375,7 @@ foreach manpage, category : manpages
       output: fs.stem(manpage) + '.xml',
     )
 
-    manpage_path = fs.stem(manpage) + '.' + category.to_string()
-    manpage_target = custom_target(
+    custom_target(
       command: [
         xmlto,
         '-m', '@INPUT0@',
@@ -392,7 +391,7 @@ foreach manpage, category : manpages
         'manpage-normal.xsl',
         'manpage-bold-literal.xsl',
       ],
-      output: manpage_path,
+      output: fs.stem(manpage) + '.' + category.to_string(),
       install: true,
       install_dir: get_option('mandir') / 'man' + category.to_string(),
     )
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 5/8] meson: fix lookup of shell on MINGW64

In 4cba20fbdc6 (meson: prefer shell at "/bin/sh", 2025-04-25) we have addressed an issue where the shell path embedded into Git was looked up via PATH, which easily led to unportable shell paths other than the usual "/bin/sh" location. The fix was to simply add '/bin' to the search path explicitly, which made us prefer that directory over the PATH-based lookup.

This fix causes issues on MINGW64 though, which uses Windows-style paths. "/bin" is not an absolute Windows-style path, but Meson expects the directories to be absolute. This leads to the following error:

    meson.build:248:15: ERROR: Search directory /bin is not an absolute path.

Fix this by instead searching for both '/bin/sh' and 'sh', which also causes us to prefer '/bin/sh' over a PATH-based lookup. Meson does accept that path alright on MINGW64, even though it's not an absolute Windows-style path, either.

Furthermore, this continues to work alright with cross-files, as well, in case one wants to explicitly override the shell path:

    $ meson setup build
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /bin/sh
    $ cat >cross.ini <<-EOF
    [binaries]
    sh = '/nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash'
    EOF
    $ meson setup build --cross-file=cross.ini --wipe
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index 4f22d72641e..bef80b118a8 100644
--- a/meson.build
+++ b/meson.build
@@ -245,7 +245,7 @@ time = find_program('time', dirs: program_path, required: get_option('benchmarks
 # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
 # supported systems. This path is also the default shell path used by our
 # Makefile. This lookup can be overridden via `program_path`.
-target_shell = find_program('sh', dirs: program_path + [ '/bin' ], native: false)
+target_shell = find_program('/bin/sh', 'sh', dirs: program_path, native: false)
 
 # Sanity-check that programs required for the build exist.
 foreach tool : ['cat', 'cut', 'grep', 'sort', 'tr', 'uname']
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 6/8] meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=

In 837f637cf51 (meson.build: correct setting of GIT_EXEC_PATH, 2025-05-19) we have fixed how we configure GIT_EXEC_PATH in some cases. It was reported [1] though that this causes a new issue when overriding libexecdir with `-Dlibexecdir=`:

    $ meson setup -Dprefix=/tmp/git -Dlibexecdir=libexec-different
    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different
    $ /tmp/git/bin/git daemon
    git: 'daemon' is not a git command. See 'git --help'.

While we correctly propagate the libexecdir to Git's GIT_EXEC_PATH, we forgot to append 'git-core'. Consequently, it cannot find its binaries anymore.

Fix this issue by appending 'git-core' to libexecdir. With this, things work as expected:

    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different/git-core
    $ /tmp/git/bin/git daemon -h
    ...
[1]: <66fd343a-1351-4350-83eb-c797e47b7693@gmail.com>
Reported-by: irecca.kun@gmail.com
Based-on-patch-by: irecca.kun@gmail.com
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index bef80b118a8..0da14255820 100644
--- a/meson.build
+++ b/meson.build
@@ -1596,7 +1596,7 @@ endif
 git_exec_path = 'libexec/git-core'
 libexec = get_option('libexecdir')
 if libexec != 'libexec' and libexec != '.'
-  git_exec_path = libexec
+  git_exec_path = libexec / 'git-core'
 endif
 
 if get_option('runtime_prefix')
-- 
2.50.0.195.g74e6fc65d0.dirty
Ramsay Jones· Jul 3, 2025, 16:39 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 6/8] meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=

On 03/07/2025 10:28, Patrick Steinhardt wrote:
> In 837f637cf51 (meson.build: correct setting of GIT_EXEC_PATH,
> 2025-05-19) we have fixed how we configure GIT_EXEC_PATH in some cases.
> It was reported [1] though that this causes a new issue when overriding
> libexecdir with `-Dlibexecdir=`:

Yep, I noticed this report when I got back. My first thought was 'no, we may just as well revert commit 837f637cf51', since that is in effect what this patch does! ;)

Then I had a quick look and left a diff/commit 'note to myself' which effectively did a global search/replace of the string:

    install_dir: get_option('libexecdir') / 'git-core'
with:
    install_dir: git_exec_path

and put it on my TODO list. (Note, that is *all* I did - I didn't even attempt a build, let alone test!)

Of course, I need to spend some time on this (if nothing else, git-gui and presumably gitk will need some changes as well?).

Hopefully, I can find some time soon (those round tuits are in short supply).
Show 20 quoted lines
> 
>     $ meson setup -Dprefix=/tmp/git -Dlibexecdir=libexec-different
>     $ meson install
>     $ /tmp/git/bin/git --exec-path
>     /tmp/git/libexec-different
>     $ /tmp/git/bin/git daemon
>     git: 'daemon' is not a git command. See 'git --help'.
> 
> While we correctly propagate the libexecdir to Git's GIT_EXEC_PATH, we
> forgot to append 'git-core'. Consequently, it cannot find its binaries
> anymore.
> 
> Fix this issue by appending 'git-core' to libexecdir. With this, things
> work as expected:
> 
>     $ meson install
>     $ /tmp/git/bin/git --exec-path
>     /tmp/git/libexec-different/git-core
>     $ /tmp/git/bin/git daemon -h
>     ...

Hmm, I'm pretty certain I tested commit 837f637cf51 in a similar (but not identical) way! ;) I will use the above test next time.

Sorry for causing a regression. :(

ATB, Ramsay Jones

Patrick Steinhardt· Jul 8, 2025, 08:44 UTC · re: Ramsay Jones · lore

Re: [PATCH 6/8] meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=

On Thu, Jul 03, 2025 at 05:39:31PM +0100, Ramsay Jones wrote:
Show 26 quoted lines
> 
> 
> On 03/07/2025 10:28, Patrick Steinhardt wrote:
> > In 837f637cf51 (meson.build: correct setting of GIT_EXEC_PATH,
> > 2025-05-19) we have fixed how we configure GIT_EXEC_PATH in some cases.
> > It was reported [1] though that this causes a new issue when overriding
> > libexecdir with `-Dlibexecdir=`:
> 
> Yep, I noticed this report when I got back. My first thought was 'no, we
> may just as well revert commit 837f637cf51', since that is in effect what
> this patch does! ;)
> 
> Then I had a quick look and left a diff/commit 'note to myself' which
> effectively did a global search/replace of the string:
> 
>     install_dir: get_option('libexecdir') / 'git-core'
> 
> with:
> 
>     install_dir: git_exec_path
> 
> and put it on my TODO list. (Note, that is *all* I did - I didn't even
> attempt a build, let alone test!)
> 
> Of course, I need to spend some time on this (if nothing else, git-gui and
> presumably gitk will need some changes as well?).

Neither git-gui nor gitk are currently supported by Meson. I do have a local patch series that backfills the support though.

Show 27 quoted lines
> Hopefully, I can find some time soon (those round tuits are in short supply).
> 
> > 
> >     $ meson setup -Dprefix=/tmp/git -Dlibexecdir=libexec-different
> >     $ meson install
> >     $ /tmp/git/bin/git --exec-path
> >     /tmp/git/libexec-different
> >     $ /tmp/git/bin/git daemon
> >     git: 'daemon' is not a git command. See 'git --help'.
> > 
> > While we correctly propagate the libexecdir to Git's GIT_EXEC_PATH, we
> > forgot to append 'git-core'. Consequently, it cannot find its binaries
> > anymore.
> > 
> > Fix this issue by appending 'git-core' to libexecdir. With this, things
> > work as expected:
> > 
> >     $ meson install
> >     $ /tmp/git/bin/git --exec-path
> >     /tmp/git/libexec-different/git-core
> >     $ /tmp/git/bin/git daemon -h
> >     ...
> 
> Hmm, I'm pretty certain I tested commit 837f637cf51 in a similar (but
> not identical) way! ;) I will use the above test next time.
> 
> Sorry for causing a regression. :(
No worries, it happens to all of us.
Patrick
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 7/8] meson: update subproject wrappers

Update subproject wrappers to newer versions by executing `meson wrap update` in the project's root directory

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 subprojects/expat.wrap | 18 +++++++++---------
 subprojects/pcre2.wrap | 18 +++++++++---------
 2 files changed, 18 insertions(+), 18 deletions(-)
Show changes to 2 files +18 −18

subprojects/expat.wrap, subprojects/pcre2.wrap

diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap
index 2e0427dcfd1..0e9292f97bf 100644
--- a/subprojects/expat.wrap
+++ b/subprojects/expat.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = expat-2.6.3
-source_url = https://github.com/libexpat/libexpat/releases/download/R_2_6_3/expat-2.6.3.tar.xz
-source_filename = expat-2.6.3.tar.bz2
-source_hash = 274db254a6979bde5aad404763a704956940e465843f2a9bd9ed7af22e2c0efc
-patch_filename = expat_2.6.3-1_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.6.3-1/get_patch
-patch_hash = cf017fbe105e31428b2768360bd9be39094df4e948a1e8d1c54b6f7c76460cb1
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.6.3-1/expat-2.6.3.tar.bz2
-wrapdb_version = 2.6.3-1
+directory = expat-2.7.1
+source_url = https://github.com/libexpat/libexpat/releases/download/R_2_7_1/expat-2.7.1.tar.xz
+source_filename = expat-2.7.1.tar.bz2
+source_hash = 354552544b8f99012e5062f7d570ec77f14b412a3ff5c7d8d0dae62c0d217c30
+patch_filename = expat_2.7.1-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.7.1-1/get_patch
+patch_hash = fe28cbbc427a7c9787d08b969ad54d19f59d8dd18294b4a18651cecfc789d4ef
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.7.1-1/expat-2.7.1.tar.bz2
+wrapdb_version = 2.7.1-1
 
 [provide]
 expat = expat_dep
diff --git a/subprojects/pcre2.wrap b/subprojects/pcre2.wrap
index 7e184472543..f45c968e2f3 100644
--- a/subprojects/pcre2.wrap
+++ b/subprojects/pcre2.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = pcre2-10.44
-source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.bz2
-source_filename = pcre2-10.44.tar.bz2
-source_hash = d34f02e113cf7193a1ebf2770d3ac527088d485d4e047ed10e5d217c6ef5de96
-patch_filename = pcre2_10.44-2_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.44-2/get_patch
-patch_hash = 4336d422ee9043847e5e10dbbbd01940d4c9e5027f31ccdc33a7898a1ca94009
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.44-2/pcre2-10.44.tar.bz2
-wrapdb_version = 10.44-2
+directory = pcre2-10.45
+source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.bz2
+source_filename = pcre2-10.45.tar.bz2
+source_hash = 21547f3516120c75597e5b30a992e27a592a31950b5140e7b8bfde3f192033c4
+patch_filename = pcre2_10.45-2_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.45-2/get_patch
+patch_hash = 7c6f34b703708652a404f9dc2769c67658c437b6043573295fa3428a9b7a6807
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.45-2/pcre2-10.45.tar.bz2
+wrapdb_version = 10.45-2
 
 [provide]
 libpcre2-8 = libpcre2_8
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 3, 2025, 09:28 UTC · re: Patrick Steinhardt · lore

[PATCH 8/8] ci: use Meson's new `--slice` option

As executing our test suite is notoriously slow on Windows we use matrix jobs in our CI systems to slice up tests and run them via multiple jobs. On Meson this is done with a comparatively complex PowerShell invocation as Meson didn't yet have a native way to slice tests like this.

I have upstreamed a new `--slice` option [1] that addresses this use case though, which has been merged and released with Meson 1.8. Both GitLab and GitHub CI have Meson 1.8.2 available by now, so let's update the jobs to use that new option.

[1]: https://github.com/mesonbuild/meson/pull/14092
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 .github/workflows/main.yml | 2 +-
 .gitlab-ci.yml             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
Show changes to 2 files +2 −2

.github/workflows/main.yml, .gitlab-ci.yml

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 7dbf9f7f123..f0f653bd853 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -298,7 +298,7 @@ jobs:
         path: build
     - name: Test
       shell: pwsh
-      run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
+      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
 
   regular:
     name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bb6d5b976cd..af10ebb59a3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -178,7 +178,7 @@ test:msvc-meson:
     - job: "build:msvc-meson"
       artifacts: true
   script:
-    - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group; if (!$?) { exit $LASTEXITCODE } }
+    - meson test -C build --no-rebuild --print-errorlogs --slice $Env:CI_NODE_INDEX/$Env:CI_NODE_TOTAL
   parallel: 10
 
 test:fuzz-smoke-tests:
-- 
2.50.0.195.g74e6fc65d0.dirty
Junio C Hamano· Jul 8, 2025, 00:16 UTC · re: Patrick Steinhardt · lore

Re: [PATCH 8/8] ci: use Meson's new `--slice` option

Patrick Steinhardt <ps@pks.im> writes:
Show 17 quoted lines
> As executing our test suite is notoriously slow on Windows we use matrix
> jobs in our CI systems to slice up tests and run them via multiple jobs.
> On Meson this is done with a comparatively complex PowerShell invocation
> as Meson didn't yet have a native way to slice tests like this.
>
> I have upstreamed a new `--slice` option [1] that addresses this use
> case though, which has been merged and released with Meson 1.8. Both
> GitLab and GitHub CI have Meson 1.8.2 available by now, so let's update
> the jobs to use that new option.
>
> [1]: https://github.com/mesonbuild/meson/pull/14092
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  .github/workflows/main.yml | 2 +-
>  .gitlab-ci.yml             | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
https://github.com/git/git/actions/runs/16129796573/job/45515034049#step:6:17
unfortunately ends like this:
Run meson test -C build --no-rebuild --print-errorlogs --slice 0/10
  meson test -C build --no-rebuild --print-errorlogs --slice 0/10
  shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'"
  env:
    DEVELOPER: 1
usage: meson test [-h] [--maxfail MAXFAIL] [--repeat REPEAT] [--no-rebuild]
                  [--gdb] [--gdb-path GDB_PATH] [-i] [--list]
                  [--wrapper WRAPPER] [-C WD] [--suite SUITE] [--no-suite SUITE]
                  [--no-stdsplit] [--print-errorlogs] [--benchmark]
                  [--logbase LOGBASE] [-j NUM_PROCESSES] [-v] [-q]
                  [-t TIMEOUT_MULTIPLIER] [--setup SETUP]
                  [--test-args TEST_ARGS] [--max-lines MAX_LINES]
                  [--slice SLICE/NUM_SLICES]
                  [args ...]
meson test: error: argument --slice: SLICE is not a positive integer
Error: Process completed with exit code 1.
Show 26 quoted lines
> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> index 7dbf9f7f123..f0f653bd853 100644
> --- a/.github/workflows/main.yml
> +++ b/.github/workflows/main.yml
> @@ -298,7 +298,7 @@ jobs:
>          path: build
>      - name: Test
>        shell: pwsh
> -      run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
> +      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
>  
>    regular:
>      name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index bb6d5b976cd..af10ebb59a3 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -178,7 +178,7 @@ test:msvc-meson:
>      - job: "build:msvc-meson"
>        artifacts: true
>    script:
> -    - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group; if (!$?) { exit $LASTEXITCODE } }
> +    - meson test -C build --no-rebuild --print-errorlogs --slice $Env:CI_NODE_INDEX/$Env:CI_NODE_TOTAL
>    parallel: 10
>  
>  test:fuzz-smoke-tests:
Jeff King· Jul 8, 2025, 01:12 UTC · re: Junio C Hamano · lore

Re: [PATCH 8/8] ci: use Meson's new `--slice` option

On Mon, Jul 07, 2025 at 05:16:03PM -0700, Junio C Hamano wrote:
Show 20 quoted lines
> https://github.com/git/git/actions/runs/16129796573/job/45515034049#step:6:17
> 
> unfortunately ends like this:
> 
> Run meson test -C build --no-rebuild --print-errorlogs --slice 0/10
>   meson test -C build --no-rebuild --print-errorlogs --slice 0/10
>   shell: C:\Program Files\PowerShell\7\pwsh.EXE -command ". '{0}'"
>   env:
>     DEVELOPER: 1
> usage: meson test [-h] [--maxfail MAXFAIL] [--repeat REPEAT] [--no-rebuild]
>                   [--gdb] [--gdb-path GDB_PATH] [-i] [--list]
>                   [--wrapper WRAPPER] [-C WD] [--suite SUITE] [--no-suite SUITE]
>                   [--no-stdsplit] [--print-errorlogs] [--benchmark]
>                   [--logbase LOGBASE] [-j NUM_PROCESSES] [-v] [-q]
>                   [-t TIMEOUT_MULTIPLIER] [--setup SETUP]
>                   [--test-args TEST_ARGS] [--max-lines MAX_LINES]
>                   [--slice SLICE/NUM_SLICES]
>                   [args ...]
> meson test: error: argument --slice: SLICE is not a positive integer
> Error: Process completed with exit code 1.
I was just digging into this, too. I guess:
Show changes to .github/workflows/main.yml +1 −2
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 673b1c44b9..717bd2763b 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -289,7 +289,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+        nr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
     concurrency:
       group: windows-meson-test-${{ matrix.nr }}-${{ github.ref }}
       cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}

is probably the right fix?

-Peff
Jeff King· Jul 8, 2025, 01:39 UTC · re: Jeff King · lore

Re: [PATCH 8/8] ci: use Meson's new `--slice` option

On Mon, Jul 07, 2025 at 09:12:49PM -0400, Jeff King wrote:
Show 17 quoted lines
> I was just digging into this, too. I guess:
> 
> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> index 673b1c44b9..717bd2763b 100644
> --- a/.github/workflows/main.yml
> +++ b/.github/workflows/main.yml
> @@ -289,7 +289,7 @@ jobs:
>      strategy:
>        fail-fast: false
>        matrix:
> -        nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
> +        nr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>      concurrency:
>        group: windows-meson-test-${{ matrix.nr }}-${{ github.ref }}
>        cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
> 
> is probably the right fix?

That does renumber the job titles. Probably not important, but they wouldn't match the non-meson ones anymore (though I am not sure if we even slice in the same way, so maybe it does not matter at all).

Anyway, the more minimal fix is:
Show changes to .github/workflows/main.yml +1 −2
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 673b1c44b9..7739bd2d76 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -306,7 +306,7 @@ jobs:
         path: build
     - name: Test
       shell: pwsh
-      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
+      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"
 
   regular:
     name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})

with the additional bonus that I can put "PowerShell Hacker" on my
resume now.

Curiously the quotes around the whole thing are required. If you do
just:

  $(1+1)/10

you will get two arguments: "2" and "/10". Definitely surprising to me
coming from a bourne shell background.

-Peff
Junio C Hamano· Jul 8, 2025, 04:39 UTC · re: Jeff King · lore

Re: [PATCH 8/8] ci: use Meson's new `--slice` option

Jeff King <peff@peff.net> writes:
Show 16 quoted lines
> That does renumber the job titles. Probably not important, but they
> wouldn't match the non-meson ones anymore (though I am not sure if we
> even slice in the same way, so maybe it does not matter at all).
>
> Anyway, the more minimal fix is:
>
> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> index 673b1c44b9..7739bd2d76 100644
> --- a/.github/workflows/main.yml
> +++ b/.github/workflows/main.yml
> @@ -306,7 +306,7 @@ jobs:
>          path: build
>      - name: Test
>        shell: pwsh
> -      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
> +      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"

It is confusing that $(...) is not a command substitution in shell but somehow performs arithmetic X-<.

Show 13 quoted lines
>    regular:
>      name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
>
> with the additional bonus that I can put "PowerShell Hacker" on my
> resume now.
>
> Curiously the quotes around the whole thing are required. If you do
> just:
>
>   $(1+1)/10
>
> you will get two arguments: "2" and "/10". Definitely surprising to me
> coming from a bourne shell background.
True.
Patrick Steinhardt· Jul 8, 2025, 07:16 UTC · re: Jeff King · lore

Re: [PATCH 8/8] ci: use Meson's new `--slice` option

On Mon, Jul 07, 2025 at 09:39:35PM -0400, Jeff King wrote:
Show 50 quoted lines
> On Mon, Jul 07, 2025 at 09:12:49PM -0400, Jeff King wrote:
> 
> > I was just digging into this, too. I guess:
> > 
> > diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> > index 673b1c44b9..717bd2763b 100644
> > --- a/.github/workflows/main.yml
> > +++ b/.github/workflows/main.yml
> > @@ -289,7 +289,7 @@ jobs:
> >      strategy:
> >        fail-fast: false
> >        matrix:
> > -        nr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
> > +        nr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
> >      concurrency:
> >        group: windows-meson-test-${{ matrix.nr }}-${{ github.ref }}
> >        cancel-in-progress: ${{ needs.ci-config.outputs.skip_concurrent == 'yes' }}
> > 
> > is probably the right fix?
> 
> That does renumber the job titles. Probably not important, but they
> wouldn't match the non-meson ones anymore (though I am not sure if we
> even slice in the same way, so maybe it does not matter at all).
> 
> Anyway, the more minimal fix is:
> 
> diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
> index 673b1c44b9..7739bd2d76 100644
> --- a/.github/workflows/main.yml
> +++ b/.github/workflows/main.yml
> @@ -306,7 +306,7 @@ jobs:
>          path: build
>      - name: Test
>        shell: pwsh
> -      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
> +      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"
>  
>    regular:
>      name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
> 
> with the additional bonus that I can put "PowerShell Hacker" on my
> resume now.
> 
> Curiously the quotes around the whole thing are required. If you do
> just:
> 
>   $(1+1)/10
> 
> you will get two arguments: "2" and "/10". Definitely surprising to me
> coming from a bourne shell background.

Thanks for digging into this! I probably should make it a habit to always run CI changes through both GitHub and GitLab. :/

Patrick
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 0/8] A handful of Meson cleanups and improvements

Hi,

this patch series contains a couple of more-or-less random cleanups and improvements for Meson that I have accumulated over the last two months.

Changes in v2:
  - Fix an off-by-one error for test slices used in GitHub Workflows.
  - Now tested with both GitLab (https://gitlab.com/gitlab-org/git/-/merge_requests/375)
    and GitHub (https://github.com/git/git/pull/2010).
  - Link to v1: https://lore.kernel.org/r/20250703-b4-pks-meson-cleanups-v1-0-2804c2932abe@pks.im
Thanks!
Patrick
---
Patrick Steinhardt (8):
      meson: stop discovering native version of Python
      meson: stop printing 'https' option twice in our summaries
      meson: improve summary of auto-detected features
      meson: clean up unnecessary variables
      meson: fix lookup of shell on MINGW64
      meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=
      meson: update subproject wrappers
      ci: use Meson's new `--slice` option
 .github/workflows/main.yml |  2 +-
 .gitlab-ci.yml             |  2 +-
 Documentation/meson.build  |  5 ++---
 meson.build                | 26 ++++++++++++--------------
 subprojects/expat.wrap     | 18 +++++++++---------
 subprojects/pcre2.wrap     | 18 +++++++++---------
 6 files changed, 34 insertions(+), 37 deletions(-)
Range-diff versus v1:
1:  34bb9288218 = 1:  2130ccdfb14 meson: stop discovering native version of Python
2:  a6f1b52d44f = 2:  4274c321f0b meson: stop printing 'https' option twice in our summaries
3:  01a8c379314 = 3:  cdc8c9d8655 meson: improve summary of auto-detected features
4:  306af85a4a3 = 4:  373496880ce meson: clean up unnecessary variables
5:  d8308e96c74 = 5:  cd2bfeaccd2 meson: fix lookup of shell on MINGW64
6:  583c3e701c8 = 6:  9135b7f6012 meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=
7:  c3edc233952 = 7:  16e0f2d1e22 meson: update subproject wrappers
8:  22a62721031 ! 8:  2ab73ae33df ci: use Meson's new `--slice` option
    @@ .github/workflows/main.yml: jobs:
          - name: Test
            shell: pwsh
     -      run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
    -+      run: meson test -C build --no-rebuild --print-errorlogs --slice ${{ matrix.nr }}/10
    ++      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"
      
        regular:
          name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})

--- base-commit: 8b6f19ccfc3aefbd0f22f6b7d56ad6a3fc5e4f37 change-id: 20250703-b4-pks-meson-cleanups-f53858d694f3

Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 1/8] meson: stop discovering native version of Python

When Python features are enabled we search both for a native and non-native version of Python. This is wrong though: we don't use Python in our build process, so there is no need to search for it in the first place.

There is one location where we use the native version of Python, namely when deciding whether or not we want to wire up git-p4(1). This check is invalid though, as we shouldn't check for the build host to have Python, but for the target host.

Fix this invalid check to use the non-native version of Python and stop searching for a native version of Python altogether.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)
Show changes to meson.build +4 −5
diff --git a/meson.build b/meson.build
index 7fea4a34d68..21fdff0f496 100644
--- a/meson.build
+++ b/meson.build
@@ -866,9 +866,8 @@ if host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
 endif
 build_options_config.set_quoted('X', executable_suffix)
 
-python = import('python').find_installation('python3', required: get_option('python'))
-target_python = find_program('python3', native: false, required: python.found())
-if python.found()
+target_python = find_program('python3', native: false, required: get_option('python'))
+if target_python.found()
   build_options_config.set('NO_PYTHON', '')
 else
   libgit_c_args += '-DNO_PYTHON'
@@ -1979,7 +1978,7 @@ if perl_features_enabled
   subdir('perl')
 endif
 
-if python.found()
+if target_python.found()
   scripts_python = [
     'git-p4.py'
   ]
@@ -2202,7 +2201,7 @@ summary({
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-  'python': python.found(),
+  'python': target_python.found(),
 }, section: 'Auto-detected features')
 
 summary({
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 2/8] meson: stop printing 'https' option twice in our summaries

The value for the 'https' backend option is printed twice: once via the summary of auto-detected features and once via our summary of backends. Drop it from the former summary.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 1 -
 1 file changed, 1 deletion(-)
Show changes to meson.build +0 −1
diff --git a/meson.build b/meson.build
index 21fdff0f496..4e41c3007bb 100644
--- a/meson.build
+++ b/meson.build
@@ -2197,7 +2197,6 @@ summary({
   'expat': expat.found(),
   'gettext': intl.found(),
   'gitweb': gitweb_option.allowed(),
-  'https': https_backend,
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 3/8] meson: improve summary of auto-detected features

The summary of auto-detected features prints a boolean for every option to tell the user whether or not the feature has been auto-enabled or not. This summary can be improved though, as in some cases this boolean is derived from a dependency. So if we pass in the dependency directly, then Meson knows to both print a boolean and, if the dependency was found, it also prints a version number.

Adapt the code accordingly and enable `bool_yn` so that actual booleans are formatted similarly to dependencies. Before this change:

  Auto-detected features
    benchmarks      : true
    curl            : true
    expat           : true
    gettext         : true
    gitweb          : true
    iconv           : true
    pcre2           : true
    perl            : true
    python          : true
And after this change, we now see the version numbers as expected:
  Auto-detected features
    benchmarks      : YES
    curl            : YES 8.14.1
    expat           : YES 2.7.1
    gettext         : YES
    gitweb          : YES
    iconv           : YES
    pcre2           : YES 10.44
    perl            : YES
    python          : YES

Note that this change also enables colorization of the boolean options, green for "YES" and red for "NO".

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
Show changes to meson.build +6 −6
diff --git a/meson.build b/meson.build
index 4e41c3007bb..4f22d72641e 100644
--- a/meson.build
+++ b/meson.build
@@ -2193,15 +2193,15 @@ meson.add_dist_script(
 
 summary({
   'benchmarks': get_option('tests') and perl.found() and time.found(),
-  'curl': curl.found(),
-  'expat': expat.found(),
-  'gettext': intl.found(),
+  'curl': curl,
+  'expat': expat,
+  'gettext': intl,
   'gitweb': gitweb_option.allowed(),
-  'iconv': iconv.found(),
-  'pcre2': pcre2.found(),
+  'iconv': iconv,
+  'pcre2': pcre2,
   'perl': perl_features_enabled,
   'python': target_python.found(),
-}, section: 'Auto-detected features')
+}, section: 'Auto-detected features', bool_yn: true)
 
 summary({
   'csprng': csprng_backend,
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 4/8] meson: clean up unnecessary variables

The `manpage_target` variable isn't used at all, and the `manpage_path` variable is only used in a single location. Remove the former variable and inline the latter.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/meson.build | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
Show changes to Documentation/meson.build +2 −3
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 2fe1a1369d4..4404c623f00 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -375,8 +375,7 @@ foreach manpage, category : manpages
       output: fs.stem(manpage) + '.xml',
     )
 
-    manpage_path = fs.stem(manpage) + '.' + category.to_string()
-    manpage_target = custom_target(
+    custom_target(
       command: [
         xmlto,
         '-m', '@INPUT0@',
@@ -392,7 +391,7 @@ foreach manpage, category : manpages
         'manpage-normal.xsl',
         'manpage-bold-literal.xsl',
       ],
-      output: manpage_path,
+      output: fs.stem(manpage) + '.' + category.to_string(),
       install: true,
       install_dir: get_option('mandir') / 'man' + category.to_string(),
     )
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 5/8] meson: fix lookup of shell on MINGW64

In 4cba20fbdc6 (meson: prefer shell at "/bin/sh", 2025-04-25) we have addressed an issue where the shell path embedded into Git was looked up via PATH, which easily led to unportable shell paths other than the usual "/bin/sh" location. The fix was to simply add '/bin' to the search path explicitly, which made us prefer that directory over the PATH-based lookup.

This fix causes issues on MINGW64 though, which uses Windows-style paths. "/bin" is not an absolute Windows-style path, but Meson expects the directories to be absolute. This leads to the following error:

    meson.build:248:15: ERROR: Search directory /bin is not an absolute path.

Fix this by instead searching for both '/bin/sh' and 'sh', which also causes us to prefer '/bin/sh' over a PATH-based lookup. Meson does accept that path alright on MINGW64, even though it's not an absolute Windows-style path, either.

Furthermore, this continues to work alright with cross-files, as well, in case one wants to explicitly override the shell path:

    $ meson setup build
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /bin/sh
    $ cat >cross.ini <<-EOF
    [binaries]
    sh = '/nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash'
    EOF
    $ meson setup build --cross-file=cross.ini --wipe
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index 4f22d72641e..bef80b118a8 100644
--- a/meson.build
+++ b/meson.build
@@ -245,7 +245,7 @@ time = find_program('time', dirs: program_path, required: get_option('benchmarks
 # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
 # supported systems. This path is also the default shell path used by our
 # Makefile. This lookup can be overridden via `program_path`.
-target_shell = find_program('sh', dirs: program_path + [ '/bin' ], native: false)
+target_shell = find_program('/bin/sh', 'sh', dirs: program_path, native: false)
 
 # Sanity-check that programs required for the build exist.
 foreach tool : ['cat', 'cut', 'grep', 'sort', 'tr', 'uname']
-- 
2.50.0.195.g74e6fc65d0.dirty
Justin Tobler· Jul 8, 2025, 20:44 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v2 5/8] meson: fix lookup of shell on MINGW64

On 25/07/08 09:57AM, Patrick Steinhardt wrote:
Show 12 quoted lines
> In 4cba20fbdc6 (meson: prefer shell at "/bin/sh", 2025-04-25) we have
> addressed an issue where the shell path embedded into Git was looked up
> via PATH, which easily led to unportable shell paths other than the
> usual "/bin/sh" location. The fix was to simply add '/bin' to the search
> path explicitly, which made us prefer that directory over the PATH-based
> lookup.
> 
> This fix causes issues on MINGW64 though, which uses Windows-style
> paths. "/bin" is not an absolute Windows-style path, but Meson expects
> the directories to be absolute. This leads to the following error:
> 
>     meson.build:248:15: ERROR: Search directory /bin is not an absolute path.

Ok so the specifed `dirs` takes higher precedence over searching the $PATH and appending `/bin` was how we ensured `/bin/sh` was checked first. The problem is that for MINGW64, `/bin` is not a valid absolute path and results in the above mention error.

> Fix this by instead searching for both '/bin/sh' and 'sh', which also
> causes us to prefer '/bin/sh' over a PATH-based lookup. Meson does
> accept that path alright on MINGW64, even though it's not an absolute
> Windows-style path, either.

To avoid this problem, we instead search for `/bin/sh` directly. By specifying `/bin/sh` first, we maintain the same preference without affecting MINGW64. Makes sense.

Show 37 quoted lines
> Furthermore, this continues to work alright with cross-files, as well,
> in case one wants to explicitly override the shell path:
> 
>     $ meson setup build
>     ...
>       Runtime executable paths
>         perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
>         python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
>         shell      : /bin/sh
> 
>     $ cat >cross.ini <<-EOF
>     [binaries]
>     sh = '/nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash'
>     EOF
> 
>     $ meson setup build --cross-file=cross.ini --wipe
>     ...
>       Runtime executable paths
>         perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
>         python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
>         shell      : /nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash
> 
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/meson.build b/meson.build
> index 4f22d72641e..bef80b118a8 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -245,7 +245,7 @@ time = find_program('time', dirs: program_path, required: get_option('benchmarks
>  # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
>  # supported systems. This path is also the default shell path used by our
>  # Makefile. This lookup can be overridden via `program_path`.
> -target_shell = find_program('sh', dirs: program_path + [ '/bin' ], native: false)
> +target_shell = find_program('/bin/sh', 'sh', dirs: program_path, native: false)
Looks good!
-Justin
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 6/8] meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=

In 837f637cf51 (meson.build: correct setting of GIT_EXEC_PATH, 2025-05-19) we have fixed how we configure GIT_EXEC_PATH in some cases. It was reported [1] though that this causes a new issue when overriding libexecdir with `-Dlibexecdir=`:

    $ meson setup -Dprefix=/tmp/git -Dlibexecdir=libexec-different
    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different
    $ /tmp/git/bin/git daemon
    git: 'daemon' is not a git command. See 'git --help'.

While we correctly propagate the libexecdir to Git's GIT_EXEC_PATH, we forgot to append 'git-core'. Consequently, it cannot find its binaries anymore.

Fix this issue by appending 'git-core' to libexecdir. With this, things work as expected:

    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different/git-core
    $ /tmp/git/bin/git daemon -h
    ...
[1]: <66fd343a-1351-4350-83eb-c797e47b7693@gmail.com>
Reported-by: irecca.kun@gmail.com
Based-on-patch-by: irecca.kun@gmail.com
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index bef80b118a8..0da14255820 100644
--- a/meson.build
+++ b/meson.build
@@ -1596,7 +1596,7 @@ endif
 git_exec_path = 'libexec/git-core'
 libexec = get_option('libexecdir')
 if libexec != 'libexec' and libexec != '.'
-  git_exec_path = libexec
+  git_exec_path = libexec / 'git-core'
 endif
 
 if get_option('runtime_prefix')
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 7/8] meson: update subproject wrappers

Update subproject wrappers to newer versions by executing `meson wrap update` in the project's root directory

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 subprojects/expat.wrap | 18 +++++++++---------
 subprojects/pcre2.wrap | 18 +++++++++---------
 2 files changed, 18 insertions(+), 18 deletions(-)
Show changes to 2 files +18 −18

subprojects/expat.wrap, subprojects/pcre2.wrap

diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap
index 2e0427dcfd1..0e9292f97bf 100644
--- a/subprojects/expat.wrap
+++ b/subprojects/expat.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = expat-2.6.3
-source_url = https://github.com/libexpat/libexpat/releases/download/R_2_6_3/expat-2.6.3.tar.xz
-source_filename = expat-2.6.3.tar.bz2
-source_hash = 274db254a6979bde5aad404763a704956940e465843f2a9bd9ed7af22e2c0efc
-patch_filename = expat_2.6.3-1_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.6.3-1/get_patch
-patch_hash = cf017fbe105e31428b2768360bd9be39094df4e948a1e8d1c54b6f7c76460cb1
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.6.3-1/expat-2.6.3.tar.bz2
-wrapdb_version = 2.6.3-1
+directory = expat-2.7.1
+source_url = https://github.com/libexpat/libexpat/releases/download/R_2_7_1/expat-2.7.1.tar.xz
+source_filename = expat-2.7.1.tar.bz2
+source_hash = 354552544b8f99012e5062f7d570ec77f14b412a3ff5c7d8d0dae62c0d217c30
+patch_filename = expat_2.7.1-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.7.1-1/get_patch
+patch_hash = fe28cbbc427a7c9787d08b969ad54d19f59d8dd18294b4a18651cecfc789d4ef
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.7.1-1/expat-2.7.1.tar.bz2
+wrapdb_version = 2.7.1-1
 
 [provide]
 expat = expat_dep
diff --git a/subprojects/pcre2.wrap b/subprojects/pcre2.wrap
index 7e184472543..f45c968e2f3 100644
--- a/subprojects/pcre2.wrap
+++ b/subprojects/pcre2.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = pcre2-10.44
-source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.bz2
-source_filename = pcre2-10.44.tar.bz2
-source_hash = d34f02e113cf7193a1ebf2770d3ac527088d485d4e047ed10e5d217c6ef5de96
-patch_filename = pcre2_10.44-2_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.44-2/get_patch
-patch_hash = 4336d422ee9043847e5e10dbbbd01940d4c9e5027f31ccdc33a7898a1ca94009
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.44-2/pcre2-10.44.tar.bz2
-wrapdb_version = 10.44-2
+directory = pcre2-10.45
+source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.bz2
+source_filename = pcre2-10.45.tar.bz2
+source_hash = 21547f3516120c75597e5b30a992e27a592a31950b5140e7b8bfde3f192033c4
+patch_filename = pcre2_10.45-2_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.45-2/get_patch
+patch_hash = 7c6f34b703708652a404f9dc2769c67658c437b6043573295fa3428a9b7a6807
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.45-2/pcre2-10.45.tar.bz2
+wrapdb_version = 10.45-2
 
 [provide]
 libpcre2-8 = libpcre2_8
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 8, 2025, 07:57 UTC · re: Patrick Steinhardt · lore

[PATCH v2 8/8] ci: use Meson's new `--slice` option

As executing our test suite is notoriously slow on Windows we use matrix jobs in our CI systems to slice up tests and run them via multiple jobs. On Meson this is done with a comparatively complex PowerShell invocation as Meson didn't yet have a native way to slice tests like this.

I have upstreamed a new `--slice` option [1] that addresses this use case though, which has been merged and released with Meson 1.8. Both GitLab and GitHub CI have Meson 1.8.2 available by now, so let's update the jobs to use that new option.

[1]: https://github.com/mesonbuild/meson/pull/14092
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 .github/workflows/main.yml | 2 +-
 .gitlab-ci.yml             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
Show changes to 2 files +2 −2

.github/workflows/main.yml, .gitlab-ci.yml

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 7dbf9f7f123..d122e79415a 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -298,7 +298,7 @@ jobs:
         path: build
     - name: Test
       shell: pwsh
-      run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
+      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"
 
   regular:
     name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bb6d5b976cd..af10ebb59a3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -178,7 +178,7 @@ test:msvc-meson:
     - job: "build:msvc-meson"
       artifacts: true
   script:
-    - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group; if (!$?) { exit $LASTEXITCODE } }
+    - meson test -C build --no-rebuild --print-errorlogs --slice $Env:CI_NODE_INDEX/$Env:CI_NODE_TOTAL
   parallel: 10
 
 test:fuzz-smoke-tests:
-- 
2.50.0.195.g74e6fc65d0.dirty
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 0/8] A handful of Meson cleanups and improvements

Hi,

this patch series contains a couple of more-or-less random cleanups and improvements for Meson that I have accumulated over the last two months.

Changes in v2:
  - Fix an off-by-one error for test slices used in GitHub Workflows.
  - Now tested with both GitLab (https://gitlab.com/gitlab-org/git/-/merge_requests/375)
    and GitHub (https://github.com/git/git/pull/2010).
  - Link to v1: https://lore.kernel.org/r/20250703-b4-pks-meson-cleanups-v1-0-2804c2932abe@pks.im
Changes in v3:
  - Add a comment explaining why we only need to search for Python on
    the build target.
  - Link to v2: https://lore.kernel.org/r/20250708-b4-pks-meson-cleanups-v2-0-94ac53cd4b95@pks.im
Thanks!
Patrick
---
Patrick Steinhardt (8):
      meson: stop discovering native version of Python
      meson: stop printing 'https' option twice in our summaries
      meson: improve summary of auto-detected features
      meson: clean up unnecessary variables
      meson: fix lookup of shell on MINGW64
      meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=
      meson: update subproject wrappers
      ci: use Meson's new `--slice` option
 .github/workflows/main.yml |  2 +-
 .gitlab-ci.yml             |  2 +-
 Documentation/meson.build  |  5 ++---
 meson.build                | 29 +++++++++++++++--------------
 subprojects/expat.wrap     | 18 +++++++++---------
 subprojects/pcre2.wrap     | 18 +++++++++---------
 6 files changed, 37 insertions(+), 37 deletions(-)
Range-diff versus v2:
1:  af222af4b0b ! 1:  5b6ff96df15 meson: stop discovering native version of Python
    @@ meson.build: if host_machine.system() == 'cygwin' or host_machine.system() == 'w
     -python = import('python').find_installation('python3', required: get_option('python'))
     -target_python = find_program('python3', native: false, required: python.found())
     -if python.found()
    ++# Python is not used for our build system, but exclusively for git-p4.
    ++# Consequently we only need to determine whether Python is available for the
    ++# build target.
     +target_python = find_program('python3', native: false, required: get_option('python'))
     +if target_python.found()
        build_options_config.set('NO_PYTHON', '')
2:  e1fe6822400 = 2:  cb5a42b63a0 meson: stop printing 'https' option twice in our summaries
3:  9caa9813f94 = 3:  4b165ffa205 meson: improve summary of auto-detected features
4:  2fbae915050 = 4:  fed79e92b3e meson: clean up unnecessary variables
5:  2a72ec1cf78 = 5:  f7496adc08a meson: fix lookup of shell on MINGW64
6:  c44a8783eac = 6:  e7692a76c89 meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=
7:  3fb621da6ae = 7:  19853592a22 meson: update subproject wrappers
8:  ad9176ef14e = 8:  5cd1b3ec3c3 ci: use Meson's new `--slice` option

--- base-commit: 8b6f19ccfc3aefbd0f22f6b7d56ad6a3fc5e4f37 change-id: 20250703-b4-pks-meson-cleanups-f53858d694f3

Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 1/8] meson: stop discovering native version of Python

When Python features are enabled we search both for a native and non-native version of Python. This is wrong though: we don't use Python in our build process, so there is no need to search for it in the first place.

There is one location where we use the native version of Python, namely when deciding whether or not we want to wire up git-p4(1). This check is invalid though, as we shouldn't check for the build host to have Python, but for the target host.

Fix this invalid check to use the non-native version of Python and stop searching for a native version of Python altogether.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)
Show changes to meson.build +7 −5
diff --git a/meson.build b/meson.build
index 7fea4a34d68..4ee1a55b0bb 100644
--- a/meson.build
+++ b/meson.build
@@ -866,9 +866,11 @@ if host_machine.system() == 'cygwin' or host_machine.system() == 'windows'
 endif
 build_options_config.set_quoted('X', executable_suffix)
 
-python = import('python').find_installation('python3', required: get_option('python'))
-target_python = find_program('python3', native: false, required: python.found())
-if python.found()
+# Python is not used for our build system, but exclusively for git-p4.
+# Consequently we only need to determine whether Python is available for the
+# build target.
+target_python = find_program('python3', native: false, required: get_option('python'))
+if target_python.found()
   build_options_config.set('NO_PYTHON', '')
 else
   libgit_c_args += '-DNO_PYTHON'
@@ -1979,7 +1981,7 @@ if perl_features_enabled
   subdir('perl')
 endif
 
-if python.found()
+if target_python.found()
   scripts_python = [
     'git-p4.py'
   ]
@@ -2202,7 +2204,7 @@ summary({
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-  'python': python.found(),
+  'python': target_python.found(),
 }, section: 'Auto-detected features')
 
 summary({
-- 
2.50.1.327.g047016eb4a.dirty
Junio C Hamano· Jul 9, 2025, 15:09 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v3 1/8] meson: stop discovering native version of Python

Patrick Steinhardt <ps@pks.im> writes:
Show 17 quoted lines
> When Python features are enabled we search both for a native and
> non-native version of Python. This is wrong though: we don't use Python
> in our build process, so there is no need to search for it in the first
> place.
>
> There is one location where we use the native version of Python, namely
> when deciding whether or not we want to wire up git-p4(1). This check is
> invalid though, as we shouldn't check for the build host to have Python,
> but for the target host.
>
> Fix this invalid check to use the non-native version of Python and stop
> searching for a native version of Python altogether.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)
The above explains the reasoning very nicely.
Show 11 quoted lines
> -python = import('python').find_installation('python3', required: get_option('python'))
> -target_python = find_program('python3', native: false, required: python.found())
> -if python.found()
> +# Python is not used for our build system, but exclusively for git-p4.
> +# Consequently we only need to determine whether Python is available for the
> +# build target.
> +target_python = find_program('python3', native: false, required: get_option('python'))
> +if target_python.found()
>    build_options_config.set('NO_PYTHON', '')
>  else
>    libgit_c_args += '-DNO_PYTHON'
We ask explicitly for Python 3 here.

Does find_program() have some magic to deal with installations where Python3 is simply called /usr/bin/python (and worse yet, not as a symbolic link to /usr/bin/python3)?

I found
    "Since 0.50.0 if the "python3" program is requested and it is
    not found in the system, Meson will return its current
    interpreter",

which I suspect refers to the path to python3 used during the build and is not what we want, at

https://mesonbuild.com/Reference-manual_functions.html#find_program
which got me a bit worried.

Perhaps everybody with Python3 has it at /usr/bin/python3 these days, and my worries are unfounded? ;-)

Thanks.
Show 18 quoted lines
> @@ -1979,7 +1981,7 @@ if perl_features_enabled
>    subdir('perl')
>  endif
>  
> -if python.found()
> +if target_python.found()
>    scripts_python = [
>      'git-p4.py'
>    ]
> @@ -2202,7 +2204,7 @@ summary({
>    'iconv': iconv.found(),
>    'pcre2': pcre2.found(),
>    'perl': perl_features_enabled,
> -  'python': python.found(),
> +  'python': target_python.found(),
>  }, section: 'Auto-detected features')
>  
>  summary({
Justin Tobler· Jul 9, 2025, 21:36 UTC · re: Junio C Hamano · lore

Re: [PATCH v3 1/8] meson: stop discovering native version of Python

On 25/07/09 08:09AM, Junio C Hamano wrote:
Show 18 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> > -python = import('python').find_installation('python3', required: get_option('python'))
> > -target_python = find_program('python3', native: false, required: python.found())
> > -if python.found()
> > +# Python is not used for our build system, but exclusively for git-p4.
> > +# Consequently we only need to determine whether Python is available for the
> > +# build target.
> > +target_python = find_program('python3', native: false, required: get_option('python'))
> > +if target_python.found()
> >    build_options_config.set('NO_PYTHON', '')
> >  else
> >    libgit_c_args += '-DNO_PYTHON'
> 
> We ask explicitly for Python 3 here.
> 
> Does find_program() have some magic to deal with installations where
> Python3 is simply called /usr/bin/python (and worse yet, not as a
> symbolic link to /usr/bin/python3)?

My understanding is that find_program() won't do anything in this case. I would imagine if the target host has Python3 in a non-standard location, there would probably need to be a cross-file that defines it.

Show 12 quoted lines
> I found
> 
>     "Since 0.50.0 if the "python3" program is requested and it is
>     not found in the system, Meson will return its current
>     interpreter",
> 
> which I suspect refers to the path to python3 used during the build
> and is not what we want, at
> 
> https://mesonbuild.com/Reference-manual_functions.html#find_program
> 
> which got me a bit worried.

As you mentioned, I think this is only relevant for Python scipts executed at build time.

-Justin
Eli Schwartz· Jul 9, 2025, 22:22 UTC · re: Junio C Hamano · lore

Re: [PATCH v3 1/8] meson: stop discovering native version of Python

On 7/9/25 11:09 AM, Junio C Hamano wrote:
Show 30 quoted lines
>> -python = import('python').find_installation('python3', required: get_option('python'))
>> -target_python = find_program('python3', native: false, required: python.found())
>> -if python.found()
>> +# Python is not used for our build system, but exclusively for git-p4.
>> +# Consequently we only need to determine whether Python is available for the
>> +# build target.
>> +target_python = find_program('python3', native: false, required: get_option('python'))
>> +if target_python.found()
>>    build_options_config.set('NO_PYTHON', '')
>>  else
>>    libgit_c_args += '-DNO_PYTHON'
> 
> We ask explicitly for Python 3 here.
> 
> Does find_program() have some magic to deal with installations where
> Python3 is simply called /usr/bin/python (and worse yet, not as a
> symbolic link to /usr/bin/python3)?
> 
> I found
> 
>     "Since 0.50.0 if the "python3" program is requested and it is
>     not found in the system, Meson will return its current
>     interpreter",
> 
> which I suspect refers to the path to python3 used during the build
> and is not what we want, at
> 
> https://mesonbuild.com/Reference-manual_functions.html#find_program
> 
> which got me a bit worried.

Well, this patch doesn't really change that. But a cross compile where build != host and thus the build meson and build python don't represent the host `git`, already needs a cross env setup to define the right C compiler which can produce host binaries, and that's where you'd define the host python too.

[binaries] c = 'usr/bin/aarch64-linux-gnu-gcc'

# we have python 3.13, but our cross target is really old python3 = '/usr/bin/python3.6'

> Perhaps everybody with Python3 has it at /usr/bin/python3 these
> days, and my worries are unfounded? ;-)
> 
> Thanks.

Python installs as python3.13 or some other major.minor version. "python3" is a symlink to that.

"python" may be a symlink to python 2.x, or 3.x, or not exist at all. I am not aware of *any* scenario where a distributor has re-packaged Python, "python" exists on PATH and is a real Python 3.x interpreter, but "python3" doesn't exist.

I am not aware of this ever being an existing real world scenario in the past, either -- it is not a "we no longer live in the bad old days" scenario.

The only big change to how people deploy python was around the unversioned "python" name.

Since 1996 and earlier, "python" was a symlink pointing to the "full" name, "python1.4". The full name was created by "make altinstall".

And "make install" had a Makefile dependency on "altinstall", and then additionally created symlinks. You could run "install" for a full default install, or "altinstall" if you wanted to install multiple versions side by side.

Python 3.x originally didn't create a "python" symlink, only a "python3" symlink, because too many people would have scripts running "python" and expect it to be version 2.x; this problem obviously never existed for "python3", as having the major version was new for "python3" and indeed the whole point of adding a new "prog{MAJORVERSION}" was to avoid confusing versions 2.x and 3.x

Anyways, yes, it is in my reasonably knowledgeable opinion flat out *impossible* for

find_program('python')
to ever be a good idea when you could do
find_program('python3')

The former will correctly work in a strict subset of cases that the latter already works; in some cases it seems to work but returns a bad program; in some cases it fails but using the right name would work.

-- 
Eli Schwartz
Junio C Hamano· Jul 9, 2025, 22:40 UTC · re: Eli Schwartz · lore

Re: [PATCH v3 1/8] meson: stop discovering native version of Python

Eli Schwartz <eschwartz@gentoo.org> writes:
Show 8 quoted lines
> "python" may be a symlink to python 2.x, or 3.x, or not exist at all. I
> am not aware of *any* scenario where a distributor has re-packaged
> Python, "python" exists on PATH and is a real Python 3.x interpreter,
> but "python3" doesn't exist.
>
> I am not aware of this ever being an existing real world scenario in the
> past, either -- it is not a "we no longer live in the bad old days"
> scenario.
Good.  Thanks.
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 2/8] meson: stop printing 'https' option twice in our summaries

The value for the 'https' backend option is printed twice: once via the summary of auto-detected features and once via our summary of backends. Drop it from the former summary.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 1 -
 1 file changed, 1 deletion(-)
Show changes to meson.build +0 −1
diff --git a/meson.build b/meson.build
index 4ee1a55b0bb..0ed00254ef3 100644
--- a/meson.build
+++ b/meson.build
@@ -2200,7 +2200,6 @@ summary({
   'expat': expat.found(),
   'gettext': intl.found(),
   'gitweb': gitweb_option.allowed(),
-  'https': https_backend,
   'iconv': iconv.found(),
   'pcre2': pcre2.found(),
   'perl': perl_features_enabled,
-- 
2.50.1.327.g047016eb4a.dirty
Junio C Hamano· Jul 9, 2025, 15:17 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v3 2/8] meson: stop printing 'https' option twice in our summaries

Patrick Steinhardt <ps@pks.im> writes:
Show 8 quoted lines
> The value for the 'https' backend option is printed twice: once via the
> summary of auto-detected features and once via our summary of backends.
> Drop it from the former summary.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
>  meson.build | 1 -
>  1 file changed, 1 deletion(-)

Good eyes. To me the distinction between "Auto-detected features" and "Backends" feel a bit blurry, but most of the things in the former are what dependency() returned, while https_backend is very much driven by custom code of ours, so removing from "Auto-detected" does make senseto me.

Thanks.
Show 12 quoted lines
> diff --git a/meson.build b/meson.build
> index 4ee1a55b0bb..0ed00254ef3 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -2200,7 +2200,6 @@ summary({
>    'expat': expat.found(),
>    'gettext': intl.found(),
>    'gitweb': gitweb_option.allowed(),
> -  'https': https_backend,
>    'iconv': iconv.found(),
>    'pcre2': pcre2.found(),
>    'perl': perl_features_enabled,
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 3/8] meson: improve summary of auto-detected features

The summary of auto-detected features prints a boolean for every option to tell the user whether or not the feature has been auto-enabled or not. This summary can be improved though, as in some cases this boolean is derived from a dependency. So if we pass in the dependency directly, then Meson knows to both print a boolean and, if the dependency was found, it also prints a version number.

Adapt the code accordingly and enable `bool_yn` so that actual booleans are formatted similarly to dependencies. Before this change:

  Auto-detected features
    benchmarks      : true
    curl            : true
    expat           : true
    gettext         : true
    gitweb          : true
    iconv           : true
    pcre2           : true
    perl            : true
    python          : true
And after this change, we now see the version numbers as expected:
  Auto-detected features
    benchmarks      : YES
    curl            : YES 8.14.1
    expat           : YES 2.7.1
    gettext         : YES
    gitweb          : YES
    iconv           : YES
    pcre2           : YES 10.44
    perl            : YES
    python          : YES

Note that this change also enables colorization of the boolean options, green for "YES" and red for "NO".

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)
Show changes to meson.build +6 −6
diff --git a/meson.build b/meson.build
index 0ed00254ef3..29d076bbaac 100644
--- a/meson.build
+++ b/meson.build
@@ -2196,15 +2196,15 @@ meson.add_dist_script(
 
 summary({
   'benchmarks': get_option('tests') and perl.found() and time.found(),
-  'curl': curl.found(),
-  'expat': expat.found(),
-  'gettext': intl.found(),
+  'curl': curl,
+  'expat': expat,
+  'gettext': intl,
   'gitweb': gitweb_option.allowed(),
-  'iconv': iconv.found(),
-  'pcre2': pcre2.found(),
+  'iconv': iconv,
+  'pcre2': pcre2,
   'perl': perl_features_enabled,
   'python': target_python.found(),
-}, section: 'Auto-detected features')
+}, section: 'Auto-detected features', bool_yn: true)
 
 summary({
   'csprng': csprng_backend,
-- 
2.50.1.327.g047016eb4a.dirty
Toon Claes· Jul 10, 2025, 15:25 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v3 3/8] meson: improve summary of auto-detected features

Patrick Steinhardt <ps@pks.im> writes:
Show 36 quoted lines
> The summary of auto-detected features prints a boolean for every option
> to tell the user whether or not the feature has been auto-enabled or
> not. This summary can be improved though, as in some cases this boolean
> is derived from a dependency. So if we pass in the dependency directly,
> then Meson knows to both print a boolean and, if the dependency was
> found, it also prints a version number.
>
> Adapt the code accordingly and enable `bool_yn` so that actual booleans
> are formatted similarly to dependencies. Before this change:
>
>   Auto-detected features
>     benchmarks      : true
>     curl            : true
>     expat           : true
>     gettext         : true
>     gitweb          : true
>     iconv           : true
>     pcre2           : true
>     perl            : true
>     python          : true
>
> And after this change, we now see the version numbers as expected:
>
>   Auto-detected features
>     benchmarks      : YES
>     curl            : YES 8.14.1
>     expat           : YES 2.7.1
>     gettext         : YES
>     gitweb          : YES
>     iconv           : YES
>     pcre2           : YES 10.44
>     perl            : YES
>     python          : YES
>
> Note that this change also enables colorization of the boolean options,
> green for "YES" and red for "NO".
Nice, I'm really liking this change.
I've also reviewed the rest of the patches, and all looks good to me.
-- 
Cheers,
Toon
Junio C Hamano· Jul 10, 2025, 16:24 UTC · re: Toon Claes · lore

Re: [PATCH v3 3/8] meson: improve summary of auto-detected features

Toon Claes <toon@iotcl.com> writes:
Show 42 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
>
>> The summary of auto-detected features prints a boolean for every option
>> to tell the user whether or not the feature has been auto-enabled or
>> not. This summary can be improved though, as in some cases this boolean
>> is derived from a dependency. So if we pass in the dependency directly,
>> then Meson knows to both print a boolean and, if the dependency was
>> found, it also prints a version number.
>>
>> Adapt the code accordingly and enable `bool_yn` so that actual booleans
>> are formatted similarly to dependencies. Before this change:
>>
>>   Auto-detected features
>>     benchmarks      : true
>>     curl            : true
>>     expat           : true
>>     gettext         : true
>>     gitweb          : true
>>     iconv           : true
>>     pcre2           : true
>>     perl            : true
>>     python          : true
>>
>> And after this change, we now see the version numbers as expected:
>>
>>   Auto-detected features
>>     benchmarks      : YES
>>     curl            : YES 8.14.1
>>     expat           : YES 2.7.1
>>     gettext         : YES
>>     gitweb          : YES
>>     iconv           : YES
>>     pcre2           : YES 10.44
>>     perl            : YES
>>     python          : YES
>>
>> Note that this change also enables colorization of the boolean options,
>> green for "YES" and red for "NO".
>
> Nice, I'm really liking this change.
>
> I've also reviewed the rest of the patches, and all looks good to me.
Thanks.
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 4/8] meson: clean up unnecessary variables

The `manpage_target` variable isn't used at all, and the `manpage_path` variable is only used in a single location. Remove the former variable and inline the latter.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 Documentation/meson.build | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
Show changes to Documentation/meson.build +2 −3
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 2fe1a1369d4..4404c623f00 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -375,8 +375,7 @@ foreach manpage, category : manpages
       output: fs.stem(manpage) + '.xml',
     )
 
-    manpage_path = fs.stem(manpage) + '.' + category.to_string()
-    manpage_target = custom_target(
+    custom_target(
       command: [
         xmlto,
         '-m', '@INPUT0@',
@@ -392,7 +391,7 @@ foreach manpage, category : manpages
         'manpage-normal.xsl',
         'manpage-bold-literal.xsl',
       ],
-      output: manpage_path,
+      output: fs.stem(manpage) + '.' + category.to_string(),
       install: true,
       install_dir: get_option('mandir') / 'man' + category.to_string(),
     )
-- 
2.50.1.327.g047016eb4a.dirty
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 5/8] meson: fix lookup of shell on MINGW64

In 4cba20fbdc6 (meson: prefer shell at "/bin/sh", 2025-04-25) we have addressed an issue where the shell path embedded into Git was looked up via PATH, which easily led to unportable shell paths other than the usual "/bin/sh" location. The fix was to simply add '/bin' to the search path explicitly, which made us prefer that directory over the PATH-based lookup.

This fix causes issues on MINGW64 though, which uses Windows-style paths. "/bin" is not an absolute Windows-style path, but Meson expects the directories to be absolute. This leads to the following error:

    meson.build:248:15: ERROR: Search directory /bin is not an absolute path.

Fix this by instead searching for both '/bin/sh' and 'sh', which also causes us to prefer '/bin/sh' over a PATH-based lookup. Meson does accept that path alright on MINGW64, even though it's not an absolute Windows-style path, either.

Furthermore, this continues to work alright with cross-files, as well, in case one wants to explicitly override the shell path:

    $ meson setup build
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /bin/sh
    $ cat >cross.ini <<-EOF
    [binaries]
    sh = '/nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash'
    EOF
    $ meson setup build --cross-file=cross.ini --wipe
    ...
      Runtime executable paths
        perl       : /nix/store/gy10hw004rl2xfbfq41vnw0yb1w8rvbl-perl-5.40.0/bin/perl
        python     : /nix/store/sd81bvmch7njdpwx3lkjslixcbj5mivz-python3-3.13.4/bin/python3
        shell      : /nix/store/94lg0shvsfc845zy8gnflvpqxxiyijbz-bash-interactive-5.2p37/bin/bash
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index 29d076bbaac..02d73188537 100644
--- a/meson.build
+++ b/meson.build
@@ -245,7 +245,7 @@ time = find_program('time', dirs: program_path, required: get_option('benchmarks
 # "/bin/sh" over a PATH-based lookup, which provides a working shell on most
 # supported systems. This path is also the default shell path used by our
 # Makefile. This lookup can be overridden via `program_path`.
-target_shell = find_program('sh', dirs: program_path + [ '/bin' ], native: false)
+target_shell = find_program('/bin/sh', 'sh', dirs: program_path, native: false)
 
 # Sanity-check that programs required for the build exist.
 foreach tool : ['cat', 'cut', 'grep', 'sort', 'tr', 'uname']
-- 
2.50.1.327.g047016eb4a.dirty
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 6/8] meson: fix GIT_EXEC_PATH with overridden -Dlibexecdir=

In 837f637cf51 (meson.build: correct setting of GIT_EXEC_PATH, 2025-05-19) we have fixed how we configure GIT_EXEC_PATH in some cases. It was reported [1] though that this causes a new issue when overriding libexecdir with `-Dlibexecdir=`:

    $ meson setup -Dprefix=/tmp/git -Dlibexecdir=libexec-different
    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different
    $ /tmp/git/bin/git daemon
    git: 'daemon' is not a git command. See 'git --help'.

While we correctly propagate the libexecdir to Git's GIT_EXEC_PATH, we forgot to append 'git-core'. Consequently, it cannot find its binaries anymore.

Fix this issue by appending 'git-core' to libexecdir. With this, things work as expected:

    $ meson install
    $ /tmp/git/bin/git --exec-path
    /tmp/git/libexec-different/git-core
    $ /tmp/git/bin/git daemon -h
    ...
[1]: <66fd343a-1351-4350-83eb-c797e47b7693@gmail.com>
Reported-by: irecca.kun@gmail.com
Based-on-patch-by: irecca.kun@gmail.com
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 meson.build | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to meson.build +1 −1
diff --git a/meson.build b/meson.build
index 02d73188537..ffb1bb61d4a 100644
--- a/meson.build
+++ b/meson.build
@@ -1599,7 +1599,7 @@ endif
 git_exec_path = 'libexec/git-core'
 libexec = get_option('libexecdir')
 if libexec != 'libexec' and libexec != '.'
-  git_exec_path = libexec
+  git_exec_path = libexec / 'git-core'
 endif
 
 if get_option('runtime_prefix')
-- 
2.50.1.327.g047016eb4a.dirty
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 7/8] meson: update subproject wrappers

Update subproject wrappers to newer versions by executing `meson wrap update` in the project's root directory

Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 subprojects/expat.wrap | 18 +++++++++---------
 subprojects/pcre2.wrap | 18 +++++++++---------
 2 files changed, 18 insertions(+), 18 deletions(-)
Show changes to 2 files +18 −18

subprojects/expat.wrap, subprojects/pcre2.wrap

diff --git a/subprojects/expat.wrap b/subprojects/expat.wrap
index 2e0427dcfd1..0e9292f97bf 100644
--- a/subprojects/expat.wrap
+++ b/subprojects/expat.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = expat-2.6.3
-source_url = https://github.com/libexpat/libexpat/releases/download/R_2_6_3/expat-2.6.3.tar.xz
-source_filename = expat-2.6.3.tar.bz2
-source_hash = 274db254a6979bde5aad404763a704956940e465843f2a9bd9ed7af22e2c0efc
-patch_filename = expat_2.6.3-1_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.6.3-1/get_patch
-patch_hash = cf017fbe105e31428b2768360bd9be39094df4e948a1e8d1c54b6f7c76460cb1
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.6.3-1/expat-2.6.3.tar.bz2
-wrapdb_version = 2.6.3-1
+directory = expat-2.7.1
+source_url = https://github.com/libexpat/libexpat/releases/download/R_2_7_1/expat-2.7.1.tar.xz
+source_filename = expat-2.7.1.tar.bz2
+source_hash = 354552544b8f99012e5062f7d570ec77f14b412a3ff5c7d8d0dae62c0d217c30
+patch_filename = expat_2.7.1-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.7.1-1/get_patch
+patch_hash = fe28cbbc427a7c9787d08b969ad54d19f59d8dd18294b4a18651cecfc789d4ef
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/expat_2.7.1-1/expat-2.7.1.tar.bz2
+wrapdb_version = 2.7.1-1
 
 [provide]
 expat = expat_dep
diff --git a/subprojects/pcre2.wrap b/subprojects/pcre2.wrap
index 7e184472543..f45c968e2f3 100644
--- a/subprojects/pcre2.wrap
+++ b/subprojects/pcre2.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = pcre2-10.44
-source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.bz2
-source_filename = pcre2-10.44.tar.bz2
-source_hash = d34f02e113cf7193a1ebf2770d3ac527088d485d4e047ed10e5d217c6ef5de96
-patch_filename = pcre2_10.44-2_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.44-2/get_patch
-patch_hash = 4336d422ee9043847e5e10dbbbd01940d4c9e5027f31ccdc33a7898a1ca94009
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.44-2/pcre2-10.44.tar.bz2
-wrapdb_version = 10.44-2
+directory = pcre2-10.45
+source_url = https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.45/pcre2-10.45.tar.bz2
+source_filename = pcre2-10.45.tar.bz2
+source_hash = 21547f3516120c75597e5b30a992e27a592a31950b5140e7b8bfde3f192033c4
+patch_filename = pcre2_10.45-2_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/pcre2_10.45-2/get_patch
+patch_hash = 7c6f34b703708652a404f9dc2769c67658c437b6043573295fa3428a9b7a6807
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/pcre2_10.45-2/pcre2-10.45.tar.bz2
+wrapdb_version = 10.45-2
 
 [provide]
 libpcre2-8 = libpcre2_8
-- 
2.50.1.327.g047016eb4a.dirty
Patrick Steinhardt· Jul 9, 2025, 06:23 UTC · re: Patrick Steinhardt · lore

[PATCH v3 8/8] ci: use Meson's new `--slice` option

As executing our test suite is notoriously slow on Windows we use matrix jobs in our CI systems to slice up tests and run them via multiple jobs. On Meson this is done with a comparatively complex PowerShell invocation as Meson didn't yet have a native way to slice tests like this.

I have upstreamed a new `--slice` option [1] that addresses this use case though, which has been merged and released with Meson 1.8. Both GitLab and GitHub CI have Meson 1.8.2 available by now, so let's update the jobs to use that new option.

[1]: https://github.com/mesonbuild/meson/pull/14092
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
 .github/workflows/main.yml | 2 +-
 .gitlab-ci.yml             | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
Show changes to 2 files +2 −2

.github/workflows/main.yml, .gitlab-ci.yml

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 7dbf9f7f123..d122e79415a 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -298,7 +298,7 @@ jobs:
         path: build
     - name: Test
       shell: pwsh
-      run: meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % 10 } | Where-Object Name -EQ ${{ matrix.nr }} | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group }
+      run: meson test -C build --no-rebuild --print-errorlogs --slice "$(1+${{ matrix.nr }})/10"
 
   regular:
     name: ${{matrix.vector.jobname}} (${{matrix.vector.pool}})
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bb6d5b976cd..af10ebb59a3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -178,7 +178,7 @@ test:msvc-meson:
     - job: "build:msvc-meson"
       artifacts: true
   script:
-    - meson test -C build --list | Select-Object -Skip 1 | Select-String .* | Group-Object -Property { $_.LineNumber % $Env:CI_NODE_TOTAL + 1 } | Where-Object Name -EQ $Env:CI_NODE_INDEX | ForEach-Object { meson test -C build --no-rebuild --print-errorlogs $_.Group; if (!$?) { exit $LASTEXITCODE } }
+    - meson test -C build --no-rebuild --print-errorlogs --slice $Env:CI_NODE_INDEX/$Env:CI_NODE_TOTAL
   parallel: 10
 
 test:fuzz-smoke-tests:
-- 
2.50.1.327.g047016eb4a.dirty
Justin Tobler· Jul 9, 2025, 21:37 UTC · re: Patrick Steinhardt · lore

Re: [PATCH v3 0/8] A handful of Meson cleanups and improvements

On 25/07/09 08:23AM, Patrick Steinhardt wrote:
Show 15 quoted lines
> Hi,
> 
> this patch series contains a couple of more-or-less random cleanups and
> improvements for Meson that I have accumulated over the last two months.
> 
> Changes in v2:
>   - Fix an off-by-one error for test slices used in GitHub Workflows.
>   - Now tested with both GitLab (https://gitlab.com/gitlab-org/git/-/merge_requests/375)
>     and GitHub (https://github.com/git/git/pull/2010).
>   - Link to v1: https://lore.kernel.org/r/20250703-b4-pks-meson-cleanups-v1-0-2804c2932abe@pks.im
> 
> Changes in v3:
>   - Add a comment explaining why we only need to search for Python on
>     the build target.
>   - Link to v2: https://lore.kernel.org/r/20250708-b4-pks-meson-cleanups-v2-0-94ac53cd4b95@pks.im
Thanks Patrick! From the range-diff, this version looks good to me :)
-Justin

← back to recent threads