Recipe 2.9. Tracking Source-Built Libraries on an RPM-Based System

 < Day Day Up > 

2.9.1 Problem

You want to run both source-built programs and RPMs on the same system. But RPM does not know about the source-built libraries, so it incorrectly reports dependency errors.

2.9.2 Solution

Use the rpm-orphan-find script. This script searches for all the libraries on your system, then compares the results with the contents of the RPM database. Any orphaned libraries are then rolled into a new, virtual .rpm. There are no files in this .rpm, just a list of provides. Run this like any Bash script:

# chmod +x rpm-orphan-find # ./rpm-orphan-find

When the script is finished, install the shiny new .rpm, and your formerly orphaned libraries will be included in your RPM database.

2.9.3 Program: rpm-orphan-find

Thank you to Paul Heinlein and Peter Samuelson for this great script.

#!/bin/bash ## rpm-orphan-find, a script that finds ## orphaned libs on an RPM-based system ## and rolls them into a virtual .rpm ## written by Paul Heinlein and Peter Samuelson ## Copyright 2003 ## You may use, distribute or modify this ## program under the terms of the GPL. OS=$(uname -s) LIBS="/lib /usr/lib $(cat /etc/ld.so.conf)" NAME=$(echo ${OS}-base-libs | tr '[A-Z]' '[a-z]') VER=1.0; REL=1 TMPSPEC=$(mktemp /tmp/${NAME}.spec.XXXXXX)     exec 9>$TMPSPEC     cat <<_ _eof_ _ >&9 Summary: $OS Base Virtual Package Name: $NAME Version: $VER Release: $REL Group: System Environment/Base License: None _ _eof_ _     found=0; orphan=0; echo "Scanning system libraries $NAME version $VER-$REL..." find $LIBS -type f \( -name '*.so.*' -o -name '*.so' \) | while read f do   ((found++))   if ! rpm -qf $f >/dev/null 2>&1   then     ((orphan++))     echo "Provides: $(basename $f)" >&9   fi   echo -ne "Orphans found: $orphan/$found...\r" done echo ''; echo ''     cat <<_ _eof_ _ >&9     %description This is a virtual RPM package.  It contains no actual files.  It uses the 'Provides' token from RPM 3.x and later to list many of the  shared libraries that are part of the base operating system and associated subsets for  this $OS environment.     %prep # nothing to do     %build # nothing to do     %install # nothing to do     %clean # nothing to do     %post # nothing to do     %files     _ _eof_ _     exec 9>&- rpmbuild -ba $TMPSPEC; rm $TMPSPEC

Note that rpmbuild has replaced rpm. Since when, you ask? Since the turn of the century. It first appeared in Red Hat 8, RPM Version 4.1. The old RPM commands often still work, though, because they are aliased in /etc/popt. Run rpm version to see what version you have.

If you have an older version of RPM, edit the last line of the script as follows:

rpm -bb $TMPSPEC; rm $TMPSPEC

2.9.4 See Also

  • rpm(8), rpmbuild(8)

  • Maximum RPM (http://www.rpm.org/max-rpm/index.html)

     < Day Day Up > 


    Linux Cookbook
    Linux Cookbook
    ISBN: 0596006403
    EAN: 2147483647
    Year: 2004
    Pages: 434

    flylib.com © 2008-2017.
    If you may any questions please contact us: flylib@qtcs.net