metadata.pl: add support for forcing sorting of profiles
[librecmc/librecmc.git] / scripts / metadata.pl
index 99fdba1c819665746200c1e82cc0fd4b6bc5a71a..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;
@@ -321,6 +325,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 +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;
        }
@@ -546,11 +572,14 @@ 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}) {
+                               my @def = ("ALL");
+                               if (!exists($pkg->{repository})) {
+                                       push @def, "ALL_NONSHARED";
+                               }
                                if ($pkg->{name} =~ /^kmod-/) {
-                                       $pkg->{default} ||= "m if ALL_KMODS";
-                               } else {
-                                       $pkg->{default} ||= "m if ALL";
+                                       push @def, "ALL_KMODS";
                                }
+                               $pkg->{default} ||= "m if " . join("||", @def);
                        }
                        if ($pkg->{default}) {
                                foreach my $default (split /\s*,\s*/, $pkg->{default}) {
@@ -837,8 +866,8 @@ 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->{package_subdir}) {
-                       print "Package/$name/subdir = $pkg->{package_subdir}\n";
+               if ($pkg->{name} && $pkg->{repository}) {
+                       print "Package/$name/subdir = $pkg->{repository}\n";
                }
        }
 }