]> code.ossystems Code Review - openembedded-core.git/commitdiff
bash: Fix a rare make race build failure
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 30 Jun 2021 11:54:17 +0000 (12:54 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Fri, 2 Jul 2021 06:23:47 +0000 (07:23 +0100)
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.purdie@linuxfoundation.org>
meta/recipes-extended/bash/bash/makerace2.patch [new file with mode: 0644]
meta/recipes-extended/bash/bash_5.1.8.bb

diff --git a/meta/recipes-extended/bash/bash/makerace2.patch b/meta/recipes-extended/bash/bash/makerace2.patch
new file mode 100644 (file)
index 0000000..43cdd04
--- /dev/null
@@ -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.purdie@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
index 55d3d0b16ea4e70ecd528647b55401cd1934e9f1..5d7704af17b3160d4ecf648788f65862e777ae80 100644 (file)
@@ -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"