Remove intermediate master directory
[buildbot.git] / phase1 / dumpinfo.pl
diff --git a/phase1/dumpinfo.pl b/phase1/dumpinfo.pl
new file mode 100755 (executable)
index 0000000..18a226f
--- /dev/null
@@ -0,0 +1,91 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use Cwd;
+
+my (%targets, %architectures);
+
+$ENV{'TOPDIR'} = Cwd::getcwd();
+
+
+sub parse_targetinfo {
+       my ($target_dir, $subtarget) = @_;
+
+       if (open M, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 SUBTARGET='$subtarget' |") {
+               my ($target_name, $target_arch, @target_features);
+               while (defined(my $line = readline M)) {
+                       chomp $line;
+
+                       if ($line =~ /^Target: (.+)$/) {
+                               $target_name = $1;
+                       }
+                       elsif ($line =~ /^Target-Arch-Packages: (.+)$/) {
+                               $target_arch = $1;
+                       }
+                       elsif ($line =~ /^Target-Features: (.+)$/) {
+                               @target_features = split /\s+/, $1;
+                       }
+                       elsif ($line =~ /^@\@$/) {
+                               if ($target_name && $target_arch && $target_name ne 'uml/generic' &&
+                                   !grep { $_ eq 'broken' } @target_features) {
+                                       $targets{$target_name} = $target_arch;
+                                       $architectures{$target_arch} ||= [];
+                                       push @{$architectures{$target_arch}}, $target_name;
+                               }
+
+                               undef $target_name;
+                               undef $target_arch;
+                               @target_features = ();
+                       }
+               }
+               close M;
+       }
+}
+
+sub get_targetinfo {
+       foreach my $target_makefile (glob "target/linux/*/Makefile") {
+               my ($target_dir) = $target_makefile =~ m!^(.+)/Makefile$!;
+               my @subtargets;
+
+               if (open M, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 val.FEATURES V=s 2>/dev/null |") {
+                       if (defined(my $line = readline M)) {
+                               chomp $line;
+                               if (grep { $_ eq 'broken' } split /\s+/, $line) {
+                                       next;
+                               }
+                       }
+               }
+
+               if (open M, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 val.SUBTARGETS V=s 2>/dev/null |") {
+                       if (defined(my $line = readline M)) {
+                               chomp $line;
+                               @subtargets = split /\s+/, $line;
+                       }
+                       close M;
+               }
+
+               push @subtargets, 'generic' if @subtargets == 0;
+
+               foreach my $subtarget (@subtargets) {
+                       parse_targetinfo($target_dir, $subtarget);
+               }
+       }
+}
+
+if (@ARGV == 1 && $ARGV[0] eq 'targets') {
+       get_targetinfo();
+       foreach my $target_name (sort keys %targets) {
+               printf "%s %s\n", $target_name, $targets{$target_name};
+       }
+}
+elsif (@ARGV == 1 && $ARGV[0] eq 'architectures') {
+       get_targetinfo();
+       foreach my $target_arch (sort keys %architectures) {
+               printf "%s %s\n", $target_arch, join ' ', @{$architectures{$target_arch}};
+       }
+}
+else {
+       print "Usage: $0 targets\n";
+       print "Usage: $0 architectures\n";
+}