|
@@ -4,7 +4,7 @@ use strict;
|
|
use warnings;
|
|
use warnings;
|
|
use Cwd;
|
|
use Cwd;
|
|
|
|
|
|
-my (%targets, %architectures, %kernels);
|
|
|
|
|
|
+my (%targets, %architectures, %kernels, %devices);
|
|
|
|
|
|
$ENV{'TOPDIR'} = Cwd::getcwd();
|
|
$ENV{'TOPDIR'} = Cwd::getcwd();
|
|
|
|
|
|
@@ -56,6 +56,68 @@ sub parse_targetinfo {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+sub parse_devices {
|
|
|
|
+ my ($target_dir, $subtarget) = @_;
|
|
|
|
+
|
|
|
|
+ if (open M, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 SUBTARGET='$subtarget' V=s |") {
|
|
|
|
+ my ($device_profile, $device_name, @device_alt_names, $device_is_alt);
|
|
|
|
+ while (defined(my $line = readline M)) {
|
|
|
|
+ chomp $line;
|
|
|
|
+
|
|
|
|
+ if ($line =~ /^Target-Profile-Name: (.+)$/) {
|
|
|
|
+ $device_name = $1;
|
|
|
|
+ }
|
|
|
|
+ elsif ($line =~ /^Target-Profile: DEVICE_(.+)$/) {
|
|
|
|
+ $device_profile = $1;
|
|
|
|
+ }
|
|
|
|
+ # Logic behind this.
|
|
|
|
+ # DUMP duplicate info for each alternative device name and
|
|
|
|
+ # the alternative device name are printed first before the
|
|
|
|
+ # primary device name
|
|
|
|
+ # Alternative device titles always have the full list of
|
|
|
|
+ # all the alternative device name.
|
|
|
|
+ # The device name pattern for an alternative device name is
|
|
|
|
+ # Target-Profile-Name: ALT_NAME (PRIMARY_NAME)
|
|
|
|
+ # We compare the detected device name and check if it does
|
|
|
|
+ # match the alternative device name pattern with one of
|
|
|
|
+ # the alternative device name in Alternative device titles:
|
|
|
|
+ # If an alternative device name is detected,
|
|
|
|
+ # alternative device is skipped.
|
|
|
|
+ elsif ($line =~ /^Alternative device titles:$/) {
|
|
|
|
+ while (defined($line = readline M)) {
|
|
|
|
+ if ($line =~ /^- (.+)$/) {
|
|
|
|
+ if ($device_name =~ /^\Q$1\E \((.+)\)$/) {
|
|
|
|
+ $device_is_alt = 1;
|
|
|
|
+ last;
|
|
|
|
+ }
|
|
|
|
+ push @device_alt_names, $1;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ last;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if ($line =~ /^@\@$/) {
|
|
|
|
+ if ($device_name && $device_profile && ! $device_is_alt) {
|
|
|
|
+ push @{$devices{$device_profile}}, $device_name;
|
|
|
|
+
|
|
|
|
+ if (scalar @device_alt_names) {
|
|
|
|
+ foreach my $device_alt_name (sort values @device_alt_names) {
|
|
|
|
+ push @{$devices{$device_profile}}, $device_alt_name;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ undef $device_name;
|
|
|
|
+ undef $device_profile;
|
|
|
|
+ undef $device_is_alt;
|
|
|
|
+ @device_alt_names = ();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ close M;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
sub get_targetinfo {
|
|
sub get_targetinfo {
|
|
foreach my $target_makefile (glob "target/linux/*/Makefile") {
|
|
foreach my $target_makefile (glob "target/linux/*/Makefile") {
|
|
my ($target_dir) = $target_makefile =~ m!^(.+)/Makefile$!;
|
|
my ($target_dir) = $target_makefile =~ m!^(.+)/Makefile$!;
|
|
@@ -86,6 +148,15 @@ sub get_targetinfo {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+sub get_devices {
|
|
|
|
+ my ($target_subtarget) = @_;
|
|
|
|
+ my ($target, $subtarget) = split /\//, $target_subtarget;
|
|
|
|
+
|
|
|
|
+ my ($target_dir) = "target/linux/" . $target;
|
|
|
|
+
|
|
|
|
+ parse_devices($target_dir, $subtarget)
|
|
|
|
+}
|
|
|
|
+
|
|
if (@ARGV == 1 && $ARGV[0] eq 'targets') {
|
|
if (@ARGV == 1 && $ARGV[0] eq 'targets') {
|
|
get_targetinfo();
|
|
get_targetinfo();
|
|
foreach my $target_name (sort keys %targets) {
|
|
foreach my $target_name (sort keys %targets) {
|
|
@@ -104,8 +175,15 @@ elsif (@ARGV == 1 && $ARGV[0] eq 'kernels') {
|
|
printf "%s %s\n", $target_name, join ' ', @{$kernels{$target_name}};
|
|
printf "%s %s\n", $target_name, join ' ', @{$kernels{$target_name}};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+elsif (@ARGV == 2 && $ARGV[0] eq 'devices') {
|
|
|
|
+ get_devices($ARGV[1]);
|
|
|
|
+ foreach my $device (sort keys %devices) {
|
|
|
|
+ printf "%s \"%s\"\n", $device, join '" "', @{$devices{$device}};
|
|
|
|
+ }
|
|
|
|
+}
|
|
else {
|
|
else {
|
|
print "Usage: $0 targets\n";
|
|
print "Usage: $0 targets\n";
|
|
print "Usage: $0 architectures\n";
|
|
print "Usage: $0 architectures\n";
|
|
print "Usage: $0 kernels\n";
|
|
print "Usage: $0 kernels\n";
|
|
|
|
+ print "Usage: $0 devices <target/subtarget>\n";
|
|
}
|
|
}
|