metadata.pl: add support for forcing sorting of profiles
[librecmc/librecmc.git] / scripts / metadata.pl
index 5695bda4a45bb31ed2cea3bd8d96152db473ea21..f5afb1e47b49a60d696afc42705d706e1f39c7c7 100755 (executable)
@@ -282,6 +282,10 @@ EOF
 
        foreach my $target (@target) {
                my $profiles = $target->{profiles};
+               $target->{sort} and @$profiles = sort {
+                       $a->{priority} <=> $b->{priority} or
+                       $a->{name} cmp $b->{name};
+               } @$profiles;
 
                foreach my $profile (@$profiles) {
                        print <<EOF;
@@ -457,28 +461,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;
        }