=================================================================== RCS file: /cvs/openbsd/fill_chroot/find_depends,v retrieving revision 1.1 retrieving revision 1.14 diff -u -r1.1 -r1.14 --- openbsd/fill_chroot/find_depends 2005/12/21 18:04:06 1.1 +++ openbsd/fill_chroot/find_depends 2011/08/09 01:13:54 1.14 @@ -1,156 +1,26 @@ -#!/usr/bin/perl -# $RedRiver$ -use strict; -use warnings; +#!/bin/sh +# $AFresh1$ -# 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; -#use OpenBSD::PackingList; -#use OpenBSD::SharedLibs; -#use Data::Dumper; + /usr/bin/ldd "$_file" | awk '$7 ~ /^\// { print $7 }' | { + while read _line; do + test -z "$_line" && continue + echo $_line -#my $dir = '/var/db/pkg'; -#my $pkg = 'p5-DBD-mysql-3.0002'; -#my $pkg = 'p5-DBD-mysql'; - - - -#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 '$_'"; + test X"$_file" == X"$_line" && continue + find_depends "$_line" + done } - } - - return $locs; } -sub search_file { - my $file = shift; - my @libs; + for f in "$@"; do + 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; -}