metadata.pl: add support for selecting packages available only via PROVIDES
authorLuka Perkov <luka@openwrt.org>
Tue, 10 May 2016 22:36:57 +0000 (22:36 +0000)
committerLuka Perkov <luka@openwrt.org>
Tue, 10 May 2016 22:36:57 +0000 (22:36 +0000)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
SVN-Revision: 49346

scripts/metadata.pl

index 6ad3c39f003854e1c85a5422e8b24e070ad37765..96d5ee42084777342ee516f7f113320f697f39ab 100755 (executable)
@@ -457,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;
        }