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