]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
genmoddep.awk: Add a test that we have no circular dependencies
authorVladimir Serbinenko <phcoder@gmail.com>
Sun, 8 Nov 2015 19:00:27 +0000 (20:00 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Sun, 8 Nov 2015 19:00:27 +0000 (20:00 +0100)
grub-core/genmoddep.awk

index 2f32465c4094f82f10bd3829d38a649469f303df..bd98d84cdd7427eef2f3651f455377d469955250 100644 (file)
@@ -29,7 +29,7 @@ BEGIN {
     }
   }
   else {
-    printf "error: %u: unrecognized input format\n", NR;
+    printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";
     error++;
   }
 }
@@ -39,6 +39,8 @@ END {
   if (error >= 1)
     exit 1;
 
+  total_depcount = 0
+
   for (mod in modtab) {
     # Remove duplications.
     split(modtab[mod], depmods, " ");
@@ -52,14 +54,42 @@ END {
        uniqmods[depmod] = 1;
     }
     modlist = ""
+    depcount[mod] = 0
     for (depmod in uniqmods) {
       modlist = modlist " " depmod;
+      inverse_dependencies[depmod] = inverse_dependencies[depmod] " " mod
+      depcount[mod]++
+      total_depcount++
     }
     if (mod == "all_video") {
        continue;
     }
     printf "%s:%s\n", mod, modlist;
   }
+
+  # Check that we have no dependency circles
+  while (total_depcount != 0) {
+      something_done = 0
+      for (mod in depcount) {
+         if (depcount[mod] == 0) {
+             delete depcount[mod]
+             split(inverse_dependencies[mod], inv_depmods, " ");
+             for (ctr in inv_depmods) {
+                 depcount[inv_depmods[ctr]]--
+                 total_depcount--
+             }
+             delete inverse_dependencies[mod]
+             something_done = 1
+         }
+      }
+      if (something_done == 0) {
+         for (mod in depcount) {
+             circle = circle " " mod
+         }
+         printf "error: modules %s form a dependency circle\n", circle >"/dev/stderr";
+         exit 1
+      }
+  }
   modlist = ""
   while (getline <"video.lst") {
       modlist = modlist " " $1;