[Buildroot] [PATCH 2/2] scancpan: handle recommended dependencies as optional packages

Francois Perrad fperrad at gmail.com
Tue Jan 19 19:10:52 UTC 2016


Signed-off-by: Francois Perrad <francois.perrad at gadz.org>
---
 support/scripts/scancpan | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/support/scripts/scancpan b/support/scripts/scancpan
index e90d495..b5cd362 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 !$want_test && ${$dep}{phase} eq q{test};
-            next if !$want_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 $want_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, 0, 0 );
         }
@@ -592,6 +599,9 @@ sub fetch {
             fetch( $distname, $need_target, $need_host, 0, 0 );
             $need_dlopen{$name} ||= $need_dlopen{$distname};
         }
+        foreach my $distname (@{$deps_optional{$name}}) {
+            fetch( $distname, $need_target, $need_host, 0, 0 );
+        }
     }
     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;
-- 
2.5.0




More information about the buildroot mailing list