[PATCH] scripts: Add Buildbot dumpinfo.pl script

Paul Spooren mail at aparcar.org
Mon Jul 13 04:56:33 EDT 2020


On 12.07.20 17:16, Paul Spooren wrote:
> The dumpinfo.pl script comes from buildbot.git[0] and is used to print
> available targets and architectures, which are then build.
>
> As the buildbot clones openwrt.git anyway, the script might as well live
> here as it can be used for other cases as well, e.g. determining what
> architectures are available when building Docker containers or show
> developers an overview which architectures are used by which target.

With the dumpinfo script we could clean up the current docker 
implementation which uses a single targets.yml file with some special 
cases to handle target changes between snapshot and releases.[1]

[1]: https://github.com/openwrt/docker/blob/master/.gitlab/ci/targets.yml

GitLab supports now dynamic child piplines[2], so a parsed dumpinfo 
could automatically create CI jobs to create Docker IB/SDK containers.

[2]: https://gitlab.com/gitlab-org/gitlab/-/issues/35632

> It's called with either the parameter `architectures` or `targets`,
> showing architectures followed by supported targets or targets, followed
> by the supported architectures:
>
> $ ./scripts/dumpinfo.pl architectures
> aarch64_cortex-a53 bcm27xx/bcm2710 mediatek/mt7622 mvebu/cortexa53 sunxi/cortexa53
> aarch64_cortex-a72 bcm27xx/bcm2711 mvebu/cortexa72
> ...
>
> $ ./scripts/dumpinfo.pl targets
> apm821xx/nand powerpc_464fp
> apm821xx/sata powerpc_464fp
> ...
>
> In the future the `dumpinfo.pl` script could be removed from the
> buildbot repository and maintained only here.
>
> [0]: https://git.openwrt.org/?p=buildbot.git;a=blob;f=scripts/dumpinfo.pl;h=aa97f8d60379076a41b968402e9337cea824ece5;hb=HEAD
>
> Signed-off-by: Paul Spooren <mail at aparcar.org>
> ---
>   scripts/dumpinfo.pl | 91 +++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 91 insertions(+)
>   create mode 100755 scripts/dumpinfo.pl
>
> diff --git a/scripts/dumpinfo.pl b/scripts/dumpinfo.pl
> new file mode 100755
> index 0000000000..aa97f8d603
> --- /dev/null
> +++ b/scripts/dumpinfo.pl
> @@ -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 &&
> +				    !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";
> +}



More information about the openwrt-devel mailing list