#!/bin/sh -e # # Copyright (c) 2002 Ruslan Ermilov, The FreeBSD Project # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $FreeBSD: src/tools/make_libdeps.sh,v 1.2.2.1 2002/07/23 12:12:30 ru Exp $ export PATH=/sbin:/usr/bin set -e LC_ALL=C # make sort deterministic FS=': ' # internal field separator LIBDEPENDS=./_libdeps # intermediate output file USRSRC=${1:-/usr/src} # source root LIBS=" lib gnu/lib usr.bin/flex/lib " # where to scan for libraries # This sed(1) filter is used to convert -lfoo to path/to/libfoo. # SED_FILTER=" sed -E -e's;-Wl,[^ ]+[ ]?;;g' -e's;-lprivate_crypto;-lrecrypto;g' -e's;-lprivate_ncurses;-lncurses;g' -e's;-lprivate_ssh;-lssh;g' -e's;-lprivate_ssl;-lressl;g' -e's;-pthread;-lthread_xu;g' -e's;/[^ ]+/libpthread\.so;-lpthread;g' -e's;/[^ ]+/libelf_pic.a;-lelf;g' -e's;\.\./components/[^ ]+/lib[a-z0-9]+_pic\.a[ ]?;;g' -e's;[ ]$;;g' -e's; ;! ;g' -e's;$;!;' -e's;-l([^!]+)!;lib/lib\1;g' " # Generate interdependencies between libraries. # genlibdepends() { ( cd ${USRSRC} find ${LIBS} -mindepth 1 -name Makefile | sort | xargs grep -l 'bsd\.lib\.mk' | while read makefile; do libdir=$(dirname ${makefile}) deps=$( cd ${libdir} make -m ${USRSRC}/share/mk -V LDADD ) if [ "${deps}" ]; then echo ${libdir}"${FS}"$( echo ${deps} | eval ${SED_FILTER} ) fi done ) } main() { if [ ! -f ${LIBDEPENDS} ]; then genlibdepends >${LIBDEPENDS} fi prebuild_libs=$( awk -F"${FS}" '{ print $2 }' ${LIBDEPENDS} | tr ' ' '\n' | sort -u ) echo "Libraries with dependents:" echo echo ${prebuild_libs} | tr ' ' '\n' echo echo "List of interdependencies:" echo for lib in ${prebuild_libs}; do grep "^${lib}${FS}" ${LIBDEPENDS} || true done | awk -F"${FS}" '{ if ($2 in dependents) dependents[$2]=dependents[$2]" "$1 else dependents[$2]=$1 } END { for (lib in dependents) print dependents[lib]": " lib }' | sort exit 0 } main