[PATCH v7] 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.
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.
Since Meson does not have (or want) builtin support for globbing like Make, teach generate-configlist.sh to also generate a list of Documentation files its output depends on, and incorporate that into the Meson build. We honor the undocumented GCC/Clang contract of outputting empty targets for all the dependencies (like they do with -MP). That is, generate lines like
build/config-list.h: $SOURCE_DIR/Documentation/config.adoc
$SOURCE_DIR/Documentation/config.adoc: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.hThe 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 v6 (<5dcd4e9308100a25603c50fecb36447c0ee4df62.1771682788.git.ben.knoble+github@gmail.com>):
• Fix Make-based builds when a dependency is removed by generating the
expected empty targets. (Thanks to a report from Szeder Gábor.) Makefile | 5 +++--
generate-configlist.sh | 16 +++++++++++++++-
meson.build | 5 ++++-
3 files changed, 22 insertions(+), 4 deletions(-)
Show changes to 3 files +22 −4
Makefile, generate-configlist.sh, meson.build
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..e28054f9e0 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,16 @@ 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: /"
+ printf '%s:\n' "$SOURCE_DIR"/Documentation/*config.adoc \
+ "$SOURCE_DIR"/Documentation/config/*.adoc |
+ sed -e 's/[# ]/\\&/g'
+ } >"$DEPFILE"
+fi
diff --git a/meson.build b/meson.build
index 6f155beafa..4b536e0124 100644
--- a/meson.build
+++ b/meson.build
@@ -722,11 +722,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 v6 :
1: 7ffbde5f8a ! 1: 4ef96c6bbf build: regenerate config-list.h when Documentation changes
@@ Commit message
Since Meson does not have (or want) builtin support for globbing like
Make, teach generate-configlist.sh to also generate a list of
Documentation files its output depends on, and incorporate that into the
- Meson build.
+ Meson build. We honor the undocumented GCC/Clang contract of outputting
+ empty targets for all the dependencies (like they do with -MP). That is,
+ generate lines like
+
+ build/config-list.h: $SOURCE_DIR/Documentation/config.adoc
+ $SOURCE_DIR/Documentation/config.adoc:
We assume that if a user adds a new file under
Documentation/config then they will also edit one of the existing files
@@ Commit message
## Notes (benknoble/commits) ##
- Changes from v5 (<611a94cd988e3795bc63dba2f1b270aa0d058bd2.1771425395.git.ben.knoble+github@gmail.com>):
+ Changes from v6 (<5dcd4e9308100a25603c50fecb36447c0ee4df62.1771682788.git.ben.knoble+github@gmail.com>):
- • Reword a confusing sentence in the commit message
+ • Fix Make-based builds when a dependency is removed by generating the
+ expected empty targets. (Thanks to a report from Szeder Gábor.)
## Makefile ##
@@ Makefile: $(BUILT_INS): git$X
@@ generate-configlist.sh: print_config_list () {
+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"
++ {
++ printf '%s\n' "$SOURCE_DIR"/Documentation/*config.adoc \
++ "$SOURCE_DIR"/Documentation/config/*.adoc |
++ sed -e 's/[# ]/\\&/g' -e "s/^/$QUOTED_OUTPUT: /"
++ printf '%s:\n' "$SOURCE_DIR"/Documentation/*config.adoc \
++ "$SOURCE_DIR"/Documentation/config/*.adoc |
++ sed -e 's/[# ]/\\&/g'
++ } >"$DEPFILE"
+fi
## meson.build ##
base-commit: 309c995771be952610fdcff99f7fea96934ce045
--
2.53.0.537.g7ffbde5f8a.dirty