25.8 Deleting Obsolete Files, Directories and Libraries

Based on notes provided by Anton Shterenlikht.

As a part of the FreeBSD development lifecycle, it happens from time to time that files and their contents become obsolete. This may be because their functionality is implemented elsewhere, the version number of the library has changed or it was removed from the system entirely. This includes old files, libraries and directories, which should be removed when updating the system. The benefit for the user is that the system is not cluttered with old files which take up unnecessary space on the storage (and backup) medium. Additionally, if the old library had a security or stability issue, you should update to the newer library to keep your system safe and prevent crashes caused by the old library implementation. The files, directories, and libraries that are considered obsolete are listed in /usr/src/ObsoleteFiles.inc. The following instructions will help you removing these obsolete files during the system upgrade process.

We assume you are following the steps outlined in Section 25.7.1. After the make installworld and the subsequent mergemaster commands have finished successfully, you should check for obsolete files and libraries as follows:

# cd /usr/src
# make check-old

If any obsolete files are found, they can be deleted using the following commands:

# make delete-old

Tip: See /usr/src/Makefile for more targets of interest.

A prompt is displayed before deleting each obsolete file. You can skip the prompt and let the system remove these files automatically by using the BATCH_DELETE_OLD_FILES make-variable as follows:

# make -DBATCH_DELETE_OLD_FILES delete-old

You can also achieve the same goal by piping these commands through yes like this:

# yes|make delete-old

Warning: Deleting obsolete files will break applications that still depend on those obsolete files. This is especially true for old libraries. In most cases, you need to recompile the programs, ports, or libraries that used the old library before make delete-old-libs is executed.

Utilities for checking shared library dependencies are available from the Ports Collection in sysutils/libchk or sysutils/bsdadminscripts.

Obsolete shared libraries can conflict with newer libraries, causing messages like these:

/usr/bin/ld: warning: libz.so.4, needed by /usr/local/lib/libtiff.so, may conflict with libz.so.5
/usr/bin/ld: warning: librpcsvc.so.4, needed by /usr/local/lib/libXext.so, may conflict with librpcsvc.so.5

To solve these problems, determine which port installed the library:

# pkg_info -W  /usr/local/lib/libtiff.so
/usr/local/lib/libtiff.so was installed by package tiff-3.9.4
# pkg_info -W /usr/local/lib/libXext.so
/usr/local/lib/libXext.so was installed by package libXext-1.1.1,1

Then deinstall, rebuild and reinstall the port. The ports-mgmt/portmaster and ports-mgmt/portupgrade utilities can be used to automate this process. After you have made sure that all ports are rebuilt and do not use the old libraries any more, you can delete them using the following command:

# make delete-old-libs