diff --git a/scripts/gen_menuconfig.pl b/scripts/gen_menuconfig.pl index c0279d545..fe0dc2763 100755 --- a/scripts/gen_menuconfig.pl +++ b/scripts/gen_menuconfig.pl @@ -11,6 +11,7 @@ use strict; my $src; my $makefile; my $pkg; +my %package; my %category; my $cur_menu; my $cur_menu_dep; @@ -26,6 +27,35 @@ sub close_submenu { } } +sub find_dep($$) { + my $pkg = shift; + my $name = shift; + + return 0 unless defined $pkg->{depends}; + foreach my $dep (@{$pkg->{depends}}) { + return 1 if $dep eq $name; + return 1 if ($package{$dep} and (find_dep($package{$dep},$name) == 1)); + } + return 0; +} + +sub depends($$) { + my $a = shift; + my $b = shift; + my $ret; + + if (find_dep($a, $b->{name}) == 1) { + $ret = 1; + } elsif (find_dep($b, $a->{name}) == 1) { + $ret = -1; + } else { + $ret = 0; + } +# print STDERR "depends($a->{name}, $b->{name}) == $ret\n"; + return $ret; +} + + sub print_category($) { my $cat = shift; @@ -35,6 +65,7 @@ sub print_category($) { my %spkg = %{$category{$cat}}; foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) { my @pkgs = sort { + depends($a, $b) or $a->{submenu}."->".$a->{name} cmp $b->{submenu}."->".$b->{name} } @{$spkg{$spkg}}; foreach my $pkg (@pkgs) { @@ -93,6 +124,7 @@ while ($line = <>) { $pkg->{makefile} = $makefile; $pkg->{name} = $1; $pkg->{default} = "m if ALL"; + $package{$1} = $pkg; }; $line =~ /^Version: \s*(.+)\s*$/ and $pkg->{version} = $1; $line =~ /^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;