Parallel make bug in busybox
Richard Purdie
rpurdie at rpsys.net
Fri Aug 19 13:47:13 UTC 2016
I think I have got to the bottom of the problem. applet_tables only
rewrites NUM_APPLETS.h if the file changes. This leads to make
repeatedly trying to rewrite it since the compiled binary itself can be
newer that the header, amongst other issues.
There is also the issue I mentioned previously, that the command can be
executed for both headers in parallel and this leads to double
execution and races. The simplest thing to do seems to be to make
applet_tables always rewrite the file and make include/applet_tables.h:
depend on include/NUM_APPLETS.h which in turn runs the generation
script.
I'd therefore propose the following patch which should resolve the
issues:
Index: busybox-1.24.1/applets/Kbuild.src
===================================================================
--- busybox-1.24.1.orig/applets/Kbuild.src
+++ busybox-1.24.1/applets/Kbuild.src
@@ -29,7 +29,7 @@ applets/applets.o: include/usage_compres
applets/applet_tables: .config include/applets.h
applets/usage: .config include/applets.h
-applets/usage_pod: .config include/applets.h include/applet_tables.h include/NUM_APPLETS.h
+applets/usage_pod: .config include/applets.h include/applet_tables.h
quiet_cmd_gen_usage_compressed = GEN include/usage_compressed.h
cmd_gen_usage_compressed = $(srctree_slash)applets/usage_compressed include/usage_compressed.h applets
@@ -40,5 +40,7 @@ include/usage_compressed.h: applets/usag
quiet_cmd_gen_applet_tables = GEN include/applet_tables.h
cmd_gen_applet_tables = applets/applet_tables include/applet_tables.h include/NUM_APPLETS.h
-include/applet_tables.h include/NUM_APPLETS.h: applets/applet_tables
+include/NUM_APPLETS.h: applets/applet_tables
$(call cmd,gen_applet_tables)
+
+include/applet_tables.h: include/NUM_APPLETS.h
Index: busybox-1.24.1/applets/applet_tables.c
===================================================================
--- busybox-1.24.1.orig/applets/applet_tables.c
+++ busybox-1.24.1/applets/applet_tables.c
@@ -151,23 +151,15 @@ int main(int argc, char **argv)
// printf("#define MAX_APPLET_NAME_LEN %u\n", MAX_APPLET_NAME_LEN);
if (argv[2]) {
- char line_old[80];
char line_new[80];
FILE *fp;
- line_old[0] = 0;
- fp = fopen(argv[2], "r");
- if (fp) {
- fgets(line_old, sizeof(line_old), fp);
- fclose(fp);
- }
sprintf(line_new, "#define NUM_APPLETS %u\n", NUM_APPLETS);
- if (strcmp(line_old, line_new) != 0) {
- fp = fopen(argv[2], "w");
- if (!fp)
- return 1;
- fputs(line_new, fp);
- }
+ fp = fopen(argv[2], "w");
+ if (!fp)
+ return 1;
+ fputs(line_new, fp);
+ fclose(fp);
}
return 0;
More information about the busybox
mailing list