#!/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"$3" = Xldd ]; then needed=0 elif [ X"$3" = Xobjdump ]; then needed=1 fi # --- Mandriva 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 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" | egrep -v "/usr/lib(64)?/gcj/" | xargs -r file | \ grep ":.*shared object" | cut -d : -f1` ocamllist=`echo "$filelist" | xargs -r file | \ grep ":.*Objective caml interface file" | 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/) { 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/) { 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@.*/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 >/dev/null 2>&1; then rpm -qf $i --qf '%{name}\n' else 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 ; } } (START==1) && /GNU_HASH/ { print "rtld(GNU_HASH)"; } /^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' # --- OCaml dependency if [ -x /usr/bin/ocamlc -a -n "$ocamllist" ]; then version=`ocamlc -v | grep version | awk '{print $6}' | sed -e 's/+/./'` echo "ocaml = $version" fi # # --- Perl modules. [ -x @RPMVENDORDIR@/perl.req -a -n "$perllist" ] && \ echo $perllist | tr '[:blank:]' \\n | @RPMVENDORDIR@/perl.req | grep 'perl([[:upper:]]' | egrep -v '^perl\((Be|FreeBSD|HPUX|Mac|MSDOS|MVS|OS2|Riscos|SGI|Solaris|VMS|Win32|WinNT)::' | sort -u # # --- If libperl.so exists and if XS modules are found, depend on libperl.so if [ -n "$perllist" ]; then if perl -V:useshrplib | grep -q true ; then if echo $perllist | grep -q `perl -MConfig -e 'print $Config{archname}'` ; then f=`perl -MConfig -e 'print $Config{archlib}'`/CORE/libperl.so lib64=`if file -L $f 2>/dev/null | \ grep "ELF 64-bit" >/dev/null; then echo "()$mark64"; fi` echo libperl.so$lib64 fi fi fi # # --- 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 # # --- Php modules. [ -x @RPMVENDORDIR@/php.req ] && \ echo $filelist | tr '[:blank:]' \\n | @RPMVENDORDIR@/php.req | sort -u # # --- Pkgconfig deps [ -x @RPMVENDORDIR@/pkgconfigdeps.sh ] && echo "$filelist" | tr '[:blank:]' \\n | @RPMVENDORDIR@/pkgconfigdeps.sh -R | sort -u if [ -n "$LIBTOOLDEP" ]; then # # --- libtooldep deps [ -x @RPMLIBDIR@/libtooldeps.sh ] && echo "$filelist" | tr '[:blank:]' \\n | @RPMLIBDIR@/libtooldeps.sh -R | sort -u fi # # --- .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` && \ if [ -h ${i} -a -n "${objd}" ]; then if [ "$needed" -eq 0 ]; then ldd ${i} \ | grep -v "statically linked" \ | grep -v "/\(lib\|lib64\)/\(ld\|ld64\|ld-linux.*\)\.so" \ | perl -p -e "s/\s+(\S+)\.so.*/devel(\1$lib64)/g" else objdump -p $i | grep -v "\(ld\|ld64\|ld-linux.*\)\.so" \ | awk 'BEGIN { START=0; } /^$/ { START=0; } /^Dynamic Section:$/ { START=1; } (START==1) && /NEEDED/ { sub(/^/, "devel(", $2) ; sub(/\.so.*$/, "'$lib64')", $2) ; print $2 ; } ' fi fi done | egrep -v 'devel\(linux-gate|linux-vdso32|linux-vdso64|lib(c|pthread|rt)(\(64bit\))?\)' | sort -u # # --- pkgconfig echo $filelist | tr '[:blank:]' '\n' | egrep -q '/usr/(share|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 # # haskell requires if [ -x /usr/bin/haskell-find-requires ]; then echo $filelist | tr '[:blank:]' '\n' | /usr/bin/haskell-find-requires fi exit 0