SECURITY: Add SECURITY file
[grub.git] / grub-core / genmoddep.awk
blob04c2863e5abfa4d950df2c41d579dea03a361927
1 #! /usr/bin/awk -f
3 # Copyright (C) 2006 Free Software Foundation, Inc.
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.
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.
14 # Read symbols' info from stdin.
15 BEGIN {
16 error = 0
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++;
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++;
35 else {
36 printf "error: %u: unrecognized input format\n", NR >"/dev/stderr";
37 error++;
41 # Output the result.
42 END {
43 if (error >= 1)
44 exit 1;
46 total_depcount = 0
48 for (mod in modtab) {
49 # Remove duplications.
50 split(modtab[mod], depmods, " ");
51 for (depmod in uniqmods) {
52 delete uniqmods[depmod];
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;
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++
68 if (mod == "all_video") {
69 continue;
71 printf "%s:%s\n", mod, modlist;
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--
85 delete inverse_dependencies[mod]
86 something_done = 1
89 if (something_done == 0) {
90 for (mod in depcount) {
91 circle = circle " " mod
93 printf "error: modules %s form a dependency circle\n", circle >"/dev/stderr";
94 exit 1
97 modlist = ""
98 while (getline <"video.lst") {
99 modlist = modlist " " $1;
101 printf "all_video:%s\n", modlist;