This commit was manufactured by cvs2svn to create tag
[opensuse:installation-images.git] / bin / mlist2
1 #! /usr/bin/perl
2
3 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4 # the usual fuss...
5
6 BEGIN { unshift @INC, ( $0 =~ /(.*?)((?<![^\/])bin\/)?[^\/]+$/ )[0] . "lib" }
7 use ReadConfig;
8 use MakeExt2Image;
9 use AddFiles;
10 use Conv2Image;
11
12 sub lsplit;
13 sub add_quotes;
14 sub real_name;
15
16 die "usage: $Script\n" if @ARGV;
17
18 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
19 # some config data
20
21 $cfg = "${CfgPath}module.config";
22 $deps = "${BasePath}tmp/module_deps";
23 $fnames = "${BasePath}tmp/module_list";
24 $mdisk_c = "${BasePath}tmp/module_disks_create";
25 $mdisk_l = "${BasePath}tmp/module_disks_list";
26 $mdisk_i = "${BasePath}tmp/module_disks_images";
27 $dst = "${DataPath}initrd/gen/module.";
28
29 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30 # now we really start...
31
32 $debug = exists($ENV{'debug'}) ?  $ENV{'debug'} : "";
33
34 $arch = `uname -m`; chomp $arch; $arch = "ia32" if $arch =~ /^i\d86$/;
35
36 $err = 0;
37
38 die "$Script: $deps: $!\n" unless open F, $deps;
39 while(<F>) {
40   chomp;
41   @i = split " ", $_;
42   $i[0] =~ s/:$//;
43   $i = shift @i;
44   $dep{$i} = [ @i ];
45 }
46 close F;
47
48
49 die "$Script: $fnames: $!\n" unless open F, $fnames;
50 while(<F>) {
51   chomp;
52   if(/^(\S+):\s*(\S+)/) {
53     $fname{$2} = "$1/$2.o";
54   }
55 }
56 close F;
57
58
59 die "$Script: $cfg: $!\n" unless open(F, "$cfg.$arch") || open(F, $cfg);
60
61 while(<F>) {
62   chomp;
63   s/^\s*([#;].*)?//;
64   next if $_ eq "";
65   if(/^\[(.+)\]/) {
66     $sect = $1;
67     push @sect, $sect unless exists $sect{$sect};
68     $sect{$sect}{tag} = undef;
69     next;
70   }
71   if(/MoreModules=(.*)/i) {
72     $tmp = $1;
73     if($tmp =~ /^([^,]+),([^,]+)$/) {
74       $sect{$sect}{MoreModules} = $1;
75       $sect{$sect}{MoreModulesLxrc} = $2;
76     }
77     else {
78       $sect{$sect}{MoreModules} =
79       $sect{$sect}{MoreModulesLxrc} = $tmp;
80     }
81     $sect{$sect}{MoreModules} = $1;
82     next;
83   }
84
85   if(/ModuleClass=(.*)/i) {
86     $sect{$sect}{ModuleClass} = $1;
87     next;
88   }
89
90   if(/ModDisk=(.*)/i) {
91     $tmp = $1;
92     if($tmp =~ /^([^,]+),([^,]+)$/) {
93       $sect{$sect}{ModDisk} = $1;
94       $sect{$sect}{ModDiskNext} = $2;
95     }
96     else {
97       $sect{$sect}{ModDisk} =
98       $sect{$sect}{ModDiskNext} = $tmp;
99     }
100     next;
101   }
102
103   @l = lsplit $_;
104   $r = $l[0] =~ s/^-// ? 1 : 0;
105   if(defined $fname{$l[0]}) {
106     $all{$l[0]} = 1;
107     push @{$sect{$sect}{'m'}}, [ @l ];
108     $sect{$sect}{'r'}{$l[0]} = 1 if $r;
109   }
110   else {
111     print STDERR "warning: no such module: $l[0]\n"
112   }
113 }
114 close F;
115
116
117 # fix pre/post install fields
118 for (@sect) {
119   for $m (@{$sect{$_}{'m'}}) {
120     $pre = $$m[3];
121     $post = $$m[4];
122     $mod = $$m[0];
123     undef %l;
124     undef @new_pre;
125     undef @new_post;
126
127     @p = split ' ', $pre;
128     for $p (@p) {
129       for $p1 (@{$dep{$p}}) {
130         push @new_pre, $p1 unless $l{$p1};
131         $l{$p1} = 1;
132       }
133       push @new_pre, $p unless $l{$p};
134       $l{$p} = 1;
135     }
136
137     for $p (@{$dep{$mod}}) {
138       push @new_pre, $p unless $l{$p};
139       $l{$p} = 1;
140     }
141     $l{$mod} = 1;
142
143     @p = split ' ', $post;
144     for $p (@p) {
145       for $p1 (@{$dep{$p}}) {
146         push @new_post, $p1 unless $l{$p1};
147         $l{$p1} = 1;
148       }
149       push @new_post, $p unless $l{$p};
150       $l{$p} = 1;
151     }
152
153     for $k (keys %l) {
154       $sect{$_}{'a'}{$k} = 1;
155       if(!$all{$k}) {
156         $err = 10;
157         print STDERR "error: no config for \"$k\" (needed by $mod)\n";
158       }
159     }
160
161     $$m[3] = join ' ', @new_pre;
162     $$m[4] = join ' ', @new_post;
163   }
164 }
165
166
167 for (sort { $fname{$a} cmp $fname{$b} } keys %fname) {
168   if(!$all{$_}) {
169     $err = 11;
170     print STDERR "error: nothing known about \"$fname{$_}\"\n";
171   }
172 }
173
174
175 mkdir "${DataPath}initrd/gen", 0755;
176
177 for (@sect) {
178 #  next if /notuseful/;
179
180   $s = $_;
181   $s =~ s/\s+//g;
182   $s = $1 if exists($sect{$_}{MoreModules}) && $sect{$_}{MoreModules} =~ /^(\S+)-modules/;
183   if(exists($sect{$_}{MoreModules}) && exists($sect{$_}{ModDisk})) {
184     $moddisk_i{$sect{$_}{ModDisk}} .= " $sect{$_}{MoreModules}";
185   }
186
187   $s = $sect{$_}{ModuleClass} if exists $sect{$_}{ModuleClass};
188   $moddisk_l{$sect{$_}{ModDisk}} .= " $s" if exists $sect{$_}{ModDisk};
189
190   # to make it possible to put something on the disk that wasn't created by mk_modules
191   # e.g. initrd
192   if(exists $sect{$_}{ModDisk}) {
193     if(
194       !exists($sect{$_}{MoreModules}) ||
195       !exists($sect{$_}{ModuleClass}) ||
196       "$sect{$_}{ModuleClass}-modules" eq $sect{$_}{MoreModules}        # ???
197     ) {
198       $moddisk_c{$sect{$_}{ModDisk}} .= " $s";
199     }
200   }
201
202   open W, ">${dst}config.$s";
203   print W "[${\real_name($_)}]\n";
204   print W "MoreModules=${\real_name($sect{$_}{MoreModulesLxrc})}\n" if exists $sect{$_}{MoreModulesLxrc};
205   print W "ModDisk=$sect{$_}{ModDiskNext}\n" if exists $sect{$_}{ModDiskNext};
206   print W "\n" if exists($sect{$_}{MoreModules}) || exists($sect{$_}{ModDiskNext});
207
208   for $m (@{$sect{$_}{'m'}}) {
209     if($$m[1] !~ /^--/) {
210       $l = join ',', add_quotes(@$m);
211       $l =~ s/,*$//;
212       print W "$l\n";
213     }
214   }
215   print W "\n\n";
216   close W;
217
218   open W, ">${dst}shortconfig.$s";
219   print W "[${\real_name($_)}]\n";
220   print W "MoreModules=${\real_name($sect{$_}{MoreModulesLxrc})}\n" if exists $sect{$_}{MoreModulesLxrc};
221   print W "ModDisk=$sect{$_}{ModDiskNext}\n" if exists $sect{$_}{ModDiskNext};
222   print W "\n\n";
223   close W;
224
225   open W, ">${dst}files.$s";
226   for $f (sort { $fname{$a} cmp $fname{$b} } keys %{$sect{$_}{'a'}}) {
227     next if $sect{$_}{'r'}{$f};
228     if($_ eq 'cd1') {
229       print W "  /lib/modules/<kernel_ver>/$fname{$f}\n";
230     }
231     else {
232       print W "a /lib/modules/<kernel_ver>/$fname{$f} /modules\n";
233     }
234   }
235   close W;
236
237   open W, ">${dst}list.$s";
238   print W ";\n; ${\real_name($_)} modules\n;\n";
239   for $m (@{$sect{$_}{'m'}}) {
240     next if $sect{$_}{'r'}{$$m[0]};
241     $d = $$m[1];
242     $d =~ s/^--//;
243     if($d) {
244       printf W "%-15s\t%s\n", $$m[0], $d;
245     }
246   }
247   print W "\n";
248   close W;
249 }
250
251
252 open W, ">$mdisk_c";
253 for (sort keys %moddisk_c) {
254   print W "$_:$moddisk_c{$_}\n"
255 }
256 close W;
257
258 open W, ">$mdisk_l";
259 for (sort keys %moddisk_l) {
260   print W "$_:$moddisk_l{$_}\n"
261 }
262 close W;
263
264 open W, ">$mdisk_i";
265 for (sort keys %moddisk_i) {
266   print W "$_:$moddisk_i{$_}\n"
267 }
268 close W;
269
270
271 exit $err;
272
273
274 sub lsplit
275 {
276   local $_;
277   my ($l, $f, @l);
278
279   $l = shift;
280
281   while($l =~ s/^\s*([^,"]*|\".*?(?<!\\)\")\s*,//) {
282     $f = $1;
283     $f =~ s/^"(.*)"$/$1/;
284     $f =~ s/\\\"/"/g;
285     push @l, $f;
286   }
287   $l =~ s/^\s*|\s*$//g;
288   $l =~ s/^"(.*)"$/$1/;
289   $l =~ s/\\\"/"/g;
290   push @l, $l if $l ne "";
291
292   $l[1] = undef if $l[1] =~ /^-(?!-)/;
293
294   return @l;
295 }
296
297 sub add_quotes
298 {
299   local $_;
300   my (@i);
301
302   @i = @_;
303
304   for (@i) {
305     if(/[,"]/) {
306       s/"/\\"/g;
307       $_ = "\"$_\"";
308     }
309   }
310
311   return @i
312 }
313
314
315 sub real_name
316 {
317   local $_;
318
319   $_ = shift;
320   s/\@[^@]+?\b//;
321   return $_;
322 }
323