package SlackBuild::Rc; use strict; use warnings; use Carp; use SlackBuild::Registry::Record; use SlackBuild::Registry::Pattern; 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; if (ref($pkg) eq 'HASH') { %q = %$pkg; } else { $q{package} = $pkg; } $q{arch} = { -in => [ $self->builder->arch, 'noarch' ] } unless exists $q{arch}; my $pred = new SlackBuild::Registry::Pattern(%q); if (my $rec = $reg->lookup($pred)) { push @packages, $rec->filename; } else { push @unresolved, $pred->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', '(. /etc/os-release; echo SLACKBUILDER: DISTRO $NAME; echo SLACKBUILDER: VERSION $VERSION)', map { "/sbin/upgradepkg --install-new /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"; } if (my $rc = $self->builder->rc) { if (ref($rc) eq 'ARRAY') { push @code, @$rc; } else { push @code, split /\n+/, $rc; } } 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;