metadata.pl: add support for selecting packages available only via PROVIDES
[openwrt.git] / scripts / metadata.pl
index 48b1b7a..96d5ee4 100755 (executable)
@@ -321,6 +321,18 @@ EOF
                $target->{subtarget} or print "\t\tdefault \"".$target->{board}."\" if TARGET_".$target->{conf}."\n";
        }
        print <<EOF;
+config TARGET_SUBTARGET
+       string
+       default "generic" if !HAS_SUBTARGETS
+
+EOF
+
+       foreach my $target (@target) {
+               foreach my $subtarget (@{$target->{subtargets}}) {
+                       print "\t\tdefault \"$subtarget\" if TARGET_".$target->{conf}."_$subtarget\n";
+               }
+       }
+       print <<EOF;
 config TARGET_ARCH_PACKAGES
        string
        
@@ -445,28 +457,38 @@ sub mconf_depends {
                        $depend = $2;
                }
                next if $package{$depend} and $package{$depend}->{buildonly};
-               if ($vdep = $package{$depend}->{vdepends}) {
-                       $depend = join("||", map { "PACKAGE_".$_ } @$vdep);
-               } else {
-                       $flags =~ /\+/ and do {
-                               # Menuconfig will not treat 'select FOO' as a real dependency
-                               # 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 push @t_depends, [ $package{$depend}->{depends}, $condition ];
-
-                               $m = "select";
-                               next if $only_dep;
-                       };
-                       $flags =~ /@/ or $depend = "PACKAGE_$depend";
-                       if ($condition) {
-                               if ($m =~ /select/) {
-                                       next if $depend eq $condition;
-                                       $depend = "$depend if $condition";
-                               } else {
-                                       $depend = "!($condition) || $depend" unless $dep->{$condition} eq 'select';
+               if ($flags =~ /\+/) {
+                       if ($vdep = $package{$depend}->{vdepends}) {
+                               my @vdeps = @$vdep;
+                               $depend = shift @vdeps;
+                               if (@vdeps > 1) {
+                                       $condition = '!('.join("||", map { "PACKAGE_".$_ } @vdeps).')';
+                               } elsif (@vdeps > 0) {
+                                       $condition = '!PACKAGE_'.$vdeps[0];
                                }
                        }
+
+                       # Menuconfig will not treat 'select FOO' as a real dependency
+                       # 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 push @t_depends, [ $package{$depend}->{depends}, $condition ];
+
+                       $m = "select";
+                       next if $only_dep;
+               } else {
+                       if ($vdep = $package{$depend}->{vdepends}) {
+                               $depend = join("||", map { "PACKAGE_".$_ } @$vdep);
+                       }
+               }
+               $flags =~ /@/ or $depend = "PACKAGE_$depend";
+               if ($condition) {
+                       if ($m =~ /select/) {
+                               next if $depend eq $condition;
+                               $depend = "$depend if $condition";
+                       } else {
+                               $depend = "!($condition) || $depend" unless $dep->{$condition} eq 'select';
+                       }
                }
                $dep->{$depend} =~ /select/ or $dep->{$depend} = $m;
        }
@@ -833,12 +855,12 @@ sub gen_package_source() {
        }
 }
 
-sub gen_package_feeds() {
+sub gen_package_subdirs() {
        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} && $pkg->{feed}) {
-                       print "Package/$name/feed = $pkg->{feed}\n";
+               if ($pkg->{name} && $pkg->{package_subdir}) {
+                       print "Package/$name/subdir = $pkg->{package_subdir}\n";
                }
        }
 }
@@ -880,7 +902,7 @@ sub parse_command() {
                /^package_config$/ and return gen_package_config();
                /^kconfig/ and return gen_kconfig_overrides();
                /^package_source$/ and return gen_package_source();
-               /^package_feeds$/ and return gen_package_feeds();
+               /^package_subdirs$/ and return gen_package_subdirs();
                /^package_license$/ and return gen_package_license(0);
                /^package_licensefull$/ and return gen_package_license(1);
                /^version_filter$/ and return gen_version_filtered_list();
@@ -892,7 +914,7 @@ Available Commands:
        $0 package_config [file]                Package metadata in Kconfig format
        $0 kconfig [file] [config] [patchver]   Kernel config overrides
        $0 package_source [file]                Package source file information
-       $0 package_feeds [file]                 Package feed information in makefile format
+       $0 package_subdirs [file]               Package subdir information in makefile format
        $0 package_license [file]               Package license information
        $0 package_licensefull [file]           Package license information (full list)
        $0 version_filter [patchver] [list...]  Filter list of version tagged strings