summaryrefslogtreecommitdiff
path: root/lib/SlackBuild/Rc.pm
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2017-11-30 13:18:08 +0100
committerSergey Poznyakoff <gray@gnu.org.ua>2017-11-30 15:31:03 +0100
commit18c46014ea554d19989b6a1b3a773254fefda092 (patch)
treebcff7a8429938a65548a356b34337b39ce0af298 /lib/SlackBuild/Rc.pm
parent2f104feb62d8c9a6c27c0090a310afeefff4af09 (diff)
downloadslackbuilder-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.pm72
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;

Return to:

Send suggestions and report system problems to the System administrator.