Magellan Linux

Diff of /trunk/mkinitrd-magellan/busybox/examples/depmod.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 983 by niro, Fri Apr 24 18:33:46 2009 UTC revision 984 by niro, Sun May 30 11:32:42 2010 UTC
# Line 13  Line 13 
13    
14  # This program is free software; you can redistribute it and/or modify it  # This program is free software; you can redistribute it and/or modify it
15  # under the same terms as Perl itself.  # under the same terms as Perl itself.
16  use Getopt::Long;  use Getopt::Long qw(:config no_auto_abbrev no_ignore_case);
17  use File::Find;  use File::Find;
18  use strict;  use strict;
19    
# Line 23  my $basedir=""; Line 23  my $basedir="";
23  my $kernel="";  my $kernel="";
24  my $kernelsyms="";  my $kernelsyms="";
25  my $symprefix="";  my $symprefix="";
26    my $all=0;
27    my $quick=0;
28    my $errsyms=0;
29  my $stdout=0;  my $stdout=0;
30  my $verbose=0;  my $verbose=0;
31  my $help=0;  my $help=0;
# Line 44  $0 -b basedir { -k <vmlinux> | -F <Syste Line 47  $0 -b basedir { -k <vmlinux> | -F <Syste
47     -n --stdout        : Write to stdout instead of <basedir>/modules.dep     -n --stdout        : Write to stdout instead of <basedir>/modules.dep
48     -v --verbose       : Print out lots of debugging stuff     -v --verbose       : Print out lots of debugging stuff
49     -P --symbol-prefix : Symbol prefix     -P --symbol-prefix : Symbol prefix
50       -a --all           : Probe all modules (default/only thing supported)
51       -e --errsyms       : Report any symbols not supplied by modules/kernel
52  TXT  TXT
53    
54  # get command-line options  # get command-line options
# Line 55  GetOptions( Line 60  GetOptions(
60   "stdout|n"          => \$stdout,   "stdout|n"          => \$stdout,
61   "verbose|v"         => \$verbose,   "verbose|v"         => \$verbose,
62   "symbol-prefix|P=s" => \$symprefix,   "symbol-prefix|P=s" => \$symprefix,
63     "all|a"             => \$all,
64     # unsupported options
65     "quick|A"           => \$quick,
66     # ignored options (for historical usage)
67     "quiet|q",
68     "root|r",
69     "unresolved-error|u"
70  );  );
71    
72  die $usage if $help;  die $usage if $help;
73  die $usage unless $basedir && ( $kernel || $kernelsyms );  die $usage unless $basedir && ( $kernel || $kernelsyms );
74  die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms;  die "can't use both -k and -F\n\n$usage" if $kernel && $kernelsyms;
75    die "sorry, -A/--quick is not supported" if $quick;
76    die "--errsyms requires --kernelsyms" if $errsyms && !$kernelsyms;
77    
78  # Strip any trailing or multiple slashes from basedir  # Strip any trailing or multiple slashes from basedir
79  $basedir =~ s-(/)\1+-/-g;  $basedir =~ s-/+$--g;
80    
81  # The base directory should contain /lib/modules somewhere  # The base directory should contain /lib/modules somewhere
82  if($basedir !~ m-/lib/modules-) {  if($basedir !~ m-/lib/modules-) {
# Line 137  foreach my $module (keys %$dep) { Line 151  foreach my $module (keys %$dep) {
151      }      }
152  }  }
153    
154    # build a complete dependency list for each module and make sure it
155    # is kept in order proper order
156    my $mod2 = {};
157    sub maybe_unshift
158    {
159     my ($array, $ele) = @_;
160     # chop off the leading path /lib/modules/<kver>/ as modprobe
161     # will handle relative paths just fine
162     $ele =~ s:^/lib/modules/[^/]*/::;
163     foreach (@{$array}) {
164     if ($_ eq $ele) {
165     return;
166     }
167     }
168     unshift (@{$array}, $ele);
169    }
170    sub add_mod_deps
171    {
172     my ($depth, $mod, $mod2, $module, $this_module) = @_;
173    
174     $depth .= " ";
175     warn "${depth}loading deps of module: $this_module\n" if $verbose;
176    
177     foreach my $md (keys %{$mod->{$this_module}}) {
178     add_mod_deps ($depth, $mod, $mod2, $module, $md);
179     warn "${depth} outputting $md\n" if $verbose;
180     maybe_unshift (\@{$$mod2->{$module}}, $md);
181     }
182    
183     if (!%{$mod->{$this_module}}) {
184     warn "${depth} no deps\n" if $verbose;
185     }
186    }
187    foreach my $module (keys %$mod) {
188     warn "filling out module: $module\n" if $verbose;
189     @{$mod2->{$module}} = ();
190     add_mod_deps ("", $mod, \$mod2, $module, $module);
191    }
192    
193  # figure out where the output should go  # figure out where the output should go
194  if ($stdout == 0) {  if ($stdout == 0) {
195     warn "writing $basedir/modules.dep\n" if $verbose;
196      open(STDOUT, ">$basedir/modules.dep")      open(STDOUT, ">$basedir/modules.dep")
197                               or die "cannot open $basedir/modules.dep: $!";                               or die "cannot open $basedir/modules.dep: $!";
198  }  }
# Line 151  foreach my $module ( keys %$mod ) { Line 205  foreach my $module ( keys %$mod ) {
205      print join(" \\\n\t",@sorted);      print join(" \\\n\t",@sorted);
206      print "\n\n";      print "\n\n";
207      } else {      } else {
208      print "$module: ";      my $shortmod = $module;
209      my @sorted = sort bydep keys %{$mod->{$module}};      $shortmod =~ s:^/lib/modules/[^/]*/::;
210        print "$shortmod:";
211        my @sorted = @{$mod2->{$module}};
212        printf " " if @sorted;
213      print join(" ",@sorted);      print join(" ",@sorted);
214      print "\n";      print "\n";
215      }      }
# Line 163  sub build_ref_tables Line 220  sub build_ref_tables
220  {  {
221      my ($name, $sym_ar, $exp, $dep) = @_;      my ($name, $sym_ar, $exp, $dep) = @_;
222    
223   my $ksymtab = grep m/ __ksymtab/, @$sym_ar;   my $ksymtab = grep m/ ${symprefix}__ksymtab/, @$sym_ar;
224    
225      # gather the exported symbols      # gather the exported symbols
226   if($ksymtab){   if($ksymtab){
227          # explicitly exported          # explicitly exported
228          foreach ( @$sym_ar ) {          foreach ( @$sym_ar ) {
229              / __ksymtab_(.*)$/ and do {              / ${symprefix}__ksymtab_(.*)$/ and do {
230                  warn "sym = $1\n" if $verbose;                  my $sym = ${symprefix} . $1;
231                  $exp->{$1} = $name;                  warn "sym = $sym\n" if $verbose;
232                    $exp->{$sym} = $name;
233              };              };
234          }          }
235   } else {   } else {
# Line 189  sub build_ref_tables Line 247  sub build_ref_tables
247    
248      # gather the unresolved symbols      # gather the unresolved symbols
249      foreach ( @$sym_ar ) {      foreach ( @$sym_ar ) {
250          !/ __this_module/ && / U (.*)$/ and do {          !/ ${symprefix}__this_module/ && / U (.*)$/ and do {
251              warn "und = $1\n" if $verbose;              warn "und = $1\n" if $verbose;
252              push @{$dep->{$name}}, $1;              push @{$dep->{$name}}, $1;
253          };          };

Legend:
Removed from v.983  
changed lines
  Added in v.984