git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v5] build: regenerate config-list.h when Documentation changes

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Feb 19, 2026, 10:19 UTC
Message-ID
<fe5bb243-6205-41d1-9dad-7a1e2e42fbec@gmail.com>
In-Reply-To
<611a94cd988e3795bc63dba2f1b270aa0d058bd2.1771425395.git.ben.knoble+github@gmail.com>
Hi Ben

I tested the meson changes by setting up source and build directories with daft names to test the quoting.

$ git worktree add --detach '/dev/shm/s#r#c dir' $ cd '/dev/shm/s#r#c dir' $ meson setup '/dev/shm/b#u&i ld'

If I build git and then remove Documentation/config/add.adoc config-list.h is regenerated, it is not regenerated if I do not change any of the config documentation files so it looks to be working correctly. I've not tested the Makefile changes.

Thanks for working on it
Phillip
On 18/02/2026 14:37, D. Ben Knoble wrote:
Show 224 quoted lines
> 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. 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. Also mark the
> generator script as a dependency.
> 
> While we're at it, teach the Makefile to use the same "the script knows
> it's dependencies" logic.
> 
> For Meson, combining the following commands helps debug dependencies:
> 
>      ninja -C <builddir> -t deps config-list.h
>      ninja -C <builddir> -t browse config-list.h
> 
> The former lists all the dependencies discovered from our output ".d"
> file (the config documentation) and the latter shows the dependency on
> the script itself, among other useful edges in the dependency graph.
> 
> Helped-by: Patrick Steinhardt <ps@pks.im>
> Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
> ---
> 
> Notes (benknoble/commits):
>      Changes from v4 (<9cdcc9de04f0f8fff657f0474b31c063466ed808.1771280837.git.ben.knoble+github@gmail.com>):
>      
>      • Include Patrick's suggested Makefile changes. Note there's no quiet
>        equivalent for mdkir that isn't for the current target's containing
>        directory…
>      • Make depfile output efficient again, thanks to Phillip.
>      
>      I've kept printf instead of echo (from Patrick/Junio) because I think it
>      is easier to reason about ("it works" vs. "did I use this in a way that
>      might cause problems").
>      
>      Junio asked about other problematic bytes: the other one I could think
>      of (since all the inputs should be paths, anyway) is newlines. I gave
>      meson's depfile.py a glance [1], and it looks like they don't handle
>      newlines in paths. Other whitespace doesn't appear to be an issue (see
>      "elif c in {' ', '\n'}"); I think _most_ characters are just added to
>      the filename.
>      
>      [1]: https://github.com/mesonbuild/meson/blob/master/mesonbuild/depfile.py
> 
>   Makefile               |  5 +++--
>   generate-configlist.sh | 11 ++++++++++-
>   meson.build            |  5 ++++-
>   3 files changed, 17 insertions(+), 4 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 7f37ad8f58..6f926ffb1f 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -2688,9 +2688,10 @@ $(BUILT_INS): git$X
>   	cp $< $@
>   
>   config-list.h: generate-configlist.sh
> +	@mkdir -p .depend
> +	$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@ .depend/config-list.h.d
>   
> -config-list.h: Documentation/*config.adoc Documentation/config/*.adoc
> -	$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@
> +-include .depend/config-list.h.d
>   
>   command-list.h: generate-cmdlist.sh command-list.txt
>   
> diff --git a/generate-configlist.sh b/generate-configlist.sh
> index 75c39ade20..39ac8845ab 100755
> --- a/generate-configlist.sh
> +++ b/generate-configlist.sh
> @@ -2,10 +2,11 @@
>   
>   SOURCE_DIR="$1"
>   OUTPUT="$2"
> +DEPFILE="$3"
>   
>   if test -z "$SOURCE_DIR" || ! test -d "$SOURCE_DIR" || test -z "$OUTPUT"
>   then
> -	echo >&2 "USAGE: $0 <SOURCE_DIR> <OUTPUT>"
> +	echo >&2 "USAGE: $0 <SOURCE_DIR> <OUTPUT> [<DEPFILE>]"
>   	exit 1
>   fi
>   
> @@ -36,3 +37,11 @@ print_config_list () {
>   	echo
>   	print_config_list
>   } >"$OUTPUT"
> +
> +if test -n "$DEPFILE"
> +then
> +	QUOTED_OUTPUT="$(printf '%s\n' "$OUTPUT" | sed 's,[&/\],\\&,g')"
> +	printf '%s\n' "$SOURCE_DIR"/Documentation/*config.adoc \
> +		"$SOURCE_DIR"/Documentation/config/*.adoc |
> +		sed -e 's/[# ]/\\&/g' -e "s/^/$QUOTED_OUTPUT: /" >"$DEPFILE"
> +fi
> diff --git a/meson.build b/meson.build
> index 762e2d0fc0..74b459b004 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -720,11 +720,14 @@ endif
>   
>   builtin_sources += custom_target(
>     output: 'config-list.h',
> +  depfile: 'config-list.h.d',
> +  depend_files: [ 'generate-configlist.sh' ],
>     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,
>   )
> 
> Diff-intervalle contre v4 :
> 1:  e2f4e1f9ba < -:  ---------- completion: add stash import, export
> 2:  9cdcc9de04 ! 1:  611a94cd98 meson: regenerate config-list.h when Documentation changes
>      @@ Metadata
>       Author: D. Ben Knoble <ben.knoble+github@gmail.com>
>       
>        ## Commit message ##
>      -    meson: regenerate config-list.h when Documentation changes
>      +    build: regenerate config-list.h when Documentation changes
>       
>           The Meson-based build doesn't know when to rebuild config-list.h, so the
>           header is sometimes stale.
>      @@ Commit message
>           of dependency files, since Meson does not have (or want) builtin support
>           for globbing like Make. 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.
>      +    to include that new file, and that will trigger a rebuild. Also mark the
>      +    generator script as a dependency.
>       
>      -    Also mark the generator script as a dependency.
>      +    While we're at it, teach the Makefile to use the same "the script knows
>      +    it's dependencies" logic.
>       
>      -    Combining the following commands helps debug dependencies:
>      +    For Meson, combining the following commands helps debug dependencies:
>       
>               ninja -C <builddir> -t deps config-list.h
>               ninja -C <builddir> -t browse config-list.h
>      @@ Commit message
>       
>       
>        ## Notes (benknoble/commits) ##
>      -    Changes from v3 (<0a344f1f3ee4a5d95c6f46df030b9936db4354a1.1770853297.git.ben.knoble+github@gmail.com>):
>      +    Changes from v4 (<9cdcc9de04f0f8fff657f0474b31c063466ed808.1771280837.git.ben.knoble+github@gmail.com>):
>       
>      -    • Include the script itself as a dependency via depfile
>      -    • Fix output path escaping (spaces, octothorpes; drop backslashes) for
>      -      Ninja (I've used a loop because I couldn't find a portable construct
>      -      that could escape only the remainder of the lines in the way I
>      -      wanted).
>      -    • Mention our assumptions about Documentation updates triggering
>      -      rebuilds
>      -    • Also include some debugging information in the commit message
>      +    • Include Patrick's suggested Makefile changes. Note there's no quiet
>      +      equivalent for mdkir that isn't for the current target's containing
>      +      directory…
>      +    • Make depfile output efficient again, thanks to Phillip.
>      +
>      +    I've kept printf instead of echo (from Patrick/Junio) because I think it
>      +    is easier to reason about ("it works" vs. "did I use this in a way that
>      +    might cause problems").
>      +
>      +    Junio asked about other problematic bytes: the other one I could think
>      +    of (since all the inputs should be paths, anyway) is newlines. I gave
>      +    meson's depfile.py a glance [1], and it looks like they don't handle
>      +    newlines in paths. Other whitespace doesn't appear to be an issue (see
>      +    "elif c in {' ', '\n'}"); I think _most_ characters are just added to
>      +    the filename.
>      +
>      +    [1]: https://github.com/mesonbuild/meson/blob/master/mesonbuild/depfile.py
>      +
>      + ## Makefile ##
>      +@@ Makefile: $(BUILT_INS): git$X
>      + 	cp $< $@
>      +
>      + config-list.h: generate-configlist.sh
>      ++	@mkdir -p .depend
>      ++	$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@ .depend/config-list.h.d
>      +
>      +-config-list.h: Documentation/*config.adoc Documentation/config/*.adoc
>      +-	$(QUIET_GEN)$(SHELL_PATH) ./generate-configlist.sh . $@
>      ++-include .depend/config-list.h.d
>      +
>      + command-list.h: generate-cmdlist.sh command-list.txt
>      +
>       
>        ## generate-configlist.sh ##
>       @@
>      @@ generate-configlist.sh: print_config_list () {
>       +
>       +if test -n "$DEPFILE"
>       +then
>      -+	for doc in "$SOURCE_DIR"/Documentation/*config.adoc \
>      -+		"$SOURCE_DIR"/Documentation/config/*.adoc
>      -+	do
>      -+		printf "$OUTPUT: %s\n" "$(printf '%s\n' "$doc" | sed 's/[# ]/\\&/g')"
>      -+	done >"$DEPFILE"
>      ++	QUOTED_OUTPUT="$(printf '%s\n' "$OUTPUT" | sed 's,[&/\],\\&,g')"
>      ++	printf '%s\n' "$SOURCE_DIR"/Documentation/*config.adoc \
>      ++		"$SOURCE_DIR"/Documentation/config/*.adoc |
>      ++		sed -e 's/[# ]/\\&/g' -e "s/^/$QUOTED_OUTPUT: /" >"$DEPFILE"
>       +fi
>       
>        ## meson.build ##
> 
> base-commit: f7e9f6c205466443107228e036b20acb7baa8c50
Previous: D. Ben KnobleNext: D. Ben Knoble
Message 20 of 46 in “meson: regenerate config-list.h when Documentation changes”
  1. meson: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 7, 2026
  2. Ben KnobleFeb 7, 2026
  3. meson: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 9, 2026
  4. meson: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 11, 2026
  5. Patrick SteinhardtFeb 12, 2026
  6. Phillip WoodFeb 12, 2026
  7. Phillip WoodFeb 12, 2026
  8. Ben KnobleFeb 12, 2026
  9. meson: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 16, 2026
  10. Ben KnobleFeb 17, 2026
  11. Patrick SteinhardtFeb 17, 2026
  12. D. Ben KnobleFeb 17, 2026
  13. Patrick SteinhardtFeb 17, 2026
  14. D. Ben KnobleFeb 17, 2026
  15. Junio C HamanoFeb 17, 2026
  16. Phillip WoodFeb 17, 2026
  17. D. Ben KnobleFeb 17, 2026
  18. Phillip WoodFeb 17, 2026
  19. build: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 18, 2026
  20. Phillip WoodFeb 19, 2026
  21. D. Ben KnobleFeb 19, 2026
  22. Patrick SteinhardtFeb 19, 2026
  23. D. Ben KnobleFeb 21, 2026
  24. Marc BranchaudFeb 19, 2026
  25. D. Ben KnobleFeb 21, 2026
  26. build: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 21, 2026
  27. Patrick SteinhardtFeb 23, 2026
  28. SZEDER GáborFeb 23, 2026
  29. Ben KnobleFeb 23, 2026
  30. Patrick SteinhardtFeb 24, 2026
  31. Phillip WoodFeb 24, 2026
  32. D. Ben KnobleFeb 24, 2026
  33. build: regenerate config-list.h when Documentation changesD. Ben Knoble, Feb 24, 2026
  34. Junio C HamanoFeb 25, 2026
  35. Ben KnobleFeb 26, 2026
  36. Patrick SteinhardtFeb 9, 2026
  37. D. Ben KnobleFeb 9, 2026
  38. Patrick SteinhardtFeb 11, 2026
  39. Phillip WoodFeb 11, 2026
  40. Phillip WoodFeb 11, 2026
  41. Patrick SteinhardtFeb 11, 2026
  42. Patrick SteinhardtFeb 11, 2026
  43. Phillip WoodFeb 11, 2026
  44. D. Ben KnobleFeb 11, 2026
  45. D. Ben KnobleFeb 11, 2026
  46. Patrick SteinhardtFeb 12, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.