gen_menuconfig.pl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 %category;
  13. my $cur_menu;
  14. my $cur_menu_dep;
  15. sub close_submenu {
  16. if ($cur_menu) {
  17. print "endmenu\n";
  18. $cur_menu_dep and do {
  19. print "endif\n";
  20. $cur_menu_dep = undef;
  21. };
  22. undef $cur_menu;
  23. }
  24. }
  25. sub print_category($) {
  26. my $cat = shift;
  27. return unless $category{$cat};
  28. print "menu \"$cat\"\n\n";
  29. my %spkg = %{$category{$cat}};
  30. foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) {
  31. foreach my $pkg (@{$spkg{$spkg}}) {
  32. if ($cur_menu ne $pkg->{submenu}) {
  33. close_submenu();
  34. if ($pkg->{submenu}) {
  35. $cur_menu = $pkg->{submenu};
  36. $cur_menu_dep = $pkg->{submenudep} and print "if $cur_menu_dep\n";
  37. print "menu \"$cur_menu\"\n";
  38. }
  39. }
  40. my $title = $pkg->{name};
  41. my $c = (72 - length($pkg->{name}) - length($pkg->{title}));
  42. if ($c > 0) {
  43. $title .= ("." x $c). " ". $pkg->{title};
  44. }
  45. print "\t";
  46. $pkg->{menu} and print "menu";
  47. print "config PACKAGE_".$pkg->{name}."\n";
  48. print "\t\ttristate \"$title\"\n";
  49. foreach my $default (split /\s*,\s*/, $pkg->{default}) {
  50. print "\t\tdefault $default\n";
  51. }
  52. foreach my $depend (@{$pkg->{depends}}) {
  53. my $m = "depends";
  54. $depend =~ s/^([@\+]+)//;
  55. my $flags = $1;
  56. $flags =~ /@/ or $depend = "PACKAGE_$depend";
  57. $flags =~ /\+/ and $m = "select";
  58. print "\t\t$m $depend\n";
  59. }
  60. print "\t\thelp\n";
  61. print $pkg->{description};
  62. print "\n";
  63. $pkg->{config} and print $pkg->{config}."\n";
  64. }
  65. }
  66. close_submenu();
  67. print "endmenu\n\n";
  68. undef $category{$cat};
  69. }
  70. my $line;
  71. while ($line = <>) {
  72. chomp $line;
  73. $line =~ /^Source-Makefile: \s*(.+\/([^\/]+)\/Makefile)\s*$/ and do {
  74. $makefile = $1;
  75. $src = $2;
  76. undef $pkg;
  77. };
  78. $line =~ /^Package: \s*(.+)\s*$/ and do {
  79. $pkg = {};
  80. $pkg->{src} = $src;
  81. $pkg->{makefile} = $makefile;
  82. $pkg->{name} = $1;
  83. $pkg->{default} = "m if ALL";
  84. };
  85. $line =~ /^Version: \s*(.+)\s*$/ and $pkg->{version} = $1;
  86. $line =~ /^Title: \s*(.+)\s*$/ and $pkg->{title} = $1;
  87. $line =~ /^Menu: \s*(.+)\s*$/ and $pkg->{menu} = $1;
  88. $line =~ /^Submenu: \s*(.+)\s*$/ and $pkg->{submenu} = $1;
  89. $line =~ /^Submenu-Depends: \s*(.+)\s*$/ and $pkg->{submenudep} = $1;
  90. $line =~ /^Default: \s*(.+)\s*$/ and $pkg->{default} = $1;
  91. $line =~ /^Depends: \s*(.+)\s*$/ and do {
  92. my @dep = split /\s+/, $1;
  93. $pkg->{depends} = \@dep;
  94. };
  95. $line =~ /^Category: \s*(.+)\s*$/ and do {
  96. $pkg->{category} = $1;
  97. defined $category{$1} or $category{$1} = {};
  98. defined $category{$1}->{$src} or $category{$1}->{$src} = [];
  99. push @{$category{$1}->{$src}}, $pkg;
  100. };
  101. $line =~ /^Description: \s*(.*)\s*$/ and do {
  102. my $desc = "\t\t$1\n\n";
  103. my $line;
  104. while ($line = <>) {
  105. last if $line =~ /^@@/;
  106. $desc .= "\t\t$line";
  107. }
  108. $pkg->{description} = $desc;
  109. };
  110. $line =~ /^Config: \s*(.*)\s*$/ and do {
  111. my $conf = "$1\n";
  112. my $line;
  113. while ($line = <>) {
  114. last if $line =~ /^@@/;
  115. $conf .= "$line";
  116. }
  117. $pkg->{config} = $conf;
  118. }
  119. }
  120. print_category 'Base system';
  121. foreach my $cat (keys %category) {
  122. print_category $cat;
  123. }