There is a rare make race that occurs in bash due to the way it constructs certain headers and a build tool. Restructure the creation to remove the race.
[YOCTO #14227] Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org> --- .../bash/bash/makerace2.patch | 98 +++++++++++++++++++ meta/recipes-extended/bash/bash_5.1.8.bb | 1 + 2 files changed, 99 insertions(+) create mode 100644 meta/recipes-extended/bash/bash/makerace2.patch diff --git a/meta/recipes-extended/bash/bash/makerace2.patch b/meta/recipes-extended/bash/bash/makerace2.patch new file mode 100644 index 00000000000..43cdd041579 --- /dev/null +++ b/meta/recipes-extended/bash/bash/makerace2.patch @@ -0,0 +1,98 @@ +The main makefile can call mkbuiltins from multiple different codepaths in parallel. +When called, it moves the existing files out the way and creates new ones, then +compares which will break the build if timing is unlucky. + +The root of the problem is mkbuiltins.c creating a file but also referencing that +file under the same name. By modifing it to allow the final name and the temp name +to be specified, we can avoid the original reason for the moving of files around. +This allows them to be created under a new name and then replaced if changed, +removing any race windows around accessing the files whilst they've been +moved or are being rewritten. + +See [YOCTO #14227] + +Upstream-Status: Pending +Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org> + +Index: bash-5.1.8/builtins/Makefile.in +=================================================================== +--- bash-5.1.8.orig/builtins/Makefile.in ++++ bash-5.1.8/builtins/Makefile.in +@@ -185,19 +185,17 @@ gen-helpfiles: tmpbuiltins.o gen-helpfil + $(CC_FOR_BUILD) ${CCFLAGS_FOR_BUILD} $(LDFLAGS_FOR_BUILD) -o $@ gen-helpfiles.o tmpbuiltins.o $(LIBS_FOR_BUILD) + + builtext.h builtins.c: $(MKBUILTINS) $(DEFSRC) +- @-if test -f builtins.c; then mv -f builtins.c old-builtins.c; fi +- @-if test -f builtext.h; then mv -f builtext.h old-builtext.h; fi +- ./$(MKBUILTINS) -externfile builtext.h -structfile builtins.c \ ++ ./$(MKBUILTINS) -externfile builtext-new.h -externfinalfile builtext.h -structfile builtins-new.c \ + -noproduction $(DIRECTDEFINE) $(HELPDIRDEFINE) $(HELPSTRINGS) $(DEFSRC) +- @-if cmp -s old-builtext.h builtext.h 2>/dev/null; then \ +- mv old-builtext.h builtext.h; \ ++ @-if ! cmp -s builtext.h builtext-new.h 2>/dev/null; then \ ++ mv builtext-new.h builtext.h; \ + else \ +- $(RM) old-builtext.h; \ ++ $(RM) builtext-new.h; \ + fi +- @-if cmp -s old-builtins.c builtins.c 2>/dev/null; then \ +- mv old-builtins.c builtins.c; \ ++ @-if ! cmp -s builtins.c builtins-new.c 2>/dev/null; then \ ++ mv builtins-new.c builtins.c; \ + else \ +- $(RM) old-builtins.c; \ ++ $(RM) builtins-new.c; \ + fi + + helpdoc: gen-helpfiles +Index: bash-5.1.8/builtins/mkbuiltins.c +=================================================================== +--- bash-5.1.8.orig/builtins/mkbuiltins.c ++++ bash-5.1.8/builtins/mkbuiltins.c +@@ -113,6 +113,9 @@ char *struct_filename = (char *)NULL; + /* The name of the external declaration file. */ + char *extern_filename = (char *)NULL; + ++/* The final name of the external declaration file. */ ++char *extern_final_filename = (char *)NULL; ++ + /* Here is a structure for manipulating arrays of data. */ + typedef struct { + int size; /* Number of slots allocated to array. */ +@@ -230,6 +233,8 @@ main (argc, argv) + + if (strcmp (arg, "-externfile") == 0) + extern_filename = argv[arg_index++]; ++ else if (strcmp (arg, "-externfinalfile") == 0) ++ extern_final_filename = argv[arg_index++]; + else if (strcmp (arg, "-structfile") == 0) + struct_filename = argv[arg_index++]; + else if (strcmp (arg, "-noproduction") == 0) +@@ -273,6 +278,9 @@ main (argc, argv) + } + } + ++ if (!extern_final_filename) ++ extern_final_filename = extern_filename; ++ + /* If there are no files to process, just quit now. */ + if (arg_index == argc) + exit (0); +@@ -1174,7 +1182,7 @@ write_file_headers (structfile, externfi + fprintf (structfile, "%s\n", structfile_header[i]); + + fprintf (structfile, "#include \"%s\"\n", +- extern_filename ? extern_filename : "builtext.h"); ++ extern_final_filename ? extern_final_filename : "builtext.h"); + + fprintf (structfile, "#include \"bashintl.h\"\n"); + +@@ -1184,7 +1192,7 @@ write_file_headers (structfile, externfi + if (externfile) + fprintf (externfile, + "/* %s - The list of builtins found in libbuiltins.a. */\n", +- extern_filename ? extern_filename : "builtext.h"); ++ extern_final_filename ? extern_final_filename : "builtext.h"); + } + + /* Write out any necessary closing information for diff --git a/meta/recipes-extended/bash/bash_5.1.8.bb b/meta/recipes-extended/bash/bash_5.1.8.bb index 55d3d0b16ea..5d7704af17b 100644 --- a/meta/recipes-extended/bash/bash_5.1.8.bb +++ b/meta/recipes-extended/bash/bash_5.1.8.bb @@ -14,6 +14,7 @@ SRC_URI = "${GNU_MIRROR}/bash/${BP}.tar.gz;name=tarball \ file://fix-run-builtins.patch \ file://use_aclocal.patch \ file://makerace.patch \ + file://makerace2.patch \ " SRC_URI[tarball.sha256sum] = "0cfb5c9bb1a29f800a97bd242d19511c997a1013815b805e0fdd32214113d6be" -- 2.30.2
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#153442): https://lists.openembedded.org/g/openembedded-core/message/153442 Mute This Topic: https://lists.openembedded.org/mt/83890601/21656 Group Owner: openembedded-core+ow...@lists.openembedded.org Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-