The rule generating the arm64 sysreg header targets the generated
directory, and its only prerequisite is tools/arch/arm64/tools/*,
which expands to the inner Makefile. An existing directory looks up
to date, so an incremental build never regenerates sysreg-defs.h for
a change to the sysreg table. A selftest referencing a register added
to the table since then fails with undeclared SYS_* identifiers. Clean
builds are unaffected.

Always recurse into tools/arch/arm64/tools, whose Makefile already
tracks the generator's inputs, and target the header rather than its
directory. The recursion leaves the header untouched when nothing
changed, so the dependents rebuild only when the header does.

Fixes: 70c7b704ca725 ("KVM: selftests: Avoid using forced target for generating 
arm64 headers")
Link: https://lore.kernel.org/r/[email protected]
Assisted-by: LLM
Signed-off-by: Fuad Tabba <[email protected]>
---
 tools/testing/selftests/kvm/Makefile.kvm | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/kvm/Makefile.kvm 
b/tools/testing/selftests/kvm/Makefile.kvm
index 96bab7002d39e..81dca3dbc16b4 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -303,10 +303,16 @@ arm64_hdr_outdir := $(tools_dir)/
 endif
 
 GEN_HDRS := $(arm64_hdr_outdir)arch/arm64/include/generated/
+GEN_SYSREG_DEFS := $(GEN_HDRS)asm/sysreg-defs.h
 CFLAGS += -I$(GEN_HDRS)
 
-$(GEN_HDRS): $(wildcard $(arm64_tools_dir)/*)
+# The inner Makefile tracks the generator's inputs and leaves the header
+# untouched when nothing changed, so dependents rebuild only when it does.
+$(GEN_SYSREG_DEFS): FORCE
        $(MAKE) -C $(arm64_tools_dir) OUTPUT=$(arm64_hdr_outdir)
+
+FORCE:
+.PHONY: FORCE
 endif
 
 no-pie-option := $(call try-run, echo 'int main(void) { return 0; }' | \
@@ -359,10 +365,10 @@ EXTRA_CLEAN += $(GEN_HDRS) \
               $(TEST_GEN_OBJ) \
               cscope.*
 
-$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c $(GEN_HDRS)
+$(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c $(GEN_SYSREG_DEFS)
        $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
 
-$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(GEN_HDRS)
+$(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(GEN_SYSREG_DEFS)
        $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
 
 # Compile the string overrides as freestanding to prevent the compiler from
@@ -372,10 +378,10 @@ $(LIBKVM_STRING_OBJ): $(OUTPUT)/%.o: %.c
        $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -ffreestanding $< -o $@
 
 $(shell mkdir -p $(sort $(dir $(TEST_GEN_PROGS))))
-$(SPLIT_TEST_GEN_OBJ): $(GEN_HDRS)
+$(SPLIT_TEST_GEN_OBJ): $(GEN_SYSREG_DEFS)
 $(TEST_GEN_PROGS): $(LIBKVM_OBJS)
 $(TEST_GEN_PROGS_EXTENDED): $(LIBKVM_OBJS)
-$(TEST_GEN_OBJ): $(GEN_HDRS)
+$(TEST_GEN_OBJ): $(GEN_SYSREG_DEFS)
 
 cscope: include_paths = $(LINUX_TOOL_INCLUDE) $(LINUX_HDR_PATH) include lib ..
 cscope:
-- 
2.39.5


Reply via email to