#! /usr/bin/ksh # Original Author: Tim Mooney (mooney@plains.nodak.edu) # $Id: osf.req,v 1.3 1998/06/14 16:03:14 ewt Exp $ # # This file is distributed under the terms of the GNU Public License # # find-requires is part of RPM, the Red Hat Package Manager. find-requires # reads a list of full pathnames (in a package) on stdin, and outputs all # shared libraries the package requires to execute. # # On Digital Unix (OSF1), use `odump -Dl' to find the library dependencies # for an executable. `odump -D' does most of what we need, but it doesn't # give us library version information, so you must use `odump -Dl' # # Example `odump -Dl' output: # #$odump -Dl /usr/bin/X11/xterm # # # # # ***LIBRARY LIST SECTION*** # Name Time-Stamp CheckSum Flags Version #/usr/bin/X11/xterm: # libXaw.so Dec 9 00:15:35 1997 0x285006d0 0 6.0 # libXmu.so Dec 9 00:13:36 1997 0x3bf3a33d 0 # libXt.so Dec 9 00:12:18 1997 0x10dd9a17 0 # libSM.so Dec 9 00:08:11 1997 0xb64c7082 0 # libICE.so Dec 9 00:07:52 1997 0x1199be32 0 # libXext.so Dec 9 00:08:51 1997 0xafcb84d5 0 # libX11.so Dec 9 00:06:05 1997 0xaa1bf091 0 # libc.so Dec 8 18:41:11 1997 0x5e955f9b 0 osf.1 PATH=/usr/bin:/usr/sbin:/sbin:/usr/ccs/bin export PATH filelist=`cat -` # # Handle shell scripts first # for f in `echo $filelist | xargs file | grep 'shell script' | cut -d: -f 2 \ | awk '{ print $1 }'` do print $f done | sort -u # # TVM: it might be better to re-write this so that `file' isn't used, since # it could all be done with `odump', but this works. # for f in `echo $filelist | xargs file | grep executable | cut -d: -f1` do odump -Dl $f 2>/dev/null | awk ' # # For you non-awk-ers, no single quotes in comments -- the shell # sees them and things get hosed. # BEGIN { found_program_name = 0; FS = " "; RS = "\n"; OFS=""; # # what character should be used to separate the soname from any # version info? Using a . is actually a bad idea, since some # free/3rd party libraries may be built so that the library # soname may have version info in it too. If we use . as the # separator, it may not be possible to tell where the soname # ends and the internal version info begins. It might be # better to use a - or a : here. If you do so, be sure to # change this setting in find-provides, too. # soname_version_delimiter="."; } # uncomment the next line for debugging information #{ print "Saw input:", $0 } found_program_name == 1 && $0 !~ /^$/ { # uncomment for debugging information #print "found shared library: $0" # get the library name (field 1) and the library version (field 8) # if present. numfields = split($0,fields) if (numfields == 7) { print fields[1] } else if (numfields == 8) { # # Note that if a library contains a number as the last # part of the soname *and* it contains version information, # we have a problem because it is impossible to tell where # the soname ends and the version info begins. Digital Unix # shared libraries should *not* be built with any version info # in the soname. That info should be in the version field # only. # # If we used a separator character of a - or something else, # instead of a ., we would not have this problem. # print fields[1], soname_version_delimiter, fields[8] } } /^.*: *$/ { found_program_name = 1 # # uncomment the next line for debugging information #print "found the program name: ", $1 } ' # end of awk done | sort -u # comment out the previous line and uncomment the next when debugging # done