diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-11-30 13:18:08 +0100 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-11-30 15:31:03 +0100 |
commit | 18c46014ea554d19989b6a1b3a773254fefda092 (patch) | |
tree | bcff7a8429938a65548a356b34337b39ce0af298 /lib/SlackBuild/Rc.pm | |
parent | 2f104feb62d8c9a6c27c0090a310afeefff4af09 (diff) | |
download | slackbuilder-18c46014ea554d19989b6a1b3a773254fefda092.tar.gz slackbuilder-18c46014ea554d19989b6a1b3a773254fefda092.tar.bz2 |
Install prerequisite packages and set up environment prior to running package.SlackBuild script
* lib/SlackBuild/Rc.pm: New file.
* lib/SlackBuild/Registry/Backend/FS.pm (lookup): Store relative file name.
* lib/SlackBuild/Registry/Record.pm (as_string): Use * in place of missing
version and architecture.
* lib/SlackBuilder.pm (new): Save arch name.
(arch): New method.
(request_environ,environ): New methods.
(_prepare): New method. Creates intermediate rc script for installing the
prerequisite packages.
(_build): Run _prepare.
Diffstat (limited to 'lib/SlackBuild/Rc.pm')
-rw-r--r-- | lib/SlackBuild/Rc.pm | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/SlackBuild/Rc.pm b/lib/SlackBuild/Rc.pm new file mode 100644 index 0000000..350c1d1 --- /dev/null +++ b/lib/SlackBuild/Rc.pm @@ -0,0 +1,72 @@ +package SlackBuild::Rc; +use strict; +use warnings; +use Carp; +use SlackBuild::Registry::Record; + +sub new { + my ($class, $builder) = @_; + return bless { _builder => $builder }, $class; +} + +sub builder { shift->{_builder} } + +sub resolve { + my ($self, $reg) = @_; + my @packages; + my @unresolved; + foreach my $pkg (@{$self->builder->prereq}) { + my %q; + my $name; + if (ref($pkg) eq 'HASH') { + %q = %$pkg; + $name = delete $q{package}; + } else { + $name = $pkg; + } + $q{arch} = $self->builder->arch unless exists $q{arch}; + if (my $rec = $reg->lookup($name, %q)) { + push @packages, $rec->filename; + } else { + push @unresolved, + SlackBuild::Registry::Record->new($name, %q)->as_string; + } + } + return (\@packages, \@unresolved); +} + +sub code { + my ($self, $reg) = @_; + my ($pkglist, $unresolved) = $self->resolve($reg); + if (@$unresolved) { + $self->builder->error("$_: package not resolved") for (@$unresolved); + return; + } + my @code = ('#! /bin/sh', 'set -e', + map { "/sbin/installpkg /var/pkg/$_" } @$pkglist); + + my $env = $self->builder->environ; + while (my ($k,$v) = each %$env) { + next unless defined($v); + $v =~ s/[`"]/\\"/g; + push @code, "$k=\"$v\"", "export $k"; + } + + push @code, 'exec /bin/sh $@'; + return \@code; +} + +sub write { + my ($self, $reg, $file) = @_; + my $code = $self->code($reg) or return; + open(my $fd, '>', $file) + or croak "can't open \"$file\" for writing: $!"; + print $fd join("\n", @$code)."\n"; + unless (chmod(0755, $fd)) { + croak "can't chmod \"$file\": $!"; + } + close $fd; + return 1; +} + +1; |