diff options
Diffstat (limited to 'usr.sbin/pkg_add/OpenBSD/PkgCreate.pm')
-rw-r--r-- | usr.sbin/pkg_add/OpenBSD/PkgCreate.pm | 114 |
1 files changed, 76 insertions, 38 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm index 27108cad94c..75e5a300067 100644 --- a/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm +++ b/usr.sbin/pkg_add/OpenBSD/PkgCreate.pm @@ -1,6 +1,6 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: PkgCreate.pm,v 1.101 2014/02/02 15:35:52 espie Exp $ +# $OpenBSD: PkgCreate.pm,v 1.102 2014/03/05 22:32:32 espie Exp $ # # Copyright (c) 2003-2014 Marc Espie <espie@openbsd.org> # @@ -790,49 +790,32 @@ sub really_solve_dependency return $v; } -my $cache = {}; -sub solve_from_ports +sub diskcachename { - my ($self, $state, $dep, $package) = @_; + my ($self, $dep) = @_; - my $portsdir = $state->defines('PORTSDIR'); - return undef unless defined $portsdir; - my $pkgname; - if (defined $cache->{$dep->{pkgpath}}) { - $pkgname = $cache->{$dep->{pkgpath}}; + if ($ENV{_DEPENDS_CACHE}) { + my $diskcache = $dep->{pkgpath}; + $diskcache =~ s/\//--/g; + return $ENV{_DEPENDS_CACHE}."/pkgcreate-".$diskcache; } else { - my ($plist, $diskcache); - if ($ENV{_DEPENDS_CACHE}) { - $diskcache = $dep->{pkgpath}; - $diskcache =~ s/\//--/g; - $diskcache = $ENV{_DEPENDS_CACHE}."/pkgcreate-". - $diskcache; - } - if (defined $diskcache && -f $diskcache) { - $plist = OpenBSD::PackingList->fromfile($diskcache); - } else { - $plist = $self->ask_tree($state, $dep, $portsdir, - 'print-plist-libs-with-depends', - 'wantlib_args=no-wantlib-args'); - if ($? != 0 || !defined $plist->pkgname) { - $state->error("Can't obtain dependency #1 from ports tree", - $dep->{pattern}); - return undef; - } - $plist->tofile($diskcache) if defined $diskcache; - } - OpenBSD::SharedLibs::add_libs_from_plist($plist, $state); - $self->add_dep($plist); - $pkgname = $plist->pkgname; - $cache->{$dep->{pkgpath}} = $pkgname; - } - if ($dep->spec->filter($pkgname) == 0) { - $state->error("Dependency #1 doesn't match FULLPKGNAME: #2", - $dep->{pattern}, $pkgname); return undef; } +} - return $pkgname; +sub to_cache +{ + my ($self, $plist, $final) = @_; + # try to cache atomically. + # no error if it doesn't work + require OpenBSD::MkTemp; + my ($fh, $tmp) = OpenBSD::MkTemp::mkstemp( + "$ENV{_DEPENDS_CACHE}/my.XXXXXXXXXXX") or return; + chmod 0644, $fh; + $plist->write($fh); + close($fh); + rename($tmp, $final); + unlink($tmp); } sub ask_tree @@ -860,6 +843,61 @@ sub ask_tree return $plist; } +sub really_solve_from_ports +{ + my ($self, $state, $dep, $portsdir) = @_; + + my $diskcache = $self->diskcachename($dep); + my $plist; + + if (defined $diskcache && -f $diskcache) { + $plist = OpenBSD::PackingList->fromfile($diskcache); + } else { + $plist = $self->ask_tree($state, $dep, $portsdir, + 'print-plist-libs-with-depends', + 'wantlib_args=no-wantlib-args'); + if ($? != 0 || !defined $plist->pkgname) { + return undef; + } + if (defined $diskcache) { + $self->to_cache($plist, $diskcache); + } + } + OpenBSD::SharedLibs::add_libs_from_plist($plist, $state); + $self->add_dep($plist); + return $plist->pkgname; +} + +my $cache = {}; + +sub solve_from_ports +{ + my ($self, $state, $dep, $package) = @_; + + my $portsdir = $state->defines('PORTSDIR'); + return undef unless defined $portsdir; + my $pkgname; + if (defined $cache->{$dep->{pkgpath}}) { + $pkgname = $cache->{$dep->{pkgpath}}; + } else { + $pkgname = $self->really_solve_from_ports($state, $dep, + $portsdir); + $cache->{$dep->{pkgpath}} = $pkgname; + } + if (!defined $pkgname) { + $state->error("Can't obtain dependency #1 from ports tree", + $dep->{pattern}); + return undef; + } + if ($dep->spec->filter($pkgname) == 0) { + $state->error("Dependency #1 doesn't match FULLPKGNAME: #2", + $dep->{pattern}, $pkgname); + return undef; + } + + return $pkgname; +} + # we don't want old libs sub find_old_lib { |