enforcing fixup
[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     if ($3 !~ /^\.refptr\./ && $3 in symtab) {
22       printf "%s in %s is duplicated in %s\n", $3, $2, symtab[$3] >"/dev/stderr";
23       error++;
24     }
25     symtab[$3] = $2;
26     modtab[$2] = "" modtab[$2]
27   } else if ($1 == "undefined") {
28     if ($3 in symtab)
29       modtab[$2] = modtab[$2] " " symtab[$3];
30     else if ($3 != "__gnu_local_gp" && $3 != "_gp_disp") {
31       printf "%s in %s is not defined\n", $3, $2 >"/dev/stderr";
32       error++;
33     }
34   }
35   else {
36     printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";
37     error++;
38   }
39 }
40
41 # Output the result.
42 END {
43   if (error >= 1)
44     exit 1;
45
46   total_depcount = 0
47
48   for (mod in modtab) {
49     # Remove duplications.
50     split(modtab[mod], depmods, " ");
51     for (depmod in uniqmods) {
52       delete uniqmods[depmod];
53     }
54     for (i in depmods) {
55       depmod = depmods[i];
56       # Ignore kernel, as always loaded.
57       if (depmod != "kernel" && depmod != mod)
58         uniqmods[depmod] = 1;
59     }
60     modlist = ""
61     depcount[mod] = 0
62     for (depmod in uniqmods) {
63       modlist = modlist " " depmod;
64       inverse_dependencies[depmod] = inverse_dependencies[depmod] " " mod
65       depcount[mod]++
66       total_depcount++
67     }
68     if (mod == "all_video") {
69         continue;
70     }
71     printf "%s:%s\n", mod, modlist;
72   }
73
74   # Check that we have no dependency circles
75   while (total_depcount != 0) {
76       something_done = 0
77       for (mod in depcount) {
78           if (depcount[mod] == 0) {
79               delete depcount[mod]
80               split(inverse_dependencies[mod], inv_depmods, " ");
81               for (ctr in inv_depmods) {
82                   depcount[inv_depmods[ctr]]--
83                   total_depcount--
84               }
85               delete inverse_dependencies[mod]
86               something_done = 1
87           }
88       }
89       if (something_done == 0) {
90           for (mod in depcount) {
91               circle = circle " " mod
92           }
93           printf "error: modules %s form a dependency circle\n", circle >"/dev/stderr";
94           exit 1
95       }
96   }
97   modlist = ""
98   while (getline <"video.lst") {
99       modlist = modlist " " $1;
100   }
101   printf "all_video:%s\n", modlist;
102 }