diff --git a/grub-core/genmoddep.awk b/grub-core/genmoddep.awk index 2f32465c4..bd98d84cd 100644 --- a/grub-core/genmoddep.awk +++ b/grub-core/genmoddep.awk @@ -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;