* [PATCH] KVM: selftest: Add dependency rules in makefile for C source code @ 2023-01-27 13:36 Yu Zhang 2023-03-15 22:53 ` Sean Christopherson 0 siblings, 1 reply; 3+ messages in thread From: Yu Zhang @ 2023-01-27 13:36 UTC (permalink / raw) To: pbonzini, shuah, seanjc, kvm; +Cc: linux-kselftest, linux-kernel Currently, KVM selftests have to run "make clean && make" to rebuild the entire test suite each time a header file is modified. Define "-MD" as an EXTRA_CFLAGS, so we can generate the dependency rules for each target object, whose prerequisites contains the source file and the included header files as well. And including those dependency files in KVM selftests' makefile will release us from such annoyance. Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com> --- tools/testing/selftests/kvm/Makefile | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 1750f91dd936..b329e0d1a460 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -180,6 +180,8 @@ TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) LIBKVM += $(LIBKVM_$(ARCH_DIR)) +OVERRIDE_TARGETS = 1 + # lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most # importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, # which causes the environment variable to override the makefile). @@ -198,9 +200,11 @@ CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ -fno-builtin-memcmp -fno-builtin-memcpy -fno-builtin-memset \ -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \ -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \ - -I$(<D) -Iinclude/$(ARCH_DIR) -I ../rseq -I.. $(EXTRA_CFLAGS) \ + -I$(<D) -Iinclude/$(ARCH_DIR) -I ../rseq -I.. \ $(KHDR_INCLUDES) +EXTRA_CFLAGS += -MD + no-pie-option := $(call try-run, echo 'int main(void) { return 0; }' | \ $(CC) -Werror $(CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie) @@ -218,11 +222,22 @@ LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) -EXTRA_CLEAN += $(LIBKVM_OBJS) cscope.* +TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) +TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) +TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) +TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) +-include $(TEST_DEP_FILES) + +$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): %: %.o + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ +$(TEST_GEN_OBJ): %.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(EXTRA_CFLAGS) $(TARGET_ARCH) -c $< -o $@ + +EXTRA_CLEAN += $(LIBKVM_OBJS) $(TEST_DEP_FILES) $(TEST_GEN_OBJ) cscope.* x := $(shell mkdir -p $(sort $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)))) $(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c - $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ + $(CC) $(CFLAGS) $(CPPFLAGS) $(EXTRA_CFLAGS) $(TARGET_ARCH) -c $< -o $@ $(LIBKVM_S_OBJ): $(OUTPUT)/%.o: %.S $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ -- 2.25.1 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] KVM: selftest: Add dependency rules in makefile for C source code 2023-01-27 13:36 [PATCH] KVM: selftest: Add dependency rules in makefile for C source code Yu Zhang @ 2023-03-15 22:53 ` Sean Christopherson 2023-03-17 9:09 ` Yu Zhang 0 siblings, 1 reply; 3+ messages in thread From: Sean Christopherson @ 2023-03-15 22:53 UTC (permalink / raw) To: Yu Zhang; +Cc: pbonzini, shuah, kvm, linux-kselftest, linux-kernel On Fri, Jan 27, 2023, Yu Zhang wrote: > Currently, KVM selftests have to run "make clean && make" to rebuild the > entire test suite each time a header file is modified. Define "-MD" as > an EXTRA_CFLAGS, so we can generate the dependency rules for each target > object, whose prerequisites contains the source file and the included header > files as well. And including those dependency files in KVM selftests' makefile > will release us from such annoyance. > > Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com> > --- > tools/testing/selftests/kvm/Makefile | 21 ++++++++++++++++++--- > 1 file changed, 18 insertions(+), 3 deletions(-) > > diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile > index 1750f91dd936..b329e0d1a460 100644 > --- a/tools/testing/selftests/kvm/Makefile > +++ b/tools/testing/selftests/kvm/Makefile > @@ -180,6 +180,8 @@ TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) > TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) > LIBKVM += $(LIBKVM_$(ARCH_DIR)) > > +OVERRIDE_TARGETS = 1 > + > # lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most > # importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, > # which causes the environment variable to override the makefile). > @@ -198,9 +200,11 @@ CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ > -fno-builtin-memcmp -fno-builtin-memcpy -fno-builtin-memset \ > -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \ > -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \ > - -I$(<D) -Iinclude/$(ARCH_DIR) -I ../rseq -I.. $(EXTRA_CFLAGS) \ > + -I$(<D) -Iinclude/$(ARCH_DIR) -I ../rseq -I.. \ > $(KHDR_INCLUDES) > > +EXTRA_CFLAGS += -MD > + > no-pie-option := $(call try-run, echo 'int main(void) { return 0; }' | \ > $(CC) -Werror $(CFLAGS) -no-pie -x c - -o "$$TMP", -no-pie) > > @@ -218,11 +222,22 @@ LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) > LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) > LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) > > -EXTRA_CLEAN += $(LIBKVM_OBJS) cscope.* > +TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) > +TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) > +TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) > +TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) > +-include $(TEST_DEP_FILES) > + > +$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): %: %.o > + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ Do we actually need to omit -MD here? IIUC, it just means that the .d file will get redundantly generated when building the final executable. I would much prefer to build everything with the same options unless there's a good reason not to, e.g. this patch doesn't feed -MD into the LIBKVM_STRING_OBJ target, which seems wrong. I.e. why not simply --- tools/testing/selftests/kvm/Makefile | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile index 152c1a988e42..faaf65aa7621 100644 --- a/tools/testing/selftests/kvm/Makefile +++ b/tools/testing/selftests/kvm/Makefile @@ -182,6 +182,8 @@ TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) LIBKVM += $(LIBKVM_$(ARCH_DIR)) +OVERRIDE_TARGETS = 1 + # lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most # importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, # which causes the environment variable to override the makefile). @@ -196,7 +198,7 @@ else LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include endif CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ - -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-gnu-variable-sized-type-not-at-end -MD \ -fno-builtin-memcmp -fno-builtin-memcpy -fno-builtin-memset \ -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \ -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \ @@ -223,7 +225,18 @@ LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) -EXTRA_CLEAN += $(LIBKVM_OBJS) cscope.* +TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) +TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) +TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) +TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) +-include $(TEST_DEP_FILES) + +$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): %: %.o + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ +$(TEST_GEN_OBJ): %.o: %.c + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ + +EXTRA_CLEAN += $(LIBKVM_OBJS) $(TEST_DEP_FILES) $(TEST_GEN_OBJ) cscope.* x := $(shell mkdir -p $(sort $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)))) $(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c base-commit: 95b9779c1758f03cf494e8550d6249a40089ed1c -- ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] KVM: selftest: Add dependency rules in makefile for C source code 2023-03-15 22:53 ` Sean Christopherson @ 2023-03-17 9:09 ` Yu Zhang 0 siblings, 0 replies; 3+ messages in thread From: Yu Zhang @ 2023-03-17 9:09 UTC (permalink / raw) To: Sean Christopherson Cc: Yu Zhang, pbonzini, shuah, kvm, linux-kselftest, linux-kernel > Do we actually need to omit -MD here? IIUC, it just means that the .d file will > get redundantly generated when building the final executable. I would much prefer > to build everything with the same options unless there's a good reason not to, > e.g. this patch doesn't feed -MD into the LIBKVM_STRING_OBJ target, which seems > wrong. No, we don't. I added "-MD" in EXTRA_CFLAGS, so that only .o files would be impacted when generating dependency files. But it is unnecessary. As to the LIBKVM_STRING_OBJ target, it is my negligence. :) I tried your suggested fix, and it works fine. Will send out v2(based on selftests branch of github.com/kvm-x86/linux). Thanks! B.R. Yu > > I.e. why not simply > > --- > tools/testing/selftests/kvm/Makefile | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile > index 152c1a988e42..faaf65aa7621 100644 > --- a/tools/testing/selftests/kvm/Makefile > +++ b/tools/testing/selftests/kvm/Makefile > @@ -182,6 +182,8 @@ TEST_GEN_PROGS += $(TEST_GEN_PROGS_$(ARCH_DIR)) > TEST_GEN_PROGS_EXTENDED += $(TEST_GEN_PROGS_EXTENDED_$(ARCH_DIR)) > LIBKVM += $(LIBKVM_$(ARCH_DIR)) > > +OVERRIDE_TARGETS = 1 > + > # lib.mak defines $(OUTPUT), prepends $(OUTPUT)/ to $(TEST_GEN_PROGS), and most > # importantly defines, i.e. overwrites, $(CC) (unless `make -e` or `make CC=`, > # which causes the environment variable to override the makefile). > @@ -196,7 +198,7 @@ else > LINUX_TOOL_ARCH_INCLUDE = $(top_srcdir)/tools/arch/$(ARCH)/include > endif > CFLAGS += -Wall -Wstrict-prototypes -Wuninitialized -O2 -g -std=gnu99 \ > - -Wno-gnu-variable-sized-type-not-at-end \ > + -Wno-gnu-variable-sized-type-not-at-end -MD \ > -fno-builtin-memcmp -fno-builtin-memcpy -fno-builtin-memset \ > -fno-stack-protector -fno-PIE -I$(LINUX_TOOL_INCLUDE) \ > -I$(LINUX_TOOL_ARCH_INCLUDE) -I$(LINUX_HDR_PATH) -Iinclude \ > @@ -223,7 +225,18 @@ LIBKVM_S_OBJ := $(patsubst %.S, $(OUTPUT)/%.o, $(LIBKVM_S)) > LIBKVM_STRING_OBJ := $(patsubst %.c, $(OUTPUT)/%.o, $(LIBKVM_STRING)) > LIBKVM_OBJS = $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ) $(LIBKVM_STRING_OBJ) > > -EXTRA_CLEAN += $(LIBKVM_OBJS) cscope.* > +TEST_GEN_OBJ = $(patsubst %, %.o, $(TEST_GEN_PROGS)) > +TEST_GEN_OBJ += $(patsubst %, %.o, $(TEST_GEN_PROGS_EXTENDED)) > +TEST_DEP_FILES = $(patsubst %.o, %.d, $(TEST_GEN_OBJ)) > +TEST_DEP_FILES += $(patsubst %.o, %.d, $(LIBKVM_OBJS)) > +-include $(TEST_DEP_FILES) > + > +$(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): %: %.o > + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $< $(LIBKVM_OBJS) $(LDLIBS) -o $@ > +$(TEST_GEN_OBJ): %.o: %.c > + $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ > + > +EXTRA_CLEAN += $(LIBKVM_OBJS) $(TEST_DEP_FILES) $(TEST_GEN_OBJ) cscope.* > > x := $(shell mkdir -p $(sort $(dir $(LIBKVM_C_OBJ) $(LIBKVM_S_OBJ)))) > $(LIBKVM_C_OBJ): $(OUTPUT)/%.o: %.c > > base-commit: 95b9779c1758f03cf494e8550d6249a40089ed1c > -- > ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-03-17 9:10 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-01-27 13:36 [PATCH] KVM: selftest: Add dependency rules in makefile for C source code Yu Zhang 2023-03-15 22:53 ` Sean Christopherson 2023-03-17 9:09 ` Yu Zhang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).