Bump buildroot to 2019.02
This commit is contained in:
@@ -483,10 +483,13 @@ use Module::CoreList;
|
||||
use HTTP::Tiny;
|
||||
use Safe;
|
||||
use MetaCPAN::API::Tiny;
|
||||
use Digest::SHA qw(sha256_hex);
|
||||
use Text::Wrap;
|
||||
$Text::Wrap::columns = 62;
|
||||
|
||||
# Below, 5.026 should be aligned with the version of perl actually
|
||||
# Below, 5.028 should be aligned with the version of perl actually
|
||||
# bundled in Buildroot:
|
||||
die <<"MSG" if $] < 5.026;
|
||||
die <<"MSG" if $] < 5.028;
|
||||
This script needs a host perl with the same major version as Buildroot target perl.
|
||||
|
||||
Your current host perl is:
|
||||
@@ -494,7 +497,7 @@ Your current host perl is:
|
||||
version $]
|
||||
|
||||
You may install a local one by running:
|
||||
perlbrew install perl-5.26.0
|
||||
perlbrew install perl-5.28.0
|
||||
MSG
|
||||
|
||||
my ($help, $man, $quiet, $force, $recommend, $test, $host);
|
||||
@@ -516,14 +519,25 @@ my %dist; # name -> metacpan data
|
||||
my %need_target; # name -> 1 if target package is needed
|
||||
my %need_host; # name -> 1 if host package is needed
|
||||
my %need_dlopen; # name -> 1 if requires dynamic library
|
||||
my %is_xs; # name -> 1 if XS module
|
||||
my %deps_build; # name -> list of host dependencies
|
||||
my %deps_runtime; # name -> list of target dependencies
|
||||
my %deps_optional; # name -> list of optional target dependencies
|
||||
my %license_files; # name -> list of license files
|
||||
my %license_files; # name -> hash of license files
|
||||
my %checksum; # author -> list of checksum
|
||||
my $mirror = 'http://cpan.metacpan.org'; # a CPAN mirror
|
||||
my $mcpan = MetaCPAN::API::Tiny->new(base_url => 'http://fastapi.metacpan.org/v1');
|
||||
my $ua = HTTP::Tiny->new();
|
||||
my $new_pkgs;
|
||||
|
||||
my %white_list = (
|
||||
'ExtUtils-Config' => 1,
|
||||
'ExtUtils-InstallPaths' => 1,
|
||||
'ExtUtils-Helpers' => 1,
|
||||
'File-ShareDir-Install' => 1,
|
||||
'Module-Build' => 1,
|
||||
'Module-Build-Tiny' => 1,
|
||||
);
|
||||
my @info = ();
|
||||
|
||||
sub get_checksum {
|
||||
my ($url) = @_;
|
||||
@@ -556,7 +570,36 @@ sub find_license_files {
|
||||
if (scalar @license_files == 0 && $manifest =~ m/(README)[\n\s]/i) {
|
||||
@license_files = ($1);
|
||||
}
|
||||
return \@license_files;
|
||||
if (scalar @license_files == 0 && $manifest =~ m/(README\.md)[\n\s]/i) {
|
||||
@license_files = ($1);
|
||||
}
|
||||
return @license_files;
|
||||
}
|
||||
|
||||
sub want_test {
|
||||
my ($distname) = @_;
|
||||
return 1 if $need_dlopen{$distname} && scalar @{$deps_runtime{$distname}} > 0;
|
||||
}
|
||||
|
||||
sub get_dependencies {
|
||||
my ($distname) = @_;
|
||||
my %dep = map { $_ => 1 } @{$deps_runtime{$distname}};
|
||||
for my $direct (@{$deps_runtime{$distname}}) {
|
||||
for (get_dependencies( $direct )) {
|
||||
$dep{$_} = 1;
|
||||
}
|
||||
}
|
||||
return keys %dep;
|
||||
}
|
||||
|
||||
sub get_indirect_dependencies {
|
||||
my ($distname) = @_;
|
||||
my %indirect;
|
||||
my %direct = map { $_ => 1 } @{$deps_runtime{$distname}};
|
||||
for my $dep (get_dependencies( $distname )) {
|
||||
$indirect{$dep} = 1 unless exists $direct{$dep};
|
||||
}
|
||||
return keys %indirect;
|
||||
}
|
||||
|
||||
sub fetch {
|
||||
@@ -567,16 +610,19 @@ sub fetch {
|
||||
say qq{fetch ${name}} unless $quiet;
|
||||
my $result = $mcpan->release( distribution => $name );
|
||||
$dist{$name} = $result;
|
||||
$license_files{$name} = {};
|
||||
eval {
|
||||
my $manifest = $mcpan->source( author => $result->{author},
|
||||
release => $name . q{-} . $result->{version},
|
||||
path => 'MANIFEST' );
|
||||
$need_dlopen{$name} = is_xs( $manifest );
|
||||
$license_files{$name} = find_license_files( $manifest );
|
||||
my $author = $result->{author};
|
||||
my $release = $name . q{-} . $result->{version};
|
||||
my $manifest = $mcpan->source( author => $author, release => $release, path => 'MANIFEST' );
|
||||
$need_dlopen{$name} = $is_xs{$name} = is_xs( $manifest );
|
||||
foreach my $fname (find_license_files( $manifest )) {
|
||||
my $license = $mcpan->source( author => $author, release => $release, path => $fname );
|
||||
$license_files{$name}->{$fname} = sha256_hex( $license );
|
||||
}
|
||||
};
|
||||
if ($@) {
|
||||
warn $@;
|
||||
$license_files{$name} = [];
|
||||
}
|
||||
my %build = ();
|
||||
my %runtime = ();
|
||||
@@ -591,6 +637,7 @@ sub fetch {
|
||||
# we could use the host Module::CoreList data, because host perl and
|
||||
# target perl have the same major version
|
||||
next if ${$dep}{phase} eq q{develop};
|
||||
next if ${$dep}{phase} eq q{x_Dist_Zilla};
|
||||
next if !($test && $top) && ${$dep}{phase} eq q{test};
|
||||
my $distname = $mcpan->module( $modname )->{distribution};
|
||||
if (${$dep}{phase} eq q{runtime}) {
|
||||
@@ -603,11 +650,12 @@ sub fetch {
|
||||
}
|
||||
else { # configure, build
|
||||
$build{$distname} = 1;
|
||||
push @info, qq{[$name] suspicious dependency on $distname}
|
||||
unless exists $white_list{$distname};
|
||||
}
|
||||
}
|
||||
$deps_build{$name} = [keys %build];
|
||||
$deps_runtime{$name} = [keys %runtime];
|
||||
$deps_optional{$name} = [keys %optional];
|
||||
foreach my $distname (@{$deps_build{$name}}) {
|
||||
fetch( $distname, 0, 1 );
|
||||
}
|
||||
@@ -615,7 +663,7 @@ sub fetch {
|
||||
fetch( $distname, $need_target, $need_host );
|
||||
$need_dlopen{$name} ||= $need_dlopen{$distname};
|
||||
}
|
||||
foreach my $distname (@{$deps_optional{$name}}) {
|
||||
foreach my $distname (keys %optional) {
|
||||
fetch( $distname, $need_target, $need_host );
|
||||
}
|
||||
}
|
||||
@@ -642,6 +690,24 @@ sub brname {
|
||||
return uc $name;
|
||||
}
|
||||
|
||||
# Buildroot requires license name as in http://spdx.org/licenses/
|
||||
sub brlicense {
|
||||
my $license = shift;
|
||||
$license =~ s|apache_1_1|Apache-1.1|;
|
||||
$license =~ s|apache_2_0|Apache-2.0|;
|
||||
$license =~ s|artistic_2|Artistic-2.0|;
|
||||
$license =~ s|artistic|Artistic-1.0|;
|
||||
$license =~ s|lgpl_2_1|LGPL-2.1|;
|
||||
$license =~ s|lgpl_3_0|LGPL-3.0|;
|
||||
$license =~ s|gpl_2|GPL-2.0|;
|
||||
$license =~ s|gpl_3|GPL-3.0|;
|
||||
$license =~ s|mit|MIT|;
|
||||
$license =~ s|mozilla_1_1|Mozilla-1.1|;
|
||||
$license =~ s|openssl|OpenSSL|;
|
||||
$license =~ s|perl_5|Artistic or GPL-1.0+|;
|
||||
return $license;
|
||||
}
|
||||
|
||||
while (my ($distname, $dist) = each %dist) {
|
||||
my $fsname = fsname( $distname );
|
||||
my $dirname = q{package/} . $fsname;
|
||||
@@ -649,9 +715,15 @@ while (my ($distname, $dist) = each %dist) {
|
||||
my $mkname = $dirname . q{/} . $fsname . q{.mk};
|
||||
my $hashname = $dirname . q{/} . $fsname . q{.hash};
|
||||
my $brname = brname( $fsname );
|
||||
mkdir $dirname unless -d $dirname;
|
||||
my $testname = q{support/testing/tests/package/test_} . lc $brname . q{.py};
|
||||
unless (-d $dirname) {
|
||||
mkdir $dirname;
|
||||
$new_pkgs = 1;
|
||||
}
|
||||
if ($need_target{$distname} && ($force || !-f $cfgname)) {
|
||||
my $abstract = $dist->{abstract};
|
||||
$dist->{abstract} =~ s|\s+$||;
|
||||
$dist->{abstract} .= q{.} unless $dist->{abstract} =~ m|\.$|;
|
||||
my $abstract = wrap( q{}, qq{\t }, $dist->{abstract} );
|
||||
my $homepage = $dist->{resources}->{homepage} || qq{https://metacpan.org/release/${distname}};
|
||||
say qq{write ${cfgname}} unless $quiet;
|
||||
open my $fh, q{>}, $cfgname;
|
||||
@@ -660,7 +732,7 @@ while (my ($distname, $dist) = each %dist) {
|
||||
say {$fh} qq{\tdepends on !BR2_STATIC_LIBS} if $need_dlopen{$distname};
|
||||
foreach my $dep (sort @{$deps_runtime{$distname}}) {
|
||||
my $brdep = brname( fsname( $dep ) );
|
||||
say {$fh} qq{\tselect BR2_PACKAGE_${brdep}};
|
||||
say {$fh} qq{\tselect BR2_PACKAGE_${brdep} # runtime};
|
||||
}
|
||||
say {$fh} qq{\thelp};
|
||||
say {$fh} qq{\t ${abstract}\n} if $abstract;
|
||||
@@ -679,20 +751,21 @@ while (my ($distname, $dist) = each %dist) {
|
||||
# the auth part is not used, because we use $(BR2_CPAN_MIRROR)
|
||||
my ($filename, $directories, $suffix) = fileparse( $path, q{tar.gz}, q{tgz} );
|
||||
$directories =~ s|/$||;
|
||||
my $dependencies = join q{ }, map( { q{host-} . fsname( $_ ); } sort @{$deps_build{$distname}} ),
|
||||
map( { fsname( $_ ); } sort @{$deps_runtime{$distname}} );
|
||||
my $host_dependencies = join q{ }, map { q{host-} . fsname( $_ ); } sort( @{$deps_build{$distname}},
|
||||
@{$deps_runtime{$distname}} );
|
||||
my $license = ref $dist->{license} eq 'ARRAY'
|
||||
? join q{ or }, @{$dist->{license}}
|
||||
: $dist->{license};
|
||||
# BR requires license name as in http://spdx.org/licenses/
|
||||
$license =~ s|apache_2_0|Apache-2.0|;
|
||||
$license =~ s|artistic_2|Artistic-2.0|;
|
||||
$license =~ s|mit|MIT|;
|
||||
$license =~ s|openssl|OpenSSL|;
|
||||
$license =~ s|perl_5|Artistic or GPL-1.0+|;
|
||||
my $license_files = join q{ }, @{$license_files{$distname}};
|
||||
my @dependencies = map( { q{host-} . fsname( $_ ); } sort @{$deps_build{$distname}} );
|
||||
my $dependencies = join qq{ \\\n\t}, @dependencies;
|
||||
$dependencies = qq{\\\n\t} . $dependencies if scalar @dependencies > 1;
|
||||
my @host_dependencies = map { q{host-} . fsname( $_ ); } sort( @{$deps_build{$distname}},
|
||||
@{$deps_runtime{$distname}} );
|
||||
my $host_dependencies = join qq{ \\\n\t}, @host_dependencies;
|
||||
$host_dependencies = qq{\\\n\t} . $host_dependencies if scalar @host_dependencies > 1;
|
||||
my $license = brlicense( ref $dist->{license} eq 'ARRAY'
|
||||
? join q{ or }, @{$dist->{license}}
|
||||
: $dist->{license} );
|
||||
my $license_files = join q{ }, sort keys %{$license_files{$distname}};
|
||||
if ($license_files && (!$license || $license eq q{unknown})) {
|
||||
push @info, qq{[$distname] undefined LICENSE, see $license_files};
|
||||
$license = q{???};
|
||||
}
|
||||
say qq{write ${mkname}} unless $quiet;
|
||||
open my $fh, q{>}, $mkname;
|
||||
say {$fh} qq{################################################################################};
|
||||
@@ -706,18 +779,10 @@ while (my ($distname, $dist) = each %dist) {
|
||||
say {$fh} qq{${brname}_SITE = \$(BR2_CPAN_MIRROR)${directories}};
|
||||
say {$fh} qq{${brname}_DEPENDENCIES = ${dependencies}} if $need_target{$distname} && $dependencies;
|
||||
say {$fh} qq{HOST_${brname}_DEPENDENCIES = ${host_dependencies}} if $need_host{$distname} && $host_dependencies;
|
||||
say {$fh} qq{${brname}_LICENSE = ${license}} if $license && $license ne q{unknown};
|
||||
say {$fh} qq{${brname}_LICENSE = ${license}} if $license;
|
||||
say {$fh} qq{${brname}_LICENSE_FILES = ${license_files}} if $license_files;
|
||||
say {$fh} qq{${brname}_DISTNAME = ${distname}};
|
||||
say {$fh} qq{};
|
||||
foreach (sort @{$deps_optional{$distname}}) {
|
||||
next if grep { $_ eq $distname; } @{$deps_runtime{$_}}; # avoid cyclic dependencies
|
||||
my $opt_brname = brname( $_ );
|
||||
my $opt_fsname = fsname( $_ );
|
||||
say {$fh} qq{ifeq (\$(BR2_PACKAGE_PERL_${opt_brname}),y)};
|
||||
say {$fh} qq{${brname}_DEPENDENCIES += ${opt_fsname}};
|
||||
say {$fh} qq{endif};
|
||||
say {$fh} qq{};
|
||||
}
|
||||
say {$fh} qq{\$(eval \$(perl-package))} if $need_target{$distname};
|
||||
say {$fh} qq{\$(eval \$(host-perl-package))} if $need_host{$distname};
|
||||
close $fh;
|
||||
@@ -731,28 +796,82 @@ while (my ($distname, $dist) = each %dist) {
|
||||
say {$fh} qq{# retrieved by scancpan from ${mirror}/};
|
||||
say {$fh} qq{md5 ${md5} ${filename}};
|
||||
say {$fh} qq{sha256 ${sha256} ${filename}};
|
||||
my %license_files = %{$license_files{$distname}};
|
||||
if (scalar keys %license_files) {
|
||||
say {$fh} q{};
|
||||
say {$fh} qq{# computed by scancpan};
|
||||
foreach my $license (sort keys %license_files) {
|
||||
my $digest = $license_files{$license};
|
||||
say {$fh} qq{sha256 ${digest} ${license}};
|
||||
}
|
||||
}
|
||||
close $fh;
|
||||
}
|
||||
if (want_test( $distname ) && ($force || !-f $testname)) {
|
||||
my $classname = $distname;
|
||||
$classname =~ s|-||g;
|
||||
my $modname = $distname;
|
||||
$modname =~ s|-|::|g;
|
||||
my $mark = $is_xs{$distname} ? q{ XS} : q{};
|
||||
my @indirect = (get_indirect_dependencies( $distname ));
|
||||
say qq{write ${testname}} unless $quiet;
|
||||
open my $fh, q{>}, $testname;
|
||||
say {$fh} qq{from tests.package.test_perl import TestPerlBase};
|
||||
say {$fh} qq{};
|
||||
say {$fh} qq{};
|
||||
say {$fh} qq{class TestPerl${classname}(TestPerlBase):};
|
||||
say {$fh} qq{ """};
|
||||
say {$fh} qq{ package:};
|
||||
say {$fh} qq{ ${distname}${mark}};
|
||||
say {$fh} qq{ direct dependencies:};
|
||||
foreach my $dep (sort @{$deps_runtime{$distname}}) {
|
||||
$mark = $is_xs{$dep} ? q{ XS} : q{};
|
||||
say {$fh} qq{ ${dep}${mark}};
|
||||
}
|
||||
if (scalar @indirect > 0) {
|
||||
say {$fh} qq{ indirect dependencies:};
|
||||
foreach my $dep (sort @indirect) {
|
||||
$mark = $is_xs{$dep} ? q{ XS} : q{};
|
||||
say {$fh} qq{ ${dep}${mark}};
|
||||
}
|
||||
}
|
||||
say {$fh} qq{ """};
|
||||
say {$fh} qq{};
|
||||
say {$fh} qq{ config = TestPerlBase.config + \\};
|
||||
say {$fh} qq{ """};
|
||||
say {$fh} qq{ BR2_PACKAGE_PERL=y};
|
||||
say {$fh} qq{ BR2_PACKAGE_${brname}=y};
|
||||
say {$fh} qq{ """};
|
||||
say {$fh} qq{};
|
||||
say {$fh} qq{ def test_run(self):};
|
||||
say {$fh} qq{ self.login()};
|
||||
say {$fh} qq{ self.module_test("${modname}")};
|
||||
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-|;
|
||||
if ($new_pkgs) {
|
||||
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;
|
||||
}
|
||||
close $fh;
|
||||
|
||||
foreach my $distname (keys %need_target) {
|
||||
my $fsname = fsname( $distname );
|
||||
$pkg{qq{\tsource "package/${fsname}/Config.in"}} = 1;
|
||||
}
|
||||
|
||||
say qq{${cfgname} must contain the following lines:};
|
||||
say join qq{\n}, sort keys %pkg;
|
||||
}
|
||||
|
||||
foreach my $distname (keys %need_target) {
|
||||
my $fsname = fsname( $distname );
|
||||
$pkg{qq{\tsource "package/${fsname}/Config.in"}} = 1;
|
||||
}
|
||||
|
||||
say qq{${cfgname} must contain the following lines:};
|
||||
say join qq{\n}, sort keys %pkg;
|
||||
say join qq{\n}, @info;
|
||||
|
||||
__END__
|
||||
|
||||
@@ -762,7 +881,7 @@ utils/scancpan Try-Tiny Moo
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
supports/scripts/scancpan [options] [distname ...]
|
||||
utils/scancpan [options] [distname ...]
|
||||
|
||||
Options:
|
||||
-help
|
||||
@@ -819,7 +938,6 @@ Perl/CPAN distributions required by the specified distnames. The
|
||||
dependencies and metadata are fetched from https://metacpan.org/.
|
||||
|
||||
After running this script, it is necessary to check the generated files.
|
||||
You have to manually add the license files (PERL_FOO_LICENSE_FILES variable).
|
||||
For distributions that link against a target library, you have to add the
|
||||
buildroot package name for that library to the DEPENDENCIES variable.
|
||||
|
||||
@@ -831,7 +949,7 @@ in order to work with the right CoreList data.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2013-2017 by Francois Perrad <francois.perrad@gadz.org>
|
||||
Copyright (C) 2013-2018 by Francois Perrad <francois.perrad@gadz.org>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -852,9 +970,9 @@ This script is a part of Buildroot.
|
||||
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<https://metacpan.org/release/NPEREZ/MetaCPAN-API-Tiny-1.131730>.
|
||||
|
||||
See L<http://search.cpan.org/search?query=App-FatPacker&mode=dist>.
|
||||
See L<https://metacpan.org/release/App-FatPacker>.
|
||||
|
||||
These both libraries are free software and may be distributed under the same
|
||||
terms as perl itself.
|
||||
|
||||
Reference in New Issue
Block a user