libs/util: Fix parallel build between flex/bison and CC rules

flex/bison generate two targets, and when those targets are
prerequisite of other rules they are considered independently by make.

We can have a situation where the .c file is out-of-date but not the
.h, git checkout for example. In this case, if a rule only have the .h
file as prerequiste, make will procced and start to build the object.
In parallel, another target can have the .c file as prerequisite and
make will find out it need re-generating and do so, changing the .h at
the same time. This parallel task breaks the first one.

To avoid this scenario, we put both the header and the source as
prerequisite for all object even if they only need the header.

Reported-by: Andrew Cooper <Andrew.Cooper3@citrix.com>
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: bf652a50fb
master date: 2023-02-09 18:26:17 +0000
This commit is contained in:
Anthony PERARD authored and Jan Beulich committed 2023-03-03 08:06:23 +01:00
1 parent 0802504627
commit e4b5dff3d0
1 file changed
+8
+8
View File
@@ -41,6 +41,14 @@ include $(XEN_ROOT)/tools/libs/libs.mk
$(LIB_OBJS) $(PIC_OBJS): $(AUTOINCS) _paths.h
# Adding the .c conterparts of the headers generated by flex/bison as
# prerequisite of all objects.
# This is to tell make that if only the .c file is out-of-date but not the
# header, it should still wait for the .c file to be rebuilt.
# Otherwise, make doesn't considered "%.c %.h" as grouped targets, and will run
# the flex/bison rules in parallel of CC rules which only need the header.
$(LIB_OBJS) $(PIC_OBJS): libxlu_cfg_l.c libxlu_cfg_y.c libxlu_disk_l.c
%.c %.h:: %.y
@rm -f $*.[ch]
$(BISON) --output=$*.c $<
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.