]> git.ipfire.org Git - thirdparty/git.git/commitdiff
build: regenerate config-list.h when Documentation changes
authorD. Ben Knoble <ben.knoble+github@gmail.com>
Tue, 24 Feb 2026 14:39:44 +0000 (09:39 -0500)
committerJunio C Hamano <gitster@pobox.com>
Tue, 24 Feb 2026 18:51:54 +0000 (10:51 -0800)
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.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>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
generate-configlist.sh
meson.build

index 47ed9fa7fdd1fa79e7dec4bec76025d6b3e98d04..36459299642c53f647ef57c3420a98ac941a4d22 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2687,9 +2687,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
 
index 75c39ade20939dee89090da80e61c330bf8b84a9..e28054f9e0e9bada23c3de046a047b6d6d69bfc2 100755 (executable)
@@ -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 @@ EOF
        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
index 3a1d12caa4b94fd36bec5fdc17db17543368b9da..e4b8f1e33d284ebb10c6fadf3e44f9fa7d1af6bb 100644 (file)
@@ -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,
 )