X-Git-Url: https://git.archive.openwrt.org/?p=openwrt.git;a=blobdiff_plain;f=scripts%2Fmetadata.pl;h=54341c458fd78747eae0219a863c1b5cd1f358a2;hp=366e61cb63030843a9cd3a6f7e10a8cfe036a4ad;hb=90043a99adccb6c7f9dc881f051b5a7b247f8704;hpb=6b15a044d8e96f73486ec11c2029095b61869b95 diff --git a/scripts/metadata.pl b/scripts/metadata.pl index 366e61cb63..54341c458f 100755 --- a/scripts/metadata.pl +++ b/scripts/metadata.pl @@ -6,88 +6,45 @@ use metadata; my %board; -sub confstr($) { - my $conf = shift; - $conf =~ tr#/\.\-/#___#; - return $conf; +sub version_to_num($) { + my $str = shift; + my $num = 0; + + if (defined($str) && $str =~ /^\d+(?:\.\d+)+$/) + { + my @n = (split(/\./, $str), 0, 0, 0, 0); + $num = ($n[0] << 24) | ($n[1] << 16) | ($n[2] << 8) | $n[3]; + } + + return $num; } -sub parse_target_metadata() { - my $file = shift @ARGV; - my ($target, @target, $profile); - my %target; +sub version_filter_list(@) { + my $cmpver = version_to_num(shift @_); + my @items; - open FILE, "<$file" or do { - warn "Can't open file '$file': $!\n"; - return; - }; - while () { - chomp; - /^Target:\s*(.+)\s*$/ and do { - my $name = $1; - $target = { - id => $name, - board => $name, - boardconf => confstr($name), - conf => confstr($name), - profiles => [], - features => [], - depends => [], - subtargets => [] - }; - push @target, $target; - $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-Name:\s*(.+)\s*$/ and $target->{name} = $1; - /^Target-Path:\s*(.+)\s*$/ and $target->{path} = $1; - /^Target-Arch:\s*(.+)\s*$/ and $target->{arch} = $1; - /^Target-Arch-Packages:\s*(.+)\s*$/ and $target->{arch_packages} = $1; - /^Target-Features:\s*(.+)\s*$/ and $target->{features} = [ split(/\s+/, $1) ]; - /^Target-Depends:\s*(.+)\s*$/ and $target->{depends} = [ split(/\s+/, $1) ]; - /^Target-Description:/ and $target->{desc} = get_multiline(*FILE); - /^Target-Optimization:\s*(.+)\s*$/ and $target->{cflags} = $1; - /^CPU-Type:\s*(.+)\s*$/ and $target->{cputype} = $1; - /^Linux-Version:\s*(.+)\s*$/ and $target->{version} = $1; - /^Linux-Release:\s*(.+)\s*$/ and $target->{release} = $1; - /^Linux-Kernel-Arch:\s*(.+)\s*$/ and $target->{karch} = $1; - /^Default-Subtarget:\s*(.+)\s*$/ and $target->{def_subtarget} = $1; - /^Default-Packages:\s*(.+)\s*$/ and $target->{packages} = [ split(/\s+/, $1) ]; - /^Target-Profile:\s*(.+)\s*$/ and do { - $profile = { - id => $1, - name => $1, - packages => [] - }; - push @{$target->{profiles}}, $profile; - }; - /^Target-Profile-Name:\s*(.+)\s*$/ and $profile->{name} = $1; - /^Target-Profile-Packages:\s*(.*)\s*$/ and $profile->{packages} = [ split(/\s+/, $1) ]; - /^Target-Profile-Description:\s*(.*)\s*/ and $profile->{desc} = get_multiline(*FILE); - /^Target-Profile-Config:/ and $profile->{config} = get_multiline(*FILE, "\t"); - /^Target-Profile-Kconfig:/ and $profile->{kconfig} = 1; - } - close FILE; - foreach my $target (@target) { - if (@{$target->{subtargets}} > 0) { - $target->{profiles} = []; - next; - } - @{$target->{profiles}} > 0 or $target->{profiles} = [ + foreach my $item (@_) + { + if ($item =~ s/@(lt|le|gt|ge|eq|ne)(\d+(?:\.\d+)+)\b//) + { + my $op = $1; + my $symver = version_to_num($2); + + if ($symver > 0 && $cmpver > 0) { - id => 'Default', - name => 'Default', - packages => [] + next unless (($op eq 'lt' && $cmpver < $symver) || + ($op eq 'le' && $cmpver <= $symver) || + ($op eq 'gt' && $cmpver > $symver) || + ($op eq 'ge' && $cmpver >= $symver) || + ($op eq 'eq' && $cmpver == $symver) || + ($op eq 'ne' && $cmpver != $symver)); } - ]; + } + + push @items, $item; } - return @target; + + return @items; } sub gen_kconfig_overrides() { @@ -96,6 +53,7 @@ sub gen_kconfig_overrides() { my $package; my $pkginfo = shift @ARGV; my $cfgfile = shift @ARGV; + my $patchver = shift @ARGV; # parameter 2: build system config open FILE, "<$cfgfile" or return; @@ -110,7 +68,7 @@ sub gen_kconfig_overrides() { /^Package:\s*(.+?)\s*$/ and $package = $1; /^Kernel-Config:\s*(.+?)\s*$/ and do { my @config = split /\s+/, $1; - foreach my $config (@config) { + foreach my $config (version_filter_list($patchver, @config)) { my $val = 'm'; my $override; if ($config =~ /^(.+?)=(.+)$/) { @@ -247,11 +205,11 @@ EOF grep { /broken/ } @{$target->{features}} and $confstr .= "\tdepends on BROKEN\n"; } else { $confstr .= $features; + if ($target->{arch} =~ /\w/) { + $confstr .= "\tselect $target->{arch}\n"; + } } - if ($target->{arch} =~ /\w/) { - $confstr .= "\tselect $target->{arch}\n"; - } foreach my $dep (@{$target->{depends}}) { my $mode = "depends on"; my $flags; @@ -271,7 +229,8 @@ EOF } sub gen_target_config() { - my @target = parse_target_metadata(); + my $file = shift @ARGV; + my @target = parse_target_metadata($file); my %defaults; my @target_sort = sort { @@ -586,7 +545,11 @@ sub print_package_config_category($) { print "\t\t".($pkg->{tristate} ? 'tristate' : 'bool')." $title\n"; print "\t\tdefault y if DEFAULT_".$pkg->{name}."\n"; unless ($pkg->{hidden}) { - $pkg->{default} ||= "m if ALL"; + if ($pkg->{name} =~ /^kmod-/) { + $pkg->{default} ||= "m if ALL_KMODS"; + } else { + $pkg->{default} ||= "m if ALL"; + } } if ($pkg->{default}) { foreach my $default (split /\s*,\s*/, $pkg->{default}) { @@ -637,6 +600,13 @@ EOF print "endmenu\n\n"; } +sub print_package_overrides() { + keys %overrides > 0 or return; + print "\tconfig OVERRIDE_PKGS\n"; + print "\t\tstring\n"; + print "\t\tdefault \"".join(" ", keys %overrides)."\"\n\n"; +} + sub gen_package_config() { parse_package_metadata($ARGV[0]) or exit 1; print "menuconfig IMAGEOPT\n\tbool \"Image configuration\"\n\tdefault n\n"; @@ -662,6 +632,7 @@ EOF foreach my $cat (sort {uc($a) cmp uc($b)} keys %category) { print_package_config_category $cat; } + print_package_overrides(); } sub get_conditional_dep($$) { @@ -871,6 +842,34 @@ sub gen_package_feeds() { } } +sub gen_package_license($) { + my $level = shift; + parse_package_metadata($ARGV[0]) or exit 1; + foreach my $name (sort {uc($a) cmp uc($b)} keys %package) { + my $pkg = $package{$name}; + if ($pkg->{name}) { + if ($pkg->{license}) { + print "$pkg->{name}: "; + print "$pkg->{license}\n"; + if ($pkg->{licensefiles} && $level == 0) { + print "\tFiles: $pkg->{licensefiles}\n"; + } + } else { + if ($level == 1) { + print "$pkg->{name}: Missing license! "; + print "Please fix $pkg->{makefile}\n"; + } + } + } + } +} + +sub gen_version_filtered_list() { + foreach my $item (version_filter_list(@ARGV)) { + print "$item\n"; + } +} + sub parse_command() { my $cmd = shift @ARGV; for ($cmd) { @@ -880,15 +879,21 @@ sub parse_command() { /^kconfig/ and return gen_kconfig_overrides(); /^package_source$/ and return gen_package_source(); /^package_feeds$/ and return gen_package_feeds(); + /^package_license$/ and return gen_package_license(0); + /^package_licensefull$/ and return gen_package_license(1); + /^version_filter$/ and return gen_version_filtered_list(); } print <