diff options
author | Stanislav Brabec <utx@gentoo.org> | 2003-06-30 20:54:41 +0000 |
---|---|---|
committer | Stanislav Brabec <utx@gentoo.org> | 2003-06-30 20:54:41 +0000 |
commit | 05b5dd6cee5fcb173e004d168c747e06f93d6908 (patch) | |
tree | 953a9a843a4c2f38ca76bd543a1a480a9a06e4c9 /app-admin/gentoolkit/files | |
parent | new version of revdep-rebuild (diff) | |
download | historical-05b5dd6cee5fcb173e004d168c747e06f93d6908.tar.gz historical-05b5dd6cee5fcb173e004d168c747e06f93d6908.tar.bz2 historical-05b5dd6cee5fcb173e004d168c747e06f93d6908.zip |
new version of revdep-rebuild
Diffstat (limited to 'app-admin/gentoolkit/files')
-rw-r--r-- | app-admin/gentoolkit/files/digest-gentoolkit-0.1.29 | 0 | ||||
-rw-r--r-- | app-admin/gentoolkit/files/scripts/revdep-rebuild-1 | 351 |
2 files changed, 351 insertions, 0 deletions
diff --git a/app-admin/gentoolkit/files/digest-gentoolkit-0.1.29 b/app-admin/gentoolkit/files/digest-gentoolkit-0.1.29 new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/app-admin/gentoolkit/files/digest-gentoolkit-0.1.29 diff --git a/app-admin/gentoolkit/files/scripts/revdep-rebuild-1 b/app-admin/gentoolkit/files/scripts/revdep-rebuild-1 new file mode 100644 index 000000000000..a81902d02357 --- /dev/null +++ b/app-admin/gentoolkit/files/scripts/revdep-rebuild-1 @@ -0,0 +1,351 @@ +#! /bin/bash + +# Copyright 1999-2003 Gentoo Technologies, Inc. +# $Header: /var/cvsroot/gentoo-x86/app-admin/gentoolkit/files/scripts/revdep-rebuild-1,v 1.1 2003/06/30 20:54:18 utx Exp $ + +# revdep-rebuild: Reverse dependency rebuilder. +# Author: Stanislav Brabec <utx@gentoo.org> + +# requires: qpkg + +# Known problems: +# +# In exact ebuild mode revdep-rebuild can fails to get order packages, +# which are not up to date. This is because emerge first tries to +# merge latest package and last in resort it tries to degrade. +# http://bugs.gentoo.org/show_bug.cgi?id=23018 +# +# Rebuild in --package-names mode should be default, but emerge has no +# feature to update to latest version of defined SLOT. +# http://bugs.gentoo.org/show_bug.cgi?id=4698 + +# Mask of specially evaluated libraries (exactly one space separated). +LD_LIBRARY_MASK="libodbcinst.so libodbc.so libjava.so libjvm.so" + +# List of directories to be searched (feel free to edit it) +# Note /usr/libexec and /usr/local/subprefix cotradicts FHS, but are present +#�/var/something is for cgi and similar scripts +SEARCH_DIRS="/lib /bin /sbin /usr/lib /usr/bin /usr/sbin /usr/libexec /usr/X11R6/lib /usr/X11R6/bin /usr/X11R6/sbin /usr/e1* /usr/local /usr/qt* /usr/kde/*/lib /usr/*-*-linux-gnu /opt /var/qmail /var/vpopmail /home/httpd/cgi-bin" + +# Base of temporary files names. +LIST=~/.revdep-rebuild + +shopt -s nullglob +shopt -s expand_aliases +unalias -a + +NO="\x1b[0;0m" +BR="\x1b[0;01m" +CY="\x1b[36;01m" +GR="\x1b[32;01m" +RD="\x1b[31;01m" +YL="\x1b[33;01m" +BL="\x1b[34;01m" + +alias echo_v=echo + +PACKAGE_NAMES=false +SONAME="not found" +SONAME_GREP=fgrep +SEARCH_BROKEN=true + +while : ; do + case "$1" in + -h | --help ) + echo "Usage: $0 [OPTIONS] [--] [EMERGE_OPTIONS]" + echo + echo "Broken reverse dependency rebuilder." + echo + echo " -X, --package-names recompile based on package names, not exact versions" + echo " --soname SONAME recompile packages using library with SONAME instead" + echo " of broken library" + echo " --soname-regexp SONAME" + echo " the same as --soname, but accepts grep-style regexp" + echo " -q, --quiet be less verbose" + echo + echo "Calls emerge, all other options are used for it (e. g. -p, --pretend)." + echo + echo "Report bugs to <utx@gentoo.org>" + exit 0 + ;; + -X | --package-names ) + PACKAGE_NAMES=true + shift + ;; + -q | --quiet ) + alias echo_v=: + shift + ;; + --soname=* ) + SONAME="${1#*=}" + SEARCH_BROKEN=false + shift + ;; + --soname ) + SONAME="$2" + SEARCH_BROKEN=false + shift 2 + ;; + --soname-regexp=* ) + SONAME="${1#*=}" + SONAME_GREP=grep + SEARCH_BROKEN=false + shift + ;; + --soname-regexp ) + SONAME="$2" + SONAME_GREP=grep + SEARCH_BROKEN=false + shift 2 + ;; + -- ) + shift + break + ;; + * ) + break + ;; + esac +done + +function set_trap () { + trap "rm_temp $1" SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM +} + +function rm_temp () { + echo " terminated." + echo "Removing incomplete $1." + rm $1 + echo + exit 1 +} + +if $SEARCH_BROKEN ; then + SONAME_SEARCH="$SONAME" + LLIST=$LIST + HEAD_TEXT="broken by any package update" + OK_TEXT="Dynamic linking on your system is consistent" + WORKING_TEXT=" consistency" +else + SONAME_SEARCH=" $SONAME " + LLIST=${LIST}_$(echo "$SONAME_SEARCH$SONAME" | md5sum | head -c 8) + HEAD_TEXT="using given shared object name" + OK_TEXT="There are no dynamic links to $SONAME" + WORKING_TEXT="" +fi + +echo +echo "Checking reverse dependencies..." +echo "Packages containing binaries and libraries $HEAD_TEXT," +echo "will be recompiled." + +echo +echo -n -e "${GR}Collecting system binaries and libraries...${NO}" +if [ -f $LIST.1_files ] ; then + echo " using existing $LIST.1_files." +else + set_trap "$LIST.1_files" + find $SEARCH_DIRS -type f \( -perm +u+x -o -name '*.so' -o -name '*.so.*' \) 2>/dev/null >$LIST.1_files + echo -e " done.\n ($LIST.1_files)" +fi + +if $SEARCH_BROKEN ; then + echo + echo -n -e "${GR}Collecting complete LD_LIBRARY_PATH...${NO}" + if [ -f $LIST.2_ldpath ] ; then + echo " using existing $LIST.2_ldpath." + else + set_trap "$LIST.2_ldpath" + ( + grep '.*\.so\(\|\..*\)$' <$LIST.1_files | sed 's:/[^/]*$::' + sed '/^#/d;s/#.*$//' </etc/ld.so.conf + ) | uniq | sort | uniq | + tr '\n' : | tr -d '\r' | sed 's/:$//' >$LIST.2_ldpath + echo -e " done.\n ($LIST.2_ldpath)" + fi + export COMPLETE_LD_LIBRARY_PATH="$(cat $LIST.2_ldpath)" +fi + +echo +echo -n -e "${GR}Checking dynamic linking$WORKING_TEXT...${NO}" +if [ -f $LLIST.3_rebuild ] ; then + echo " using existing $LLIST.3_rebuild." +else + echo_v + set_trap "$LLIST.3_rebuild" + LD_MASK="\\( $(echo "$LD_LIBRARY_MASK" | sed 's/\./\\./g;s/ / \\| /g') \\)" + echo -n >$LLIST.3_rebuild + cat $LIST.1_files | while read FILE ; do +# Note: double checking seems to be faster than single +# with complete path (special add ons are rare). + if ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | + $SONAME_GREP -q "$SONAME_SEARCH" ; then + if $SEARCH_BROKEN ; then + if LD_LIBRARY_PATH="$COMPLETE_LD_LIBRARY_PATH" \ + ldd "$FILE" 2>/dev/null | grep -v "$LD_MASK" | + $SONAME_GREP -q "$SONAME_SEARCH" ; then + echo "$FILE" >>$LLIST.3_rebuild + echo_v " broken $FILE (requires $(ldd "$FILE" | sed -n 's/ \(.*\) => not found$/\1/p' | tr '\n' ' ' | sed 's/ $//' ))" + fi + else + echo "$FILE" >>$LLIST.3_rebuild + echo_v " found $FILE" + fi + fi + done + echo -e " done.\n ($LLIST.3_rebuild)" +fi + +if $PACKAGE_NAMES ; then + EXACT_EBUILDS=false + + echo + echo -n -e "${GR}Assigning files to packages...${NO}" + if [ -f $LLIST.4_packages_raw ] ; then + echo " using existing $LLIST.4_packages_raw." + else + set_trap "$LLIST.4_packages_raw" + echo -n >$LLIST.4_packages_raw + echo -n >$LLIST.4_package_owners + cat $LLIST.3_rebuild | while read FILE ; do + PKG="$(qpkg -nc -f "$FILE")" + if [ -z "$PKG" ] ; then + echo -n -e "\n ${RD}*** $FILE not owned by any package is broken! ***${NO}" + echo "$FILE -> (none)" >> $LLIST.4_package_owners + echo_v -n -e "\n $FILE -> (none)" + else + echo "$PKG" >> $LLIST.4_packages_raw + echo "$FILE -> $PKG" >> $LLIST.4_package_owners + echo_v -n -e "\n $FILE -> $PKG" + fi + done + echo_v + echo -e " done.\n ($LLIST.4_packages_raw, $LLIST.4_package_owners)" + fi + + echo + echo -n -e "${GR}Cleaning list of packages to rebuild...${NO}" + if [ -f $LLIST.5_packages ] ; then + echo " using existing $LLIST.5_packages." + else + set_trap "$LLIST.5_packages" + sort <$LLIST.4_packages_raw | uniq >$LLIST.5_packages + echo -e " done.\n ($LLIST.5_packages)" + fi + + RAW_REBUILD_LIST="$(cat $LLIST.5_packages | tr '\n' ' ')" + +else + EXACT_EBUILDS=true + + echo + echo -n -e "${GR}Assigning files to ebuilds...${NO}" + if [ -f $LLIST.4_ebuilds ] ; then + echo " using existing $LLIST.4_ebuilds." + else + set_trap "$LLIST.4_ebuilds" + cat $LLIST.3_rebuild | sed 's/^/obj /;s/$/ /' | + ( + cd /var/db/pkg + fgrep -l -f - */*/CONTENTS + ) | sed s:/CONTENTS:: > $LLIST.4_ebuilds + echo -e " done.\n ($LLIST.4_ebuilds)" + fi + + RAW_REBUILD_LIST="$(cat $LLIST.4_ebuilds | sed s/^/=/ | tr '\n' ' ')" +fi + +echo +echo -n -e "${GR}Evaluating package order...${NO}" +if [ -f $LLIST.5_order ] ; then + echo " using existing $LLIST.5_order." +else + if [ ! -z "$RAW_REBUILD_LIST" ] ; then + REBUILD_GREP="^\\($(emerge --nospinner --pretend --oneshot --nodeps $RAW_REBUILD_LIST | sed -n 's/\./\\&/g;s/ //g;s/$/\\/;s/^.*\]//p' | tr '\n' '|' | sed 's/|$//'))\$" + emerge --nospinner --pretend --oneshot --emptytree $RAW_REBUILD_LIST | sed -n 's/ //g;s/^.*\]//p' | grep "$REBUILD_GREP" >$LLIST.5_order + else + echo -n "" >$LLIST.5_order + fi + echo -e " done.\n ($LLIST.5_order)" +fi + +REBUILD_LIST="$(cat $LLIST.5_order | sed s/^/=/ | tr '\n' ' ')" + +trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM + +if [ -z "$REBUILD_LIST" ] ; then + echo -e "\n${GR}$OK_TEXT... All done.${NO} " + rm $LIST.[1-2]_* + rm $LLIST.[3-9]_* + exit 0 +fi + +IS_REAL_MERGE=true +echo " $* " | grep -q '\( -p \| --pretend \)' && IS_REAL_MERGE=false + +echo +echo -e "${GR}All prepared. Starting rebuild...${NO}" +echo "emerge --oneshot --nodeps $@ $REBUILD_LIST" +if $IS_REAL_MERGE ; then + for i in . . . . . . . . . . ; do + echo -n -e '\a.' + sleep 1 + done + echo +fi + +#if $EXACT_EBUILDS ; then +# Uncomment following, if you want to recompile masked ebuilds. +## FIXME: Check for PORTDIR_OVERLAY +# echo -e "${GR}Temporarilly disablink package mask...${NO}" +# trap "mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask ; echo -e "\\n\\nTerminated." ; exit 1" \ +# SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM +# mv -i /usr/portage/profiles/package.mask /usr/portage/profiles/package.mask.hidden +#fi + +# Run in background to correctly handle Ctrl-C +( + emerge --oneshot --nodeps $@ $REBUILD_LIST + echo $? >$LLIST.6_status +) & +wait + +#if $EXACT_EBUILDS ; then +# mv -i /usr/portage/profiles/package.mask.hidden /usr/portage/profiles/package.mask +# trap - SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM +#fi + +if [ "$(cat $LLIST.6_status)" -gt 0 ] ; then + echo + echo -e "${RD}Result is not OK, you have following chances:${NO}" + echo "- if emerge failed during build, fix the problems and re-run revdep-rebuild" + echo " or" + echo "- use -X or --package-names as first argument (try to rebuild package, not exact" + echo " ebuild - ignores SLOT!)" + echo " or" + echo "- modify the above emerge command and run it manually" + echo " or" + echo "- compile or unmerge unsatisfied packages manually, remove temporary files and" + echo " try again (you can edit package/ebuild list first)" + echo + echo -e "${GR}To remove temporary files, please run:${NO}" + echo "rm $LIST*.?_*" +else + if $IS_REAL_MERGE ; then + trap "echo -e \" terminated. Please remove them manually:\nrm $LIST*.?_*\" ; exit 1" \ + SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM + echo -n -e "${GR}Build finished correctly. Removing temporary files...${NO} " + for i in . . . . . . . . . . ; do + echo -n -e '.' + sleep 1 + done + echo + rm $LIST.[1-2]_* + rm $LLIST.[3-9]_* + echo "You can re-run revdep-rebuild to verify that all libraries and binaries" + echo "are fixed. If some inconsistency remains, it can be orphaned file, deep" + echo "dependency, binary package or specially evaluated library." + else + echo -e "${GR}Now you can remove -p (or --pretend) from arguments and re-run revdep-rebuild.${NO}" + fi +fi |