Subject: Re: [PATCH v3] meson: regenerate config-list.h when Documentation changes

From: Phillip Wood <[email-masked]>
Date: Thu, 12 Feb 2026 10:29:39 +0000

Hi Ben

On 11/02/2026 23:51, D. Ben Knoble wrote:
> The Meson-based build doesn't know when to rebuild config-list.h, so the
> header is sometimes stale.
> 
> For example, an old build directory might have config-list.h from before
> 4173df5187 (submodule: introduce extensions.submodulePathConfig,
> 2026-01-12), which added submodule.<name>.gitdir to the list. Without
> it, t9902-completion.sh fails. Regenerating the config-list.h artifact
> from sources fixes the artifact and the test.
> 
> Teach the meson build to depend on the Documentation files that
> generate-configlist.sh reads by having it an additional output as a list
> of dependency files, since Meson does not have (or want) builtin support
> for globbing like Make.

It would be useful to mention that we assume that if a user adds a new 
file under Documentation/config then they will also edit one of the 
existing files to include that new file and that will trigger a rebuild.

> Helped-by: Patrick Steinhardt <[email-masked]>
> Signed-off-by: D. Ben Knoble <[email-masked]>
> ---
> 
> Notes (benknoble/commits):
>      Changes from v2 (<c9ae171ee[email-masked]>):
>      
>      • Pick up (and tweak) Patrick's depfile proposal
>      • Include the script itself as a dependency
>      • Escape output paths (spaces, octothorpes, and backslashes) for Ninja
>      
>      I'm not 100% sure I've actually done the escaping correctly, though,
>      since Ninja's source says that a space preceded by 2N backslashes
>      represents 2N backslashes at the end of a filename, and
>      
>          λ printf '%s\n' 'foo\' | sed 's/[# \\]/\\&/g' | xxd
>          00000000: 666f 6f5c 5c0a                           foo\\.
>      
>      So would they interpret that as the filename 'foo\\' instead of 'foo\' ?
>      (Or, no because the 2N slashes aren't followed by a SP, but a NL?)

Having re-read the ninja source I agree with Patrick that we should not 
be escaping backslashes

> +if test -n "$DEPFILE"
> +then
> +	printf "$OUTPUT: %s\n" "$0" "$SOURCE_DIR"/Documentation/*config.adoc \
> +	    "$SOURCE_DIR"/Documentation/config/*.adoc |
> +	    sed 's/[# \\]/\\&/g' >"$DEPFILE"

This will escape the space after "$OUTPUT:" which is not what we want.

	printf '%s\n' ... | sed "s/[# ]/\\&/g; s|^|$OUTPUT|" >"$DEPFILE"

should work so long as $OUTPUT does not contain any '|' characters.

Thanks

Phillip

> +fi
> diff --git a/meson.build b/meson.build
> index 3a1d12caa4..fb5d7367f5 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -720,11 +720,13 @@ endif
>   
>   builtin_sources += custom_target(
>     output: 'config-list.h',
> +  depfile: 'config-list.h.d',
>     command: [
>       shell,
> -    meson.current_source_dir() + '/generate-configlist.sh',
> +    meson.current_source_dir() / 'generate-configlist.sh',
>       meson.current_source_dir(),
>       '@OUTPUT@',
> +    '@DEPFILE@',
>     ],
>     env: script_environment,
>   )
> 
> base-commit: 19a08e0c02faf1c5b4efd1add85598cf8390ff7e
> prerequisite-patch-id: 364ba1899740b93be5957262d3583348d030e8fa