diff options
-rw-r--r-- | lib/SlackBuild/Rc.pm | 2 | ||||
-rw-r--r-- | lib/SlackBuild/Request.pm | 3 | ||||
-rw-r--r-- | lib/SlackBuilder.pm | 40 |
3 files changed, 44 insertions, 1 deletions
diff --git a/lib/SlackBuild/Rc.pm b/lib/SlackBuild/Rc.pm index c4e5a5f..868e4f5 100644 --- a/lib/SlackBuild/Rc.pm +++ b/lib/SlackBuild/Rc.pm @@ -37,3 +37,3 @@ sub resolve { my @unresolved; - foreach my $pkg (@{$self->builder->prereq}) { + foreach my $pkg (@{$self->builder->prereq_full}) { my %q; diff --git a/lib/SlackBuild/Request.pm b/lib/SlackBuild/Request.pm index 8fa831b..581d739 100644 --- a/lib/SlackBuild/Request.pm +++ b/lib/SlackBuild/Request.pm @@ -145,2 +145,5 @@ my %attributes = ( }, + build_prereq => { + type => 'ARRAY', + }, rc => { diff --git a/lib/SlackBuilder.pm b/lib/SlackBuilder.pm index 3e8b2be..31b9571 100644 --- a/lib/SlackBuilder.pm +++ b/lib/SlackBuilder.pm @@ -168,2 +168,42 @@ sub registry { shift->{_registry} } +sub prereq_full { + my $self = shift; + + my %h; + # Build initial prerequisite hash. + foreach my $r (@{$self->request->prereq || []}) { + if (ref($r) eq 'HASH') { + $h{$r->{package}} = $r; + } else { + $h{$r} = $r; + } + } + + # Apply build prerequisites, if any. + # FIXME: Take into account $br->{arch} as well. + # FIXME: Shouldn't the loop below be part of 'merge' policy in Request.pm? + foreach my $br (@{$self->request->build_prereq || []}) { + if (ref($br) eq 'HASH') { + if (exists($h{$br->{package}})) { + if ($br->{version}) { + my $r = $h{$br->{package}}; + if (ref($r) eq 'HASH') { + if (SlackBuild::Registry::Version->new($r->{version}) < SlackBuild::Registry::Version->new($br->{version})) { + $h{$br->{package}}{version} = $br->{version} + } + } else { + $h{$br->{package}}{version} = { package => $br->{package}, + version => $br->{version} } + } + } + } else { + $h{$br->{package}} = $br; + } + } else { + $h{$br} = $br; + } + } + return [ map { $h{$_} } sort keys %h ] +} + sub environ { |