X-Git-Url: http://git.rohieb.name/openwrt.git/blobdiff_plain/2e92008789a4f4161de924d41292e3ef39829b92..2ff6ff3e54afc49216edc4208ffa3943454473be:/scripts/metadata.pl?ds=sidebyside diff --git a/scripts/metadata.pl b/scripts/metadata.pl index 580e29ea0..51dcc425b 100755 --- a/scripts/metadata.pl +++ b/scripts/metadata.pl @@ -15,6 +15,8 @@ sub confstr($) { sub parse_target_metadata() { my $file = shift @ARGV; my ($target, @target, $profile); + my %target; + open FILE, "<$file" or do { warn "Can't open file '$file': $!\n"; return; @@ -22,18 +24,26 @@ sub parse_target_metadata() { while () { chomp; /^Target:\s*(.+)\s*$/ and do { + my $name = $1; $target = { - id => $1, - conf => confstr($1), + id => $name, + board => $name, + boardconf => confstr($name), + conf => confstr($name), profiles => [], features => [], - depends => [] + depends => [], + subtargets => [] }; push @target, $target; - }; - /^Target-Board:\s*(.+)\s*$/ and do { - $target->{board} = $1; - $target->{boardconf} = confstr($1); + $target{$name} = $target; + if ($name =~ /([^\/]+)\/([^\/]+)/) { + push @{$target{$1}->{subtargets}}, $2; + $target->{board} = $1; + $target->{boardconf} = confstr($1); + $target->{subtarget} = 1; + $target->{parent} = $target{$1}; + } }; /^Target-Kernel:\s*(\d+\.\d+)\s*$/ and $target->{kernel} = $1; /^Target-Name:\s*(.+)\s*$/ and $target->{name} = $1; @@ -62,6 +72,7 @@ sub parse_target_metadata() { } close FILE; foreach my $target (@target) { + next if @{$target->{subtargets}} > 0; @{$target->{profiles}} > 0 or $target->{profiles} = [ { id => 'Default', @@ -140,6 +151,8 @@ sub target_config_features(@) { while ($_ = shift @_) { /broken/ and $ret .= "\tdepends BROKEN\n"; + /display/ and $ret .= "\tselect DISPLAY_SUPPORT\n"; + /gpio/ and $ret .= "\tselect GPIO_SUPPORT\n"; /pci/ and $ret .= "\tselect PCI_SUPPORT\n"; /usb/ and $ret .= "\tselect USB_SUPPORT\n"; /pcmcia/ and $ret .= "\tselect PCMCIA_SUPPORT\n"; @@ -147,51 +160,59 @@ sub target_config_features(@) { /jffs2/ and $ret .= "\tselect USES_JFFS2\n"; /ext2/ and $ret .= "\tselect USES_EXT2\n"; /tgz/ and $ret .= "\tselect USES_TGZ\n"; + /cpiogz/ and $ret .= "\tselect USES_CPIOGZ\n"; } return $ret; } +sub target_name($) { + my $target = shift; + my $parent = $target->{parent}; + if ($parent) { + return $target->{parent}->{name}." - ".$target->{name}; + } else { + return $target->{name}; + } +} -sub gen_target_config() { - my @target = parse_target_metadata(); +sub kver($) { + my $v = shift; + $v =~ tr/\./_/; + $v =~ /(\d+_\d+_\d+)(_\d+)?/ and $v = $1; + return $v; +} - @target = sort { - $a->{name} cmp $b->{name} - } @target; - - - print <{features}}); + my $help = $target->{desc}; + my $kernel = $target->{kernel}; + my $confstr; + $kernel =~ tr/./_/; + + chomp $features; + $features .= "\n"; + if ($help =~ /\w+/) { + $help =~ s/^\s*/\t /mg; + $help = "\thelp\n$help"; + } else { + undef $help; + } - foreach my $target (@target) { - my $features = target_config_features(@{$target->{features}}); - my $help = $target->{desc}; - my $kernel = $target->{kernel}; - $kernel =~ tr/./_/; - - chomp $features; - $features .= "\n"; - if ($help =~ /\w+/) { - $help =~ s/^\s*/\t /mg; - $help = "\thelp\n$help"; - } else { - undef $help; - } - - print <{version}); + $confstr = <{conf} bool "$target->{name}" - select $target->{arch} select LINUX_$kernel + select LINUX_$v EOF - if ($target->{id} ne $target->{board}) { - print "\tselect TARGET_".$target->{boardconf}."\n"; - } + if ($target->{subtarget}) { + $confstr .= "\tdepends TARGET_$target->{boardconf}\n"; + } + if (@{$target->{subtargets}} > 0) { + $confstr .= "\tselect HAS_SUBTARGETS\n"; + } else { + $confstr .= "\tselect $target->{arch}\n"; foreach my $dep (@{$target->{depends}}) { my $mode = "depends"; my $flags; @@ -203,40 +224,59 @@ EOF $flags =~ /-/ and $mode = "deselect"; $flags =~ /\+/ and $mode = "select"; - $flags =~ /@/ and print "\t$mode $name\n"; + $flags =~ /@/ and $confstr .= "\t$mode $name\n"; } - - print "$features$help\n\n" + $confstr .= $features; + } + + $confstr .= "$help\n\n"; + print $confstr; +} + +sub gen_target_config() { + my @target = parse_target_metadata(); + + my @target_sort = sort { + target_name($a) cmp target_name($b); + } @target; + + + print <{subtarget}; + print_target($target); } print <{board}."\" if TARGET_".$target->{conf}."\n"; + next unless $target->{subtarget}; + print_target($target); } - # add hidden target config options - foreach my $target (@target) { - next if $board{$target->{board}}; - if ($target->{id} ne $target->{board}) { - print "\nconfig TARGET_".$target->{boardconf}."\n\tbool\n"; - $board{$target->{board}} = 1; - } - } - print <{profiles}; - + foreach my $profile (@$profiles) { print <{conf}_$profile->{id} @@ -253,7 +293,30 @@ EOF } } - print "endchoice\n"; + print <{subtarget} or print "\t\tdefault \"".$target->{board}."\" if TARGET_".$target->{conf}."\n"; + } + + my %kver; + foreach my $target (@target) { + my $v = kver($target->{version}); + next if $kver{$v}; + $kver{$v} = 1; + print <{vdepends}) { $depend = join("||", map { "PACKAGE_".$_ } @$vdep); } else { @@ -321,10 +386,14 @@ sub mconf_depends($$) { # thus if FOO depends on other config options, these dependencies # will not be checked. To fix this, we simply emit all of FOO's # depends here as well. - $package{$depend} and $res .= mconf_depends($package{$depend}->{depends}, 1); + $package{$depend} and mconf_depends($package{$depend}->{depends}, 1, $dep); }; $flags =~ /@/ or $depend = "PACKAGE_$depend"; } + $dep->{$depend} =~ /select/ or $dep->{$depend} = $m; + } + foreach my $depend (keys %$dep) { + my $m = $dep->{$depend}; $res .= "\t\t$m $depend\n"; } return $res; @@ -334,12 +403,12 @@ sub print_package_config_category($) { my $cat = shift; my %menus; my %menu_dep; - + return unless $category{$cat}; - + print "menu \"$cat\"\n\n"; my %spkg = %{$category{$cat}}; - + foreach my $spkg (sort {uc($a) cmp uc($b)} keys %spkg) { foreach my $pkg (@{$spkg{$spkg}}) { my $menu = $pkg->{submenu}; @@ -396,7 +465,7 @@ sub print_package_config_category($) { } } print "endmenu\n\n"; - + undef $category{$cat}; } @@ -431,7 +500,7 @@ sub gen_package_mk() { foreach my $name (sort {uc($a) cmp uc($b)} keys %package) { my $config; my $pkg = $package{$name}; - + next if defined $pkg->{vdepends}; if ($ENV{SDK}) { $conf{$pkg->{src}} or do { @@ -445,7 +514,7 @@ sub gen_package_mk() { print "package-$config += $pkg->{subdir}$pkg->{src}\n"; $pkg->{prereq} and print "prereq-$config += $pkg->{subdir}$pkg->{src}\n"; } - + my $hasdeps = 0; my $depline = ""; foreach my $dep (@{$pkg->{depends}}, @{$pkg->{builddepends}}) { @@ -471,7 +540,7 @@ sub gen_package_mk() { $line .= "\$(curdir)/".$pkg->{subdir}."$pkg->{src}/compile += $depline\n"; } } - + if ($line ne "") { print "\n$line"; }