aboutsummaryrefslogtreecommitdiffstats
path: root/find-requires.in
blob: 9038276666af738ef0d40607cd4ccb9d471361ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32# Here you can specify the packages that won't be upgraded automatically
# for example, to exclude all apache packages :
# /^apache/
46' href='#n46'>46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
#!/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`
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/ && $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'

# --- 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([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\|ld64\|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