gen_menuconfig.pl 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) 2006 OpenWrt.org
  4. #
  5. # This is free software, licensed under the GNU General Public License v2.
  6. # See /LICENSE for more information.
  7. #
  8. use strict;
  9. my $src;
  10. my $makefile;
  11. my $pkg;
  12. my %package;
  13. my %category;
  14. sub find_dep($$) {
  15. my $pkg = shift;
  16. my $name = shift;
  17. my $deps = ($pkg->{vdepends} or $pkg->{depends});
  18. return 0 unless defined $deps;
  19. foreach my $dep (@{$deps}) {
  20. return 1 if $dep eq $name;
  21. return 1 if ($package{$dep} and (find_dep($package{$dep},$name) == 1));
  22. }
  23. return 0;
  24. }
  25. sub depends($$) {
  26. my $a = shift;
  27. my $b = shift;
  28. my $ret;
  29. return 0 if ($a->{submenu} ne $b->{submenu});
  30. if (find_dep($a, $b->{name}) == 1) {
  31. $ret = 1;
  32. } elsif (find_dep($b, $a->{name}) == 1) {
  33. $ret = -1;
  34. } else {
  35. return 0;
  36. }
  37. # print STDERR "depends($a->{name}, $b->{name}) == $ret\n";
  38. return $ret;
  39. }
  40. sub print_category($) {
  41. my $cat = shift;
  42. my %menus;
  43. my %menu_dep;
  44. return unless $category{$cat};
  45. print "menu \"$cat\"\n\n";
  46. my %spkg = %{$category{$cat}};
  47. foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) {
  48. foreach my $pkg (@{$spkg{$spkg}}) {
  49. my $menu = $pkg->{submenu};
  50. if ($menu) {
  51. $menu_dep{$menu} or $menu_dep{$menu} = $pkg->{submenudep};
  52. } else {
  53. $menu = 'undef';
  54. }
  55. $menus{$menu} or $menus{$menu} = [];
  56. push @{$menus{$menu}}, $pkg;
  57. }
  58. }
  59. my @menus = sort {
  60. ($a eq 'undef' ? 1 : 0) or
  61. ($b eq 'undef' ? -1 : 0) or
  62. ($a cmp $b)
  63. } keys %menus;
  64. foreach my $menu (@menus) {
  65. my @pkgs = sort {
  66. depends($a, $b) or
  67. ($a->{name} cmp $b->{name})
  68. } @{$menus{$menu}};
  69. if ($menu ne 'undef') {
  70. $menu_dep{$menu} and print "if $menu_dep{$menu}\n";
  71. print "menu \"$menu\"\n";
  72. }
  73. foreach my $pkg (@pkgs) {
  74. my $title = $pkg->{name};
  75. my $c = (72 - length($pkg->{name}) - length($pkg->{title}));
  76. if ($c > 0) {
  77. $title .= ("." x $c). " ". $pkg->{title};
  78. }
  79. print "\t";
  80. $pkg->{menu} and print "menu";
  81. print "config PACKAGE_".$pkg->{name}."\n";
  82. print "\t\ttristate \"$title\"\n";
  83. foreach my $default (split /\s*,\s*/, $pkg->{default}) {
  84. print "\t\tdefault $default\n";
  85. }
  86. foreach my $depend (@{$pkg->{depends}}) {
  87. my $m = "depends";
  88. $depend =~ s/^([@\+]+)//;
  89. my $flags = $1;
  90. my $vdep;
  91. if ($vdep = $package{$depend}->{vdepends}) {
  92. $depend = join("||", map { "PACKAGE_".$_ } @$vdep);
  93. } else {
  94. $flags =~ /@/ or $depend = "PACKAGE_$depend";
  95. $flags =~ /\+/ and $m = "select";
  96. }
  97. print "\t\t$m $depend\n";
  98. }
  99. print "\t\thelp\n";
  100. print $pkg->{description};
  101. print "\n";
  102. $pkg->{config} and print $pkg->{config}."\n";
  103. }
  104. if ($menu ne 'undef') {
  105. print "endmenu\n";
  106. $menu_dep{$menu} and print "endif\n";
  107. }
  108. }
  109. print "endmenu\n\n";
  110. undef $category{$cat};
  111. }
  112. my $line;
  113. while ($line = <>) {
  114. chomp $line;
  115. $line =~ /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do {
  116. $makefile = $1;
  117. $src = $2;
  118. undef $pkg;
  119. };
  120. $line =~ /^Package: \s*(.+)\s*$/ and do {
  121. $pkg = {};
  122. $pkg->{src} = $src;
  123. $pkg->{makefile} = $makefile;
  124. $pkg->{name} = $1;
  125. $pkg->{default} = "m if ALL";
  126. $package{$1} = $pkg;
  127. };
  128. $line =~ /^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
  129. $line =~ /^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
  130. $line =~ /^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;
  131. $line =~ /^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1;
  132. $line =~ /^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1;
  133. $line =~ /^Default: \s*(.+)\s*$/ and $pkg->{default} = $1;
  134. $line =~ /^Provides: \s*(.+)\s*$/ and do {
  135. my @vpkg = split /\s+/, $1;
  136. foreach my $vpkg (@vpkg) {
  137. $package{$vpkg} or $package{$vpkg} = { vdepends => [] };
  138. push @{$package{$vpkg}->{vdepends}}, $pkg->{name};
  139. }
  140. };
  141. $line =~ /^Depends: \s*(.+)\s*$/ and do {
  142. my @dep = split /\s+/, $1;
  143. $pkg->{depends} = \@dep;
  144. };
  145. $line =~ /^Category: \s*(.+)\s*$/ and do {
  146. $pkg->{category} = $1;
  147. defined $category{$1} or $category{$1} = {};
  148. defined $category{$1}->{$src} or $category{$1}->{$src} = [];
  149. push @{$category{$1}->{$src}}, $pkg;
  150. };
  151. $line =~ /^Description: \s*(.*)\s*$/ and do {
  152. my $desc = "\t\t$1\n\n";
  153. my $line;
  154. while ($line = <>) {
  155. last if $line =~ /^@@/;
  156. $desc .= "\t\t$line";
  157. }
  158. $pkg->{description} = $desc;
  159. };
  160. $line =~ /^Config: \s*(.*)\s*$/ and do {
  161. my $conf = "$1\n";
  162. my $line;
  163. while ($line = <>) {
  164. last if $line =~ /^@@/;
  165. $conf .= "$line";
  166. }
  167. $pkg->{config} = $conf;
  168. }
  169. }
  170. print_category 'Base system';
  171. foreach my $cat (keys %category) {
  172. print_category $cat;
  173. }