version 1.1, 2005/12/21 18:04:06 |
version 1.13, 2008/09/30 21:54:01 |
|
|
#!/usr/bin/perl |
#!/bin/sh |
# $RedRiver$ |
# $RedRiver$ |
use strict; |
|
use warnings; |
|
|
|
# find www/ -name *.so* | xargs find_depends | sort -u | xargs -I {} cp {} /home/andrew/www{} |
find_depends() { |
|
local _file="$1" |
|
local _line |
|
|
|
test -z "$_file" && continue |
|
|
#use OpenBSD::PackageInfo; |
/usr/bin/ldd "$_file" | awk '$7 ~ /^\// { print $7 }' | { |
#use OpenBSD::PackingList; |
while read _line; do |
#use OpenBSD::SharedLibs; |
test -z "$_line" && continue |
#use Data::Dumper; |
echo $_line |
|
|
#my $dir = '/var/db/pkg'; |
test X"$_file" == X"$_line" && continue |
#my $pkg = 'p5-DBD-mysql-3.0002'; |
find_depends "$_line" |
#my $pkg = 'p5-DBD-mysql'; |
done |
|
|
|
|
|
|
#my $file = shift || '/usr/local/libdata/perl5/site_perl/i386-openbsd/auto/DBD/mysql/mysql.so'; |
|
|
|
|
|
die unless @ARGV; |
|
|
|
my %libs; |
|
foreach my $file (@ARGV) { |
|
my $libs = find_libs($file); |
|
#print Dumper $libs; |
|
foreach (keys %{ $libs }) { |
|
$libs{ $_ } = $libs->{$_}; |
|
} |
|
} |
|
|
|
foreach (keys %libs) { |
|
print $libs{$_}, "\n"; |
|
} |
|
|
|
exit; |
|
|
|
#OpenBSD::SharedLibs::add_system_libs('/'); |
|
|
|
#print installed_packages(); |
|
#print installed_name($pkg); |
|
#print info_names(); |
|
#exit; |
|
|
|
#my $plist = OpenBSD::PackingList->from_installation($pkg) || die $!; |
|
|
|
#print Dumper $plist->{wantlib}; |
|
|
|
#print Dumper $OpenBSD::SharedLibs::registered_libs; |
|
|
|
#foreach (@{ $plist->{wantlib} }) { |
|
# print Dumper $_->{name}, find_library($_->{name}); |
|
#} |
|
|
|
#sub find_library |
|
#{ |
|
# my $spec = shift; |
|
# my @r; |
|
# OpenBSD::SharedLibs::add_system_libs('/'); |
|
# |
|
# my $lib = '/usr'; |
|
# @r = OpenBSD::SharedLibs::lookup_libspec('/usr', $spec); |
|
# unless (@r) { |
|
# $lib = '/usr/X11R6'; |
|
# @r = OpenBSD::SharedLibs::lookup_libspec('/usr/X11R6', $spec); |
|
# } |
|
# unless (@r) { |
|
# for my $pkg (installed_packages()) { |
|
# OpenBSD::SharedLibs::add_package_libs($pkg, 1); |
|
# } |
|
# $lib = '/usr/local'; |
|
# @r = OpenBSD::SharedLibs::lookup_libspec('/usr/local', $spec); |
|
# } |
|
# return $lib, @r; |
|
#} |
|
|
|
sub find_libs |
|
{ |
|
my $file = shift; |
|
my $ld = shift || get_ldconfig(); |
|
my $locs = shift || {}; |
|
|
|
print STDERR "Finding libs for '$file'\n"; |
|
|
|
my @libs = search_file($file); |
|
foreach (@libs) { |
|
my ($name, $maj, $min) = $_ =~ /^([^\.]+)\.so\.(\d+)\.(\d+)$/; |
|
my $spec = 'l' . $name . '.' . $maj . '.' . $min; |
|
|
|
if (exists $ld->{$spec}) { |
|
next if exists $locs->{$spec}; |
|
|
|
$locs->{$spec} = $ld->{$spec}; |
|
|
|
$locs = find_libs($locs->{$spec}, $ld, $locs); |
|
|
|
} else { |
|
warn "Couldn't find location for lib '$_'"; |
|
} |
} |
} |
|
|
|
return $locs; |
|
} |
} |
|
|
sub search_file |
|
{ |
{ |
my $file = shift; |
for f in "$@"; do |
my @libs; |
find_depends "$f" |
|
done |
|
} | sort -u |
|
|
open my $libs, '<', $file or die; |
|
local $/ = chr(0); |
|
while (<$libs>) { |
|
if (m|^(/[^\w\/]+/)?lib(\S+)\.(\d+)\.(\d+)|) { |
|
my ($path, $name, $major, $minor) = ($1, $2, $3, $4); |
|
my $spec="$name.$major.$minor"; |
|
if (defined $path && $path ne '/usr/local/lib') { |
|
$spec="$path/$spec"; |
|
} |
|
push @libs, $spec; |
|
} |
|
} |
|
close $libs; |
|
|
|
return @libs; |
|
} |
|
|
|
sub get_ldconfig |
|
{ |
|
my $ldconfig = '/sbin/ldconfig'; |
|
my (%paths, %libs); |
|
|
|
open my $ld, '-|', $ldconfig, '-r' or die; |
|
while (<$ld>) { |
|
chomp; |
|
if (/search directories:\s+(.*)/) { |
|
#search directories: /usr/lib:/usr/local/lib |
|
my @p = split /:/, $1; |
|
@paths{@p} = 1; |
|
} elsif (/\d+:-(\S+)\s+=>\s+(\S+)/) { |
|
#0:-ldes.9.0 => /usr/lib/libdes.so.9.0 |
|
my $lib = $1; |
|
my $loc = $2; |
|
#my ($name, $maj, $min) = $lib =~ /l([^\.]+)\.(\d+)\.(\d+)/; |
|
#my $spec = 'lib' . $name . '.so.' . $maj . '.' . $min; |
|
$libs{$lib} = $loc; |
|
} else { |
|
#print $_, "\n"; |
|
} |
|
} |
|
close $ld; |
|
|
|
$libs{_paths} = [ keys %paths ]; |
|
return \%libs; |
|
} |
|