gen_package_config.pl 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 "\tconfig DEFAULT_".$pkg->{name}."\n";
  80. print "\t\tbool\n\n";
  81. print "\t";
  82. $pkg->{menu} and print "menu";
  83. print "config PACKAGE_".$pkg->{name}."\n";
  84. print "\t\ttristate \"$title\"\n";
  85. print "\t\tdefault y if DEFAULT_".$pkg->{name}."\n";
  86. foreach my $default (split /\s*,\s*/, $pkg->{default}) {
  87. print "\t\tdefault $default\n";
  88. }
  89. foreach my $depend (@{$pkg->{depends}}) {
  90. my $m = "depends";
  91. $depend =~ s/^([@\+]+)//;
  92. my $flags = $1;
  93. my $vdep;
  94. if ($vdep = $package{$depend}->{vdepends}) {
  95. $depend = join("||", map { "PACKAGE_".$_ } @$vdep);
  96. } else {
  97. $flags =~ /@/ or $depend = "PACKAGE_$depend";
  98. $flags =~ /\+/ and $m = "select";
  99. }
  100. print "\t\t$m $depend\n";
  101. }
  102. print "\t\thelp\n";
  103. print $pkg->{description};
  104. print "\n";
  105. $pkg->{config} and print $pkg->{config}."\n";
  106. }
  107. if ($menu ne 'undef') {
  108. print "endmenu\n";
  109. $menu_dep{$menu} and print "endif\n";
  110. }
  111. }
  112. print "endmenu\n\n";
  113. undef $category{$cat};
  114. }
  115. my $line;
  116. while ($line = <>) {
  117. chomp $line;
  118. $line =~ /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do {
  119. $makefile = $1;
  120. $src = $2;
  121. undef $pkg;
  122. };
  123. $line =~ /^Package: \s*(.+)\s*$/ and do {
  124. $pkg = {};
  125. $pkg->{src} = $src;
  126. $pkg->{makefile} = $makefile;
  127. $pkg->{name} = $1;
  128. $pkg->{default} = "m if ALL";
  129. $package{$1} = $pkg;
  130. };
  131. $line =~ /^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
  132. $line =~ /^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
  133. $line =~ /^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;
  134. $line =~ /^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1;
  135. $line =~ /^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1;
  136. $line =~ /^Default: \s*(.+)\s*$/ and $pkg->{default} = $1;
  137. $line =~ /^Provides: \s*(.+)\s*$/ and do {
  138. my @vpkg = split /\s+/, $1;
  139. foreach my $vpkg (@vpkg) {
  140. $package{$vpkg} or $package{$vpkg} = { vdepends => [] };
  141. push @{$package{$vpkg}->{vdepends}}, $pkg->{name};
  142. }
  143. };
  144. $line =~ /^Depends: \s*(.+)\s*$/ and do {
  145. my @dep = split /\s+/, $1;
  146. $pkg->{depends} = \@dep;
  147. };
  148. $line =~ /^Category: \s*(.+)\s*$/ and do {
  149. $pkg->{category} = $1;
  150. defined $category{$1} or $category{$1} = {};
  151. defined $category{$1}->{$src} or $category{$1}->{$src} = [];
  152. push @{$category{$1}->{$src}}, $pkg;
  153. };
  154. $line =~ /^Description: \s*(.*)\s*$/ and do {
  155. my $desc = "\t\t$1\n\n";
  156. my $line;
  157. while ($line = <>) {
  158. last if $line =~ /^@@/;
  159. $desc .= "\t\t$line";
  160. }
  161. $pkg->{description} = $desc;
  162. };
  163. $line =~ /^Config: \s*(.*)\s*$/ and do {
  164. my $conf = "$1\n";
  165. my $line;
  166. while ($line = <>) {
  167. last if $line =~ /^@@/;
  168. $conf .= "$line";
  169. }
  170. $pkg->{config} = $conf;
  171. }
  172. }
  173. print_category 'Base system';
  174. foreach my $cat (keys %category) {
  175. print_category $cat;
  176. }