diff options
Diffstat (limited to 'find-requires.in')
-rwxr-xr-x | find-requires.in | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/find-requires.in b/find-requires.in new file mode 100755 index 0000000..fd1dc77 --- /dev/null +++ b/find-requires.in @@ -0,0 +1,192 @@ +#!/bin/bash + +# +# Auto-generate requirements for executables (both ELF and a.out) and library +# sonames, script interpreters, and perl modules. +# + +ulimit -c 0 + +# +# --- Set needed to 0 for traditional find-requires behavior. +needed=1 +if [ X"$1" = Xldd ]; then + needed=0 +elif [ X"$1" = Xobjdump ]; then + needed=1 +fi + +# --- Mandrake Linux specific part +case "$LD_PRELOAD" in + *libfakeroot*) + unset LD_PRELOAD + ;; +esac + +RPM_BUILD_ROOT=$1 +RPM_ARCH=$2 + +if [ -n "$RPM_BUILD_ROOT" ]; then + echo "Using BuildRoot: $RPM_BUILD_ROOT to search libs" 1>&2 + + lib_path_64=$RPM_BUILD_ROOT/usr/X11R6/lib64:$RPM_BUILD_ROOT/usr/lib64:$RPM_BUILD_ROOT/lib64 + lib_path_32=$RPM_BUILD_ROOT/usr/X11R6/lib:$RPM_BUILD_ROOT/usr/lib:$RPM_BUILD_ROOT/lib + LD_LIBRARY_PATH=$lib_path_64:$lib_path_32 + export LD_LIBRARY_PATH +fi + + +# +# --- Grab the file manifest and classify files. +#filelist=`sed "s/['\"]/\\\&/g"` +filelist=`sed "s/[]['\"*?{}]/\\\\\&/g"` +exelist=`echo "$filelist" | xargs -r file | egrep -v ":.* (commands|script) " | \ + grep ":.*executable" | cut -d: -f1` +scriptlist=`echo "$filelist" | grep -v /usr/doc | grep -v /usr/share/doc | xargs -r file | \ + egrep ":.* (commands|script) " | cut -d: -f1` +liblist=`echo "$filelist" | xargs -r file | \ + grep ":.*shared object" | cut -d : -f1` + +interplist= +perllist= +pythonlist= +tcllist= + +# +# --- Alpha does not mark 64bit dependencies +case `uname -m` in + alpha*) mark64="" ;; + *) mark64="()(64bit)" ;; +esac + +if [ "$needed" -eq 0 ]; then +# +# --- Executable dependency sonames. + for f in $exelist; do + [ -r $f -a -x $f ] || continue + lib64=`if file -L $f 2>/dev/null | \ + grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi` + ldd $f | awk '/=>/ { + if ($1 !~ /libNoVersion.so/ && $1 !~ /4[um]lib.so/ && $1 !~ /libredhat-kernel.so/) { + gsub(/'\''"/,"\\&",$1); + printf "%s'$lib64'\n", $1 + } + }' + done | xargs -r -n 1 basename | sort -u | grep -v 'libsafe|libfakeroot' + +# +# --- Library dependency sonames. + for f in $liblist; do + [ -r $f ] || continue + lib64=`if file -L $f 2>/dev/null | \ + grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi` + ldd $f | awk '/=>/ { + if ($1 !~ /libNoVersion.so/ && $1 !~ /4[um]lib.so/ && $1 !~ /libredhat-kernel.so/) { + gsub(/'\''"/,"\\&",$1); + printf "%s'$lib64'\n", $1 + } + }' + done | xargs -r -n 1 basename | sort -u | grep -v 'libsafe|libfakeroot' +fi + +# +# --- Perl or python deps +for f in $filelist; do + echo $f | sed -n -e "s@$RPM_BUILD_ROOT@@" -e 's@^/usr/lib/perl5/\(site_perl/\)\([0-9]\{1,\}\.[0-9]\{1,\}\)\.\([0-9]\{1,\}\).*$@perl-base >= \2.\3@p' -e 's@^/usr/lib/perl5/\(vendor_perl\/\)\([.0-9]\{1,\}\).*$@perl-base >= 2:\2@p' -e 's@^/usr/\(lib\|lib64\)/python\([.0-9]\{1,\}\).*$@python-base >= \2@p' +done | sort -u + + +# +# --- Script interpreters. +for f in $scriptlist; do + [ -r $f -a -x $f ] || continue + interp=`head -n 1 $f | grep '^#!' | sed -e 's/^\#\![ ]*//' | cut -d" " -f1` + interplist="$interplist $interp" + case $interp in + */perl) perllist="$perllist $f" ;; + esac +done +if [ -n "$interplist" ]; then + for i in `echo "$interplist" | tr '[:blank:]' \\\n | sort -u`; do + if ! rpm -qf $i --qf '%{NAME}\n' 2>/dev/null; then + echo $i + fi + done | sort -u | grep -v 'libsafe|libfakeroot' +fi + +# +# --- Add perl module files to perllist. +for f in $filelist; do + [ -r $f -a "${f%.pm}" != "${f}" ] && perllist="$perllist $f" +done + +# +# --- Weak symbol versions (from glibc). +[ -n "$mark64" ] && mark64="(64bit)" +for f in $liblist $exelist ; do + [ -r $f ] || continue + lib64=`if file -L $f 2>/dev/null | \ + grep "ELF 64-bit" >/dev/null; then echo "$mark64"; fi` + objdump -p $f | awk 'BEGIN { START=0; LIBNAME=""; needed='$needed'; } + /^$/ { START=0; } + /^Dynamic Section:$/ { START=1; } + (START==1) && /NEEDED/ { + if (needed) { + if ("'$lib64'" != "") { + sub(/$/, "()'$lib64'", $2) ; + } + print $2 ; + } + } + /^Version References:$/ { START=2; } + (START==2) && /required from/ { + sub(/:/, "", $3); + LIBNAME=$3; + } + (START==2) && (LIBNAME!="") && ($4!="") && (($4~/^GLIBC_*/) || ($4~/^GCC_*/)) { + print LIBNAME "(" $4 ")'$lib64'"; + } + ' +done | sort -u | grep -v 'libsafe|libfakeroot' + +# +# --- Perl modules. +[ -x @RPMVENDORDIR@/perl.req -a -n "$perllist" ] && \ + echo $perllist | tr '[:blank:]' \\n | @RPMVENDORDIR@/perl.req | grep 'perl([A-Z]' | egrep -v 'perl\((Be|FreeBSD|HPUX|Mac|MSDOS|MVS|OS2|Riscos|SGI|Solaris|VMS|Win32|WinNT)' | sort -u + +# +# --- Python modules. +[ -x @RPMVENDORDIR@/python.req -a -n "$pythonlist" ] && \ + echo $pythonlist | tr '[:blank:]' \\n | @RPMVENDORDIR@/python.req | sort -u + +# +# --- Tcl modules. +[ -x @RPMVENDORDIR@/tcl.req -a -n "$tcllist" ] && \ + echo $tcllist | tr '[:blank:]' \\n | @RPMVENDORDIR@/tcl.req | sort -u + +# +# --- .so files. +for i in `echo $filelist | tr '[:blank:]' "\n" | egrep "(/usr(/X11R6)?)?/lib(|64)/[^/]+\.so$"`; do + objd=`objdump -p ${i} | grep SONAME` + lib64=`if file -L $i 2>/dev/null | grep "ELF 64-bit" >/dev/null; then echo "(64bit)"; fi` && \ + [ -h ${i} -a -n "${objd}" ] && \ + ldd ${i} \ + | grep -v "/\(lib\|lib64\)/ld-linux.*\.so" \ + | perl -p -e "s/\s+(\S+)\.so.*/devel(\1$lib64)/g" +done | egrep -v 'devel\(linux-gate|lib(c|pthread|rt)(\(64bit\))?\)' | sort -u + +# +# --- pkgconfig +echo $filelist | tr '[:blank:]' '\n' | egrep -q '/usr/lib(64)?/pkgconfig/.*\.pc' && echo pkgconfig + +# +# --- multiarch-utils +echo $filelist | tr '[:blank:]' '\n' | grep -q '/multiarch-.*-linux/' && echo multiarch-utils + +# +# --- mono requires +if [ -x /usr/bin/mono-find-requires ]; then +echo $filelist | tr [:blank:] \\n | /usr/bin/mono-find-requires +fi + +exit 0 |