aboutsummaryrefslogtreecommitdiffstats
path: root/find-requires.in
diff options
context:
space:
mode:
Diffstat (limited to 'find-requires.in')
-rwxr-xr-xfind-requires.in192
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