| #! /usr/bin/awk -f |
| # |
| # Copyright (C) 2006 Free Software Foundation, Inc. |
| # |
| # This genmoddep.awk is free software; the author |
| # gives unlimited permission to copy and/or distribute it, |
| # with or without modifications, as long as this notice is preserved. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY, to the extent permitted by law; without |
| # even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
| # PARTICULAR PURPOSE. |
| |
| # Read symbols' info from stdin. |
| BEGIN { |
| error = 0 |
| } |
| |
| { |
| if ($1 == "defined") { |
| symtab[$3] = $2; |
| modtab[$2] = "" modtab[$2] |
| } else if ($1 == "undefined") { |
| if ($3 in symtab) |
| modtab[$2] = modtab[$2] " " symtab[$3]; |
| else if ($3 != "__gnu_local_gp" && $3 != "_gp_disp") { |
| printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr"; |
| error++; |
| } |
| } |
| else { |
| printf "error: %u: unrecognized input format\n", NR >"/dev/stderr"; |
| error++; |
| } |
| } |
| |
| # Output the result. |
| END { |
| if (error >= 1) |
| exit 1; |
| |
| total_depcount = 0 |
| |
| for (mod in modtab) { |
| # Remove duplications. |
| split(modtab[mod], depmods, " "); |
| for (depmod in uniqmods) { |
| delete uniqmods[depmod]; |
| } |
| for (i in depmods) { |
| depmod = depmods[i]; |
| # Ignore kernel, as always loaded. |
| if (depmod != "kernel" && depmod != mod) |
| 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; |
| } |
| printf "all_video:%s\n", modlist; |
| } |