1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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 &&
!grep { $_ eq 'broken' or $_ eq 'source-only' } @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' or $_ eq 'source-only' } 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";
}
|