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;
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to