7 my (%targets, %architectures, %kernels, %devices);
9 $ENV{'TOPDIR'} = Cwd
::getcwd
();
12 sub parse_targetinfo
{
13 my ($target_dir, $subtarget) = @_;
15 if (open M
, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 SUBTARGET='$subtarget' |") {
16 my ($target_name, $target_arch, $target_kernel, $target_testing_kernel, @target_features);
17 while (defined(my $line = readline M
)) {
20 if ($line =~ /^Target: (.+)$/) {
23 elsif ($line =~ /^Target-Arch-Packages: (.+)$/) {
26 elsif ($line =~ /^Linux-Version: (\d\.\d+)\.\d+$/) {
29 elsif ($line =~ /^Linux-Testing-Version: (\d\.\d+)\.\d+$/) {
30 $target_testing_kernel = $1;
32 elsif ($line =~ /^Target-Features: (.+)$/) {
33 @target_features = split /\s+/, $1;
35 elsif ($line =~ /^@\@$/) {
36 if ($target_name && $target_arch && $target_kernel &&
37 !grep { $_ eq 'broken' or $_ eq 'source-only' } @target_features) {
38 $targets{$target_name} = $target_arch;
39 $architectures{$target_arch} ||= [];
40 push @
{$architectures{$target_arch}}, $target_name;
41 $kernels{$target_name} ||= [];
42 push @
{$kernels{$target_name}}, $target_kernel;
43 if ($target_testing_kernel) {
44 push @
{$kernels{$target_name}}, $target_testing_kernel;
51 undef $target_testing_kernel;
52 @target_features = ();
60 my ($target_dir, $subtarget) = @_;
62 if (open M
, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 SUBTARGET='$subtarget' V=s |") {
63 my ($device_profile, $device_name, @device_alt_names, $device_is_alt);
64 while (defined(my $line = readline M
)) {
67 if ($line =~ /^Target-Profile-Name: (.+)$/) {
70 elsif ($line =~ /^Target-Profile: DEVICE_(.+)$/) {
74 # DUMP duplicate info for each alternative device name and
75 # the alternative device name are printed first before the
77 # Alternative device titles always have the full list of
78 # all the alternative device name.
79 # The device name pattern for an alternative device name is
80 # Target-Profile-Name: ALT_NAME (PRIMARY_NAME)
81 # We compare the detected device name and check if it does
82 # match the alternative device name pattern with one of
83 # the alternative device name in Alternative device titles:
84 # If an alternative device name is detected,
85 # alternative device is skipped.
86 elsif ($line =~ /^Alternative device titles:$/) {
87 while (defined($line = readline M
)) {
88 if ($line =~ /^- (.+)$/) {
89 if ($device_name =~ /^\Q$1\E \((.+)\)$/) {
93 push @device_alt_names, $1;
100 if ($line =~ /^@\@$/) {
101 if ($device_name && $device_profile && ! $device_is_alt) {
102 push @
{$devices{$device_profile}}, $device_name;
104 if (scalar @device_alt_names) {
105 foreach my $device_alt_name (sort values @device_alt_names) {
106 push @
{$devices{$device_profile}}, $device_alt_name;
112 undef $device_profile;
113 undef $device_is_alt;
114 @device_alt_names = ();
122 foreach my $target_makefile (glob "target/linux/*/Makefile") {
123 my ($target_dir) = $target_makefile =~ m!^(.+)/Makefile$!;
126 if (open M
, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 val.FEATURES V=s 2>/dev/null |") {
127 if (defined(my $line = readline M
)) {
129 if (grep { $_ eq 'broken' or $_ eq 'source-only' } split /\s+/, $line) {
135 if (open M
, "make -C '$target_dir' --no-print-directory DUMP=1 TARGET_BUILD=1 val.SUBTARGETS V=s 2>/dev/null |") {
136 if (defined(my $line = readline M
)) {
138 @subtargets = split /\s+/, $line;
143 push @subtargets, 'generic' if @subtargets == 0;
145 foreach my $subtarget (@subtargets) {
146 parse_targetinfo
($target_dir, $subtarget);
152 my ($target_subtarget) = @_;
153 my ($target, $subtarget) = split /\//, $target_subtarget;
155 my ($target_dir) = "target/linux/" . $target;
157 parse_devices
($target_dir, $subtarget)
160 if (@ARGV == 1 && $ARGV[0] eq 'targets') {
162 foreach my $target_name (sort keys %targets) {
163 printf "%s %s\n", $target_name, $targets{$target_name};
166 elsif (@ARGV == 1 && $ARGV[0] eq 'architectures') {
168 foreach my $target_arch (sort keys %architectures) {
169 printf "%s %s\n", $target_arch, join ' ', @
{$architectures{$target_arch}};
172 elsif (@ARGV == 1 && $ARGV[0] eq 'kernels') {
174 foreach my $target_name (sort keys %targets) {
175 printf "%s %s\n", $target_name, join ' ', @
{$kernels{$target_name}};
178 elsif (@ARGV == 2 && $ARGV[0] eq 'devices') {
179 get_devices
($ARGV[1]);
180 foreach my $device (sort keys %devices) {
181 printf "%s \"%s\"\n", $device, join '" "', @
{$devices{$device}};
185 print "Usage: $0 targets\n";
186 print "Usage: $0 architectures\n";
187 print "Usage: $0 kernels\n";
188 print "Usage: $0 devices <target/subtarget>\n";