From: Arnout Vandecappelle <arnout@mind.be>
To: buildroot@busybox.net
Subject: [Buildroot] [pkg-perl infra V6 3/9] scancpan: a new script
Date: Tue, 11 Feb 2014 08:13:33 +0100 [thread overview]
Message-ID: <52F9CD9D.5020904@mind.be> (raw)
In-Reply-To: <1392034997-12394-4-git-send-email-francois.perrad@gadz.org>
On 02/10/14 13:23, Francois Perrad wrote:
> which creates Perl/CPAN package files
>
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
> ---
> support/scripts/scancpan | 694 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 694 insertions(+)
> create mode 100755 support/scripts/scancpan
>
> diff --git a/support/scripts/scancpan b/support/scripts/scancpan
> new file mode 100755
> index 0000000..90ecae4
> --- /dev/null
> +++ b/support/scripts/scancpan
> @@ -0,0 +1,694 @@
> +#!/usr/bin/env perl
> +
> +# This chunk of stuff was generated by App::FatPacker. To find the original
> +# file's code, look for the end of this BEGIN block or the string 'FATPACK'
[snip]
It's a pity that it isn't possible to put the included package in a
separate file, that would be easier to review.
> +use 5.010;
> +use strict;
> +use warnings;
> +use Fatal qw(open close);
> +
> +use Getopt::Long;
> +use Pod::Usage;
> +use File::Basename;
> +use Module::CoreList;
> +use MetaCPAN::API::Tiny;
> +
> +my ($help, $man, $quiet, $force, $recommend);
> +GetOptions( 'help|?' => \$help,
> + 'man' => \$man,
> + 'quiet|q' => \$quiet,
> + 'force|f' => \$force,
> + 'recommend' => \$recommend
> +) or pod2usage(-exitval => 1);
> +pod2usage(-exitval => 0) if $help;
> +pod2usage(-exitval => 0, -verbose => 2) if $man;
> +pod2usage(-exitval => 1) if scalar @ARGV == 0;
> +
> +my %dist;
> +my %deps_build;
> +my %deps_runtime;
> +my $mcpan = MetaCPAN::API::Tiny->new();
> +
> +sub fetch {
> + my $name = shift;
> + unless ($dist{$name}) {
> + say qq{fetch ${name}} unless $quiet;
> + my $result = $mcpan->release( distribution => $name );
> + $dist{$name} = $result;
> + my @deps_build = ();
> + my @deps_runtime = ();
> + my $mb;
> + foreach my $dep (@{$result->{dependency}}) {
> + my $modname = ${$dep}{module};
> + $mb = 1 if $modname eq q{Module::Build};
> + next if $modname eq q{perl};
> + next if $modname =~ m|^Alien|;
> + next if $modname =~ m|^Win32|;
> + next if Module::CoreList::first_release( $modname );
This one depends on the perl version installed on the host to decide
which packages should be included... But the host that runs scancpan may
be a different one than the one that builds buildroot.
I think we should baseline a specific minimal perl version (and check
for it in dependencies.sh), and compare with that minimum for host
packages. For target packages, we should compare against the version
found in package/perl/perl.mk.
> + next if ${$dep}{phase} eq q{develop};
> + next if ${$dep}{phase} eq q{test};
> + next if !$recommend && ${$dep}{relationship} ne q{requires};
> + my $distname = $mcpan->module( $modname )->{distribution};
> + if (${$dep}{phase} eq q{runtime}) {
> + push @deps_runtime, $distname;
> + }
> + else { # configure, build
> + push @deps_build, $distname;
> + }
> + fetch( $distname );
> + }
> + unshift @deps_build, q{Module-Build} if $mb;
> + $deps_build{$name} = \@deps_build;
> + $deps_runtime{$name} = \@deps_runtime;
> + }
> + return;
> +}
> +
> +foreach my $distname (@ARGV) {
> + fetch( $distname );
> +}
> +say scalar keys %dist, q{ packages fetched.} unless $quiet;
> +
> +sub fsname {
> + my $name = shift;
> + return q{perl-} . lc $name;
> +}
> +
> +sub brname {
> + my $name = shift;
> + $name =~ s|-|_|g;
> + return uc $name;
> +}
> +
> +while (my ($distname, $dist) = each %dist) {
> + my $fsname = fsname( $distname );
> + my $dirname = q{package/} . $fsname;
> + my $cfgname = $dirname . q{/Config.in};
> + my $mkname = $dirname . q{/} . $fsname . q{.mk};
> + my $brname = brname( $fsname );
> + mkdir $dirname unless -d $dirname;
> + if ($force || !-f $cfgname) {
> + my $abstract = $dist->{abstract} || q{NO ABSTRACT};
> + say qq{write ${cfgname}} unless $quiet;
> + open my $fh, q{>}, $cfgname;
> + say {$fh} qq{config BR2_PACKAGE_${brname}};
> + say {$fh} qq{\tbool "${fsname}"};
> + foreach my $dep (@{$deps_runtime{$distname}}) {
> + my $brdep = brname( fsname( $dep ) );
> + say {$fh} qq{\tselect BR2_PACKAGE_${brdep}};
> + }
> + say {$fh} qq{\thelp};
> + say {$fh} qq{\t ${abstract}};
Instead of putting the unhelpful NO ABSTRACT text, it's better to make
the help text entry conditional on $dist->{abstract}.
> + say {$fh} qq{};
> + close $fh;
> + }
> + if ($force || !-f $mkname) {
> + my $version = $dist->{version};
> + my $site = dirname( $dist->{download_url} );
> + my($scheme, $auth, $path) = $dist->{download_url} =~ m|(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)|;
> + my($filename, $directories, $suffix) = fileparse( $path, q{tar.gz}, q{tgz} );
> + my $dependencies = join q{ }, map( { q{host-} . fsname( $_ ); } @{$deps_build{$distname}} ),
> + map( { fsname( $_ ); } @{$deps_runtime{$distname}} );
> + my $host_dependencies = join q{ }, map { q{host-} . fsname( $_ ); } @{$deps_build{$distname}},
> + @{$deps_runtime{$distname}};
> + my $license = ref $dist->{license} eq 'ARRAY'
> + ? join q{ }, @{$dist->{license}}
> + : $dist->{license};
> + say qq{write ${mkname}} unless $quiet;
> + open my $fh, q{>}, $mkname;
> + say {$fh} qq{################################################################################};
> + say {$fh} qq{#};
> + say {$fh} qq{# ${fsname}};
> + say {$fh} qq{#};
> + say {$fh} qq{################################################################################};
> + say {$fh} qq{};
> + say {$fh} qq{${brname}_VERSION = ${version}};
> + say {$fh} qq{${brname}_SOURCE = ${distname}-\$(${brname}_VERSION).${suffix}};
> + say {$fh} qq{${brname}_SITE = \$(BR2_CPAN_MIRROR)${directories}};
> + say {$fh} qq{${brname}_DEPENDENCIES = perl ${dependencies}};
> + say {$fh} qq{#HOST_${brname}_DEPENDENCIES = ${host_dependencies}};
> + say {$fh} qq{${brname}_LICENSE = ${license}} if $license && $license ne q{unknown};
> + say {$fh} qq{};
> + say {$fh} qq{\$(eval \$(perl-package))};
> + say {$fh} qq{#\$(eval \$(host-perl-package))};
> + close $fh;
> + }
> +}
> +
> +my %pkg;
> +my $cfgname = q{package/Config.in};
> +if (-f $cfgname) {
> + open my $fh, q{<}, $cfgname;
> + while (<$fh>) {
> + chomp;
> + $pkg{$_} = 1 if m|package/perl-|;
> + }
> + close $fh;
> +}
> +
> +foreach my $distname (sort keys %dist) {
> + my $fsname = fsname( $distname );
> + $pkg{qq{source "package/${fsname}/Config.in"}} = 1;
> +}
> +
> +say qq{${cfgname} must contains the following lines:};
> +say join qq{\n}, sort keys %pkg;
> +
> +__END__
> +
> +=head1 NAME
> +
> +support/scripts/scancpan Try-Tiny Moo
> +
> +=head1 SYNOPSIS
> +
> +supports/scripts/scancpan [options] [distname ...]
> +
> + Options:
> + -help
> + -man
> + -quiet
> + -force
> + -recommend
> +
> +=head1 OPTIONS
> +
> +=over 8
> +
> +=item B<-help>
> +
> +Print a brief help message and exits.
> +
> +=item B<-man>
> +
> +Prints the manual page and exits.
> +
> +=item B<-quiet>
> +
> +Executes without output
> +
> +=item B<-force>
> +
> +Forces the overwritting of existing files.
> +
> +=item B<-recommend>
> +
> +Adds I<recommended> dependencies.
> +
> +=back
> +
> +=head1 DESCRIPTION
> +
> +This script creates the BR package files for all Perl/CPAN
> +distributions required by all distname. These data are fetched from
> +https://metacpan.org/.
> +
> +See the Buildroot documentation for details on the usage of the Perl
> +infrastructure.
> +
> +=head1 LICENSE
> +
> +This script is a part of Buildroot.
Please mention explicitly the license of this script. I guess you want
it to be GPLv2+. In that case, include the entire GPL blurb (see the top
of Makefile).
Regards,
Arnout
> +
> +This script requires the module C<MetaCPAN::API::Tiny> (version 1.131730)
> +which was included at the beginning of this file by the tool C<fatpack>.
> +
> +See L<http://search.cpan.org/~nperez/MetaCPAN-API-Tiny-1.131730/>.
> +
> +See L<http://search.cpan.org/search?query=App-FatPacker&mode=dist>.
> +
> +These both libraries are free software and may be distributed under the same
> +terms as perl itself.
> +
> +And perl may be distributed under the terms of Artistic v1 or GPL v1 license.
> +
> +=cut
>
--
Arnout Vandecappelle arnout at mind be
Senior Embedded Software Architect +32-16-286500
Essensium/Mind http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint: 7CB5 E4CC 6C2E EFD4 6E3D A754 F963 ECAB 2450 2F1F
next prev parent reply other threads:[~2014-02-11 7:13 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-10 12:23 [Buildroot] [pkg-perl infra V6 0/9] a package infrastructure for Perl/CPAN modules Francois Perrad
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 1/9] host-perl: export and rename PERL5LIB Francois Perrad
2014-02-10 19:40 ` Peter Korsgaard
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 2/9] pkg-perl: new infrastructure Francois Perrad
2014-02-11 6:29 ` Arnout Vandecappelle
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 3/9] scancpan: a new script Francois Perrad
2014-02-11 7:13 ` Arnout Vandecappelle [this message]
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 4/9] host-perl-xml-parser: rename and refactor with perl infrastructure Francois Perrad
2014-02-11 6:26 ` Arnout Vandecappelle
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 5/9] host-perl-module-build: new package Francois Perrad
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 6/9] perl: remove useless patch Francois Perrad
2014-02-10 19:40 ` Peter Korsgaard
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 7/9] manual: adding packages perl Francois Perrad
2014-02-11 7:17 ` Arnout Vandecappelle
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 8/9] cpanminus: remove it Francois Perrad
2014-02-10 19:40 ` Peter Korsgaard
2014-02-10 12:23 ` [Buildroot] [pkg-perl infra V6 9/9] perl: remove PERL_INSTALL_TARGET_GOALS Francois Perrad
2014-02-10 20:51 ` Arnout Vandecappelle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52F9CD9D.5020904@mind.be \
--to=arnout@mind.be \
--cc=buildroot@busybox.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.