Message ID | 20221013130513.52440-15-anthony.perard@citrix.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Toolstack build system improvement, toward non-recursive makefiles | expand |
On 13/10/2022 14:05, Anthony Perard wrote: > No need for $(AUTOSRCS), GNU make can generate them as needed when > trying to build them as needed when trying to build the object. Also, > those two AUTOSRCS don't need to be a prerequisite of "all". As for > the "clean" target, those two files are already removed via "_*.c". > > We don't need $(AUTOINCS) either: > - As for both _libxl_savm_msgs*.h headers, we are adding more > selective dependencies so the headers will still be generated as > needed. > - "clean" rule already delete the _*.h files, so AUTOINCS aren't needed > there. > > "libxl_internal_json.h" doesn't seems to have ever existed, so the > dependency is removed. > > Add few prerequisite for "libxl_internal.h" so all headers that it > depends on should be generated. And have $(SAVE_HELPER_OBJS) depends > on "libxl_internal.h". > > Rework objects prerequisites, to have them dependents on either > "libxl.h" or "libxl_internal.h". "libxl.h" is not normally included > directly in the source code as "libxl_internal.h" is used instead. But > we are adding "libxl.h" as prerequisite of "libxl_internal.h", so > generated headers will still be generated as needed. > > "testidl.c" doesn't depends on "libxl.h" but "testidl.o" does. I'm afraid I don't follow here. How can this be true? ~Andrew
On Fri, Oct 14, 2022 at 07:35:20PM +0000, Andrew Cooper wrote: > On 13/10/2022 14:05, Anthony Perard wrote: > > No need for $(AUTOSRCS), GNU make can generate them as needed when > > trying to build them as needed when trying to build the object. Also, > > those two AUTOSRCS don't need to be a prerequisite of "all". As for > > the "clean" target, those two files are already removed via "_*.c". > > > > We don't need $(AUTOINCS) either: > > - As for both _libxl_savm_msgs*.h headers, we are adding more > > selective dependencies so the headers will still be generated as > > needed. > > - "clean" rule already delete the _*.h files, so AUTOINCS aren't needed > > there. > > > > "libxl_internal_json.h" doesn't seems to have ever existed, so the > > dependency is removed. > > > > Add few prerequisite for "libxl_internal.h" so all headers that it > > depends on should be generated. And have $(SAVE_HELPER_OBJS) depends > > on "libxl_internal.h". > > > > Rework objects prerequisites, to have them dependents on either > > "libxl.h" or "libxl_internal.h". "libxl.h" is not normally included > > directly in the source code as "libxl_internal.h" is used instead. But > > we are adding "libxl.h" as prerequisite of "libxl_internal.h", so > > generated headers will still be generated as needed. > > > > "testidl.c" doesn't depends on "libxl.h" but "testidl.o" does. > > I'm afraid I don't follow here. How can this be true? From make point-of-view, in order to generate "testidl.c", we only need to execute "gentest.py" which takes "libxl_types.idl" as input. It doesn't even matter if "libxl.h" exist when generating "testidl.c" via `make testidl.c`. "libxl.h" is only used later when compiling "testidl.c" into "testidl.o". I can probably expand the commit message to better explain this. Thanks,
diff --git a/tools/libs/light/Makefile b/tools/libs/light/Makefile index 9329055c98..274e8350bb 100644 --- a/tools/libs/light/Makefile +++ b/tools/libs/light/Makefile @@ -147,9 +147,6 @@ LIBXL_TEST_OBJS += $(foreach t, $(LIBXL_TESTS_INSIDE),libxl_test_$t.opic) TEST_PROG_OBJS += $(foreach t, $(LIBXL_TESTS_PROGS),test_$t.o) test_common.o TEST_PROGS += $(foreach t, $(LIBXL_TESTS_PROGS),test_$t) -AUTOINCS = _libxl_save_msgs_callout.h _libxl_save_msgs_helper.h -AUTOSRCS = _libxl_save_msgs_callout.c _libxl_save_msgs_helper.c - CLIENTS = testidl libxl-save-helper SAVE_HELPER_OBJS = libxl_save_helper.o _libxl_save_msgs_helper.o @@ -177,13 +174,13 @@ libxl_x86_acpi.o libxl_x86_acpi.opic: CFLAGS += -I$(XEN_ROOT)/tools $(SAVE_HELPER_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenevtchn) $(CFLAGS_libxenguest) testidl.o: CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenlight) -testidl.c: libxl_types.idl gentest.py $(XEN_INCLUDE)/libxl.h $(AUTOINCS) - $(PYTHON) gentest.py libxl_types.idl testidl.c.new - mv testidl.c.new testidl.c +testidl.c: libxl_types.idl gentest.py + $(PYTHON) gentest.py $< $@.new + mv -f $@.new $@ -all: $(CLIENTS) $(TEST_PROGS) $(AUTOSRCS) $(AUTOINCS) +all: $(CLIENTS) $(TEST_PROGS) -$(OBJS-y) $(PIC_OBJS) $(SAVE_HELPER_OBJS) $(LIBXL_TEST_OBJS) $(TEST_PROG_OBJS): $(AUTOINCS) libxl.api-ok +$(OBJS-y) $(PIC_OBJS) $(SAVE_HELPER_OBJS) $(LIBXL_TEST_OBJS) $(TEST_PROG_OBJS): libxl.api-ok $(DSDT_FILES-y): acpi @@ -195,7 +192,7 @@ libxl.api-ok: check-libxl-api-rules _libxl.api-for-check $(PERL) $^ touch $@ -_libxl.api-for-check: $(XEN_INCLUDE)/libxl.h $(AUTOINCS) +_libxl.api-for-check: $(XEN_INCLUDE)/libxl.h $(CC) $(CPPFLAGS) $(CFLAGS) -c -E $< $(APPEND_CFLAGS) \ -DLIBXL_EXTERNAL_CALLERS_ONLY=LIBXL_EXTERNAL_CALLERS_ONLY \ >$@.new @@ -207,13 +204,22 @@ _libxl_save_msgs_helper.h _libxl_save_msgs_callout.h: \ $(PERL) -w $< $@ >$@.new $(call move-if-changed,$@.new,$@) +# +# headers dependencies on generated headers +# $(XEN_INCLUDE)/libxl.h: $(XEN_INCLUDE)/_libxl_types.h $(XEN_INCLUDE)/libxl_json.h: $(XEN_INCLUDE)/_libxl_types_json.h +libxl_internal.h: $(XEN_INCLUDE)/libxl.h $(XEN_INCLUDE)/libxl_json.h libxl_internal.h: _libxl_types_internal.h _libxl_types_private.h _libxl_types_internal_private.h -libxl_internal_json.h: _libxl_types_internal_json.h +libxl_internal.h: _libxl_save_msgs_callout.h -$(OBJS-y) $(PIC_OBJS) $(LIBXL_TEST_OBJS) $(TEST_PROG_OBJS) $(SAVE_HELPER_OBJS): $(XEN_INCLUDE)/libxl.h +# +# objects dependencies on headers that depends on generated headers +# +$(TEST_PROG_OBJS): $(XEN_INCLUDE)/libxl.h $(OBJS-y) $(PIC_OBJS) $(LIBXL_TEST_OBJS): libxl_internal.h +$(SAVE_HELPER_OBJS): $(XEN_INCLUDE)/libxl.h _libxl_save_msgs_helper.h +testidl.o: $(XEN_INCLUDE)/libxl.h # This exploits the 'multi-target pattern rule' trick. # gentypes.py should be executed only once to make all the targets. @@ -260,5 +266,4 @@ clean:: $(RM) testidl.c.new testidl.c *.api-ok $(RM) $(TEST_PROGS) libxenlight_test.so libxl_test_*.opic $(RM) -r __pycache__ - $(RM) $(AUTOSRCS) $(AUTOINCS) $(MAKE) -C $(ACPI_PATH) ACPI_BUILD_DIR=$(CURDIR) clean
No need for $(AUTOSRCS), GNU make can generate them as needed when trying to build them as needed when trying to build the object. Also, those two AUTOSRCS don't need to be a prerequisite of "all". As for the "clean" target, those two files are already removed via "_*.c". We don't need $(AUTOINCS) either: - As for both _libxl_savm_msgs*.h headers, we are adding more selective dependencies so the headers will still be generated as needed. - "clean" rule already delete the _*.h files, so AUTOINCS aren't needed there. "libxl_internal_json.h" doesn't seems to have ever existed, so the dependency is removed. Add few prerequisite for "libxl_internal.h" so all headers that it depends on should be generated. And have $(SAVE_HELPER_OBJS) depends on "libxl_internal.h". Rework objects prerequisites, to have them dependents on either "libxl.h" or "libxl_internal.h". "libxl.h" is not normally included directly in the source code as "libxl_internal.h" is used instead. But we are adding "libxl.h" as prerequisite of "libxl_internal.h", so generated headers will still be generated as needed. "testidl.c" doesn't depends on "libxl.h" but "testidl.o" does. Also use automatic variables $< and $@. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> --- Notes: v4: - new patch tools/libs/light/Makefile | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-)