make_libdeps.sh revision 97388
1316485Sdavidcs#!/bin/sh -e 2316485Sdavidcs# 3316485Sdavidcs# Copyright (c) 2002 Ruslan Ermilov, The FreeBSD Project 4316485Sdavidcs# All rights reserved. 5316485Sdavidcs# 6316485Sdavidcs# Redistribution and use in source and binary forms, with or without 7316485Sdavidcs# modification, are permitted provided that the following conditions 8316485Sdavidcs# are met: 9316485Sdavidcs# 1. Redistributions of source code must retain the above copyright 10316485Sdavidcs# notice, this list of conditions and the following disclaimer. 11316485Sdavidcs# 2. Redistributions in binary form must reproduce the above copyright 12316485Sdavidcs# notice, this list of conditions and the following disclaimer in the 13316485Sdavidcs# documentation and/or other materials provided with the distribution. 14316485Sdavidcs# 15316485Sdavidcs# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16316485Sdavidcs# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17316485Sdavidcs# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18316485Sdavidcs# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19316485Sdavidcs# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20316485Sdavidcs# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21316485Sdavidcs# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22316485Sdavidcs# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23316485Sdavidcs# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24316485Sdavidcs# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25316485Sdavidcs# SUCH DAMAGE. 26316485Sdavidcs# 27316485Sdavidcs# $FreeBSD: head/tools/make_libdeps.sh 97388 2002-05-28 08:25:29Z ru $ 28316485Sdavidcs 29316485Sdavidcsexport PATH=/usr/bin 30316485Sdavidcs 31316485SdavidcsFS=': ' # internal field separator 32316485SdavidcsLIBDEPENDS=./_libdeps # intermediate output file 33316485SdavidcsUSRSRC=${1:-/usr/src} # source root 34316485SdavidcsLIBS=" 35316485Sdavidcs lib 36316485Sdavidcs gnu/lib 37316485Sdavidcs kerberosIV/lib 38316485Sdavidcs kerberos5/lib 39316485Sdavidcs secure/lib 40316485Sdavidcs usr.bin/lex/lib 41316485Sdavidcs usr.sbin/pcvt/keycap 42316485Sdavidcs" # where to scan for libraries 43316485Sdavidcs 44316485Sdavidcs# This sed(1) filter is used to convert -lfoo to path/to/libfoo. 45316485Sdavidcs# 46316485SdavidcsSED_FILTER=" 47316485Sdavidcssed -E 48316485Sdavidcs -e's; ;! ;g' 49316485Sdavidcs -e's;$;!;' 50316485Sdavidcs -e's;-lm!;lib/msun;g' 51316485Sdavidcs -e's;-l(supc\+\+)!;gnu/lib/lib\1;g' 52316485Sdavidcs -e's;-l(krb)!;kerberosIV/lib/lib\1;g' 53316485Sdavidcs -e's;-l(asn1|gssapi|krb5|roken)!;kerberos5/lib/lib\1;g' 54316485Sdavidcs -e's;-l(crypto|ssh)!;secure/lib/lib\1;g' 55316485Sdavidcs -e's;-l([^!]+)!;lib/lib\1;g' 56316485Sdavidcs" 57316485Sdavidcs 58316485Sdavidcs# Generate interdependencies between libraries. 59316485Sdavidcs# 60316485Sdavidcsgenlibdepends() 61316485Sdavidcs{ 62316485Sdavidcs ( 63316485Sdavidcs cd ${USRSRC} 64316485Sdavidcs find ${LIBS} -mindepth 1 -name Makefile | 65316485Sdavidcs xargs grep -l 'bsd\.lib\.mk' | 66316485Sdavidcs while read makefile; do 67316485Sdavidcs libdir=$(dirname ${makefile}) 68337519Sdavidcs deps=$( 69316485Sdavidcs cd ${libdir} 70316485Sdavidcs make -V LDADD 71316485Sdavidcs ) 72316485Sdavidcs if [ "${deps}" ]; then 73316485Sdavidcs echo ${libdir}"${FS}"$( 74316485Sdavidcs echo ${deps} | 75316485Sdavidcs eval ${SED_FILTER} 76316485Sdavidcs ) 77316485Sdavidcs fi 78316485Sdavidcs done 79316485Sdavidcs ) 80316485Sdavidcs} 81316485Sdavidcs 82316485Sdavidcsmain() 83316485Sdavidcs{ 84316485Sdavidcs if [ ! -f ${LIBDEPENDS} ]; then 85316485Sdavidcs genlibdepends >${LIBDEPENDS} 86316485Sdavidcs fi 87316485Sdavidcs 88316485Sdavidcs prebuild_libs=$( 89316485Sdavidcs awk -F"${FS}" '{ print $2 }' ${LIBDEPENDS} |rs 0 1 |sort -u 90316485Sdavidcs ) 91316485Sdavidcs echo "Libraries with dependents:" 92316485Sdavidcs echo 93316485Sdavidcs echo ${prebuild_libs} | 94316485Sdavidcs rs 0 1 95316485Sdavidcs echo 96316485Sdavidcs 97316485Sdavidcs echo "List of interdependencies:" 98316485Sdavidcs echo 99316485Sdavidcs for lib in ${prebuild_libs}; do 100316485Sdavidcs grep "^${lib}${FS}" ${LIBDEPENDS} || true 101316485Sdavidcs done | 102316485Sdavidcs awk -F"${FS}" '{ 103316485Sdavidcs if ($2 in dependents) 104316485Sdavidcs dependents[$2]=dependents[$2]" "$1 105316485Sdavidcs else 106316485Sdavidcs dependents[$2]=$1 107316485Sdavidcs } 108316485Sdavidcs END { 109316485Sdavidcs for (lib in dependents) 110316485Sdavidcs print dependents[lib]": " lib 111316485Sdavidcs }' | 112316485Sdavidcs sort 113316485Sdavidcs 114316485Sdavidcs exit 0 115316485Sdavidcs} 116316485Sdavidcs 117316485Sdavidcsmain 118316485Sdavidcs