bd98d84cdd7427eef2f3651f455377d469955250
[grub.git] / grub-core / genmoddep.awk
1 #! /usr/bin/awk -f
2 #
3 # Copyright (C) 2006  Free Software Foundation, Inc.
4 #
5 # This genmoddep.awk is free software; the author
6 # gives unlimited permission to copy and/or distribute it,
7 # with or without modifications, as long as this notice is preserved.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
11 # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
12 # PARTICULAR PURPOSE.
13
14 # Read symbols' info from stdin.
15 BEGIN {
16   error = 0
17 }
18
19 {
20   if ($1 == "defined") {
21     symtab[$3] = $2;
22     modtab[$2] = "" modtab[$2]
23   } else if ($1 == "undefined") {
24     if ($3 in symtab)
25       modtab[$2] = modtab[$2] " " symtab[$3];
26     else if ($3 != "__gnu_local_gp" && $3 != "_gp_disp") {
27       printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr";
28       error++;
29     }
30   }
31   else {
32     printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";
33     error++;
34   }
35 }
36
37 # Output the result.
38 END {
39   if (error >= 1)
40     exit 1;
41
42   total_depcount = 0
43
44   for (mod in modtab) {
45     # Remove duplications.
46     split(modtab[mod], depmods, " ");
47     for (depmod in uniqmods) {
48       delete uniqmods[depmod];
49     }
50     for (i in depmods) {
51       depmod = depmods[i];
52       # Ignore kernel, as always loaded.
53       if (depmod != "kernel" && depmod != mod)
54         uniqmods[depmod] = 1;
55     }
56     modlist = ""
57     depcount[mod] = 0
58     for (depmod in uniqmods) {
59       modlist = modlist " " depmod;
60       inverse_dependencies[depmod] = inverse_dependencies[depmod] " " mod
61       depcount[mod]++
62       total_depcount++
63     }
64     if (mod == "all_video") {
65         continue;
66     }
67     printf "%s:%s\n", mod, modlist;
68   }
69
70   # Check that we have no dependency circles
71   while (total_depcount != 0) {
72       something_done = 0
73       for (mod in depcount) {
74           if (depcount[mod] == 0) {
75               delete depcount[mod]
76               split(inverse_dependencies[mod], inv_depmods, " ");
77               for (ctr in inv_depmods) {
78                   depcount[inv_depmods[ctr]]--
79                   total_depcount--
80               }
81               delete inverse_dependencies[mod]
82               something_done = 1
83           }
84       }
85       if (something_done == 0) {
86           for (mod in depcount) {
87               circle = circle " " mod
88           }
89           printf "error: modules %s form a dependency circle\n", circle >"/dev/stderr";
90           exit 1
91       }
92   }
93   modlist = ""
94   while (getline <"video.lst") {
95       modlist = modlist " " $1;
96   }
97   printf "all_video:%s\n", modlist;
98 }