* [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages
@ 2016-03-13 17:37 Francois Perrad
2016-03-13 17:37 ` [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level Francois Perrad
2016-03-15 22:16 ` [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Peter Korsgaard
0 siblings, 2 replies; 4+ messages in thread
From: Francois Perrad @ 2016-03-13 17:37 UTC (permalink / raw)
To: buildroot
Currently, without the flag -recommend, scancpan takes as dependency
only one which has the relationship "requires"; this mode works fine.
And, with the flag -recommend, scancpan takes all ones (ie. with
relationship "requires" or "recommends") in the same way; this mode
never works fine, because it is too simplistic.
With this commit, the "not required" dependencies are handled as
optional BR package or skipped if a cyclic dependency is detected.
Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
---
support/scripts/scancpan | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/support/scripts/scancpan b/support/scripts/scancpan
index 0436d2a..72cca1a 100755
--- a/support/scripts/scancpan
+++ b/support/scripts/scancpan
@@ -505,6 +505,7 @@ my %need_host; # name -> 1 if host package is needed
my %need_dlopen; # name -> 1 if requires dynamic library
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 %checksum; # author -> list of checksum
my $mcpan = MetaCPAN::API::Tiny->new();
@@ -563,6 +564,7 @@ sub fetch {
$license_files{$name} = find_license_files( $manifest );
my %build = ();
my %runtime = ();
+ my %optional = ();
foreach my $dep (@{$result->{dependency}}) {
my $modname = ${$dep}{module};
next if $modname eq q{perl};
@@ -574,10 +576,14 @@ sub fetch {
# target perl have the same major version
next if ${$dep}{phase} eq q{develop};
next if !$test && ${$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}) {
- $runtime{$distname} = 1;
+ if (${$dep}{relationship} eq q{requires}) {
+ $runtime{$distname} = 1;
+ }
+ else {
+ $optional{$distname} = 1 if $recommend;
+ }
}
else { # configure, build
$build{$distname} = 1;
@@ -585,6 +591,7 @@ sub fetch {
}
$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 );
}
@@ -592,6 +599,9 @@ sub fetch {
fetch( $distname, $need_target, $need_host );
$need_dlopen{$name} ||= $need_dlopen{$distname};
}
+ foreach my $distname (@{$deps_optional{$name}}) {
+ fetch( $distname, $need_target, $need_host );
+ }
}
return;
}
@@ -683,6 +693,15 @@ while (my ($distname, $dist) = each %dist) {
say {$fh} qq{${brname}_LICENSE = ${license}} if $license && $license ne q{unknown};
say {$fh} qq{${brname}_LICENSE_FILES = ${license_files}} if $license_files;
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;
@@ -800,7 +819,7 @@ in order to work with the right CoreList data.
=head1 LICENSE
-Copyright (C) 2013-2014 by Francois Perrad <francois.perrad@gadz.org>
+Copyright (C) 2013-2016 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
--
2.5.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level
2016-03-13 17:37 [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Francois Perrad
@ 2016-03-13 17:37 ` Francois Perrad
2016-03-15 22:16 ` Peter Korsgaard
2016-03-15 22:16 ` [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Peter Korsgaard
1 sibling, 1 reply; 4+ messages in thread
From: Francois Perrad @ 2016-03-13 17:37 UTC (permalink / raw)
To: buildroot
Currently, these flags are recursively propagated. This behavior is
not expected by users, because it can cause dependencies explosively.
Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
---
support/scripts/scancpan | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/support/scripts/scancpan b/support/scripts/scancpan
index 72cca1a..6c70cfb 100755
--- a/support/scripts/scancpan
+++ b/support/scripts/scancpan
@@ -552,10 +552,10 @@ sub find_license_files {
}
sub fetch {
- my ($name, $need_target, $need_host) = @_;
+ my ($name, $need_target, $need_host, $top) = @_;
$need_target{$name} = $need_target if $need_target;
$need_host{$name} = $need_host if $need_host;
- unless ($dist{$name}) {
+ unless ($dist{$name} && !$top) {
say qq{fetch ${name}} unless $quiet;
my $result = $mcpan->release( distribution => $name );
$dist{$name} = $result;
@@ -570,19 +570,19 @@ sub fetch {
next if $modname eq q{perl};
next if $modname =~ m|^Alien|;
next if $modname =~ m|^Win32|;
- next if !$test && $modname =~ m|^Test|;
+ next if !($test && $top) && $modname =~ m|^Test|;
next if Module::CoreList::is_core( $modname, undef, $] );
# 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 !$test && ${$dep}{phase} eq q{test};
+ next if !($test && $top) && ${$dep}{phase} eq q{test};
my $distname = $mcpan->module( $modname )->{distribution};
if (${$dep}{phase} eq q{runtime}) {
if (${$dep}{relationship} eq q{requires}) {
$runtime{$distname} = 1;
}
else {
- $optional{$distname} = 1 if $recommend;
+ $optional{$distname} = 1 if $recommend && $top;
}
}
else { # configure, build
@@ -608,7 +608,7 @@ sub fetch {
foreach my $distname (@ARGV) {
# Command-line's distributions
- fetch( $distname, !!$target, !!$host );
+ fetch( $distname, !!$target, !!$host, 1 );
}
say scalar keys %dist, q{ packages fetched.} unless $quiet;
--
2.5.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages
2016-03-13 17:37 [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Francois Perrad
2016-03-13 17:37 ` [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level Francois Perrad
@ 2016-03-15 22:16 ` Peter Korsgaard
1 sibling, 0 replies; 4+ messages in thread
From: Peter Korsgaard @ 2016-03-15 22:16 UTC (permalink / raw)
To: buildroot
>>>>> "Francois" == Francois Perrad <fperrad@gmail.com> writes:
> Currently, without the flag -recommend, scancpan takes as dependency
> only one which has the relationship "requires"; this mode works fine.
> And, with the flag -recommend, scancpan takes all ones (ie. with
> relationship "requires" or "recommends") in the same way; this mode
> never works fine, because it is too simplistic.
> With this commit, the "not required" dependencies are handled as
> optional BR package or skipped if a cyclic dependency is detected.
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Committed, thanks.
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level
2016-03-13 17:37 ` [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level Francois Perrad
@ 2016-03-15 22:16 ` Peter Korsgaard
0 siblings, 0 replies; 4+ messages in thread
From: Peter Korsgaard @ 2016-03-15 22:16 UTC (permalink / raw)
To: buildroot
>>>>> "Francois" == Francois Perrad <fperrad@gmail.com> writes:
> Currently, these flags are recursively propagated. This behavior is
> not expected by users, because it can cause dependencies explosively.
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Committed, thanks.
--
Bye, Peter Korsgaard
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-03-15 22:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-13 17:37 [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Francois Perrad
2016-03-13 17:37 ` [Buildroot] [V3 2/2] scancpan: use recommend & test flags only at first level Francois Perrad
2016-03-15 22:16 ` Peter Korsgaard
2016-03-15 22:16 ` [Buildroot] [V3 1/2] scancpan: handle recommended dependencies as optional packages Peter Korsgaard
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox