14d8bba46SRuslan Ermilov#!/bin/sh -e 24d8bba46SRuslan Ermilov# 34d8bba46SRuslan Ermilov# Copyright (c) 2002 Ruslan Ermilov, The FreeBSD Project 44d8bba46SRuslan Ermilov# All rights reserved. 54d8bba46SRuslan Ermilov# 64d8bba46SRuslan Ermilov# Redistribution and use in source and binary forms, with or without 74d8bba46SRuslan Ermilov# modification, are permitted provided that the following conditions 84d8bba46SRuslan Ermilov# are met: 94d8bba46SRuslan Ermilov# 1. Redistributions of source code must retain the above copyright 104d8bba46SRuslan Ermilov# notice, this list of conditions and the following disclaimer. 114d8bba46SRuslan Ermilov# 2. Redistributions in binary form must reproduce the above copyright 124d8bba46SRuslan Ermilov# notice, this list of conditions and the following disclaimer in the 134d8bba46SRuslan Ermilov# documentation and/or other materials provided with the distribution. 144d8bba46SRuslan Ermilov# 154d8bba46SRuslan Ermilov# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 164d8bba46SRuslan Ermilov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 174d8bba46SRuslan Ermilov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 184d8bba46SRuslan Ermilov# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 194d8bba46SRuslan Ermilov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 204d8bba46SRuslan Ermilov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 214d8bba46SRuslan Ermilov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 224d8bba46SRuslan Ermilov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 234d8bba46SRuslan Ermilov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 244d8bba46SRuslan Ermilov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 254d8bba46SRuslan Ermilov# SUCH DAMAGE. 264d8bba46SRuslan Ermilov# 274d8bba46SRuslan Ermilov 2863ebea53SRuslan Ermilovexport PATH=/bin:/usr/bin 294d8bba46SRuslan Ermilov 30*ea4fe0b6SHans Petter Selaskyset -e 31*ea4fe0b6SHans Petter Selasky 32be460ad5SDag-Erling SmørgravLC_ALL=C # make sort deterministic 334d8bba46SRuslan ErmilovFS=': ' # internal field separator 344d8bba46SRuslan ErmilovLIBDEPENDS=./_libdeps # intermediate output file 35*ea4fe0b6SHans Petter SelaskyLIBDIRS=./_libdirs # intermediate output file 364d8bba46SRuslan ErmilovUSRSRC=${1:-/usr/src} # source root 374d8bba46SRuslan ErmilovLIBS=" 384d8bba46SRuslan Ermilov lib 394d8bba46SRuslan Ermilov gnu/lib 404d8bba46SRuslan Ermilov kerberos5/lib 414d8bba46SRuslan Ermilov secure/lib 424d8bba46SRuslan Ermilov usr.bin/lex/lib 4363ebea53SRuslan Ermilov cddl/lib 44*ea4fe0b6SHans Petter Selasky contrib/ofed 454d8bba46SRuslan Ermilov" # where to scan for libraries 464d8bba46SRuslan Ermilov 47*ea4fe0b6SHans Petter Selasky 48*ea4fe0b6SHans Petter Selasky# convert -lfoo to foo 49*ea4fe0b6SHans Petter Selaskyconvert() 50*ea4fe0b6SHans Petter Selasky{ 51*ea4fe0b6SHans Petter Selasky sed -e "s/\-l//g" -e "s/pthread/thr/g" -e "s/ncurses.*/ncurses/g" 52*ea4fe0b6SHans Petter Selasky} 53*ea4fe0b6SHans Petter Selasky 54*ea4fe0b6SHans Petter Selasky# find library build directory given library name 55*ea4fe0b6SHans Petter Selaskyfindlibdir() 56*ea4fe0b6SHans Petter Selasky{ 57*ea4fe0b6SHans Petter Selasky while read NAME && read DIR 58*ea4fe0b6SHans Petter Selasky do 59*ea4fe0b6SHans Petter Selasky if [ "$NAME" = "$1" ]; then 60*ea4fe0b6SHans Petter Selasky echo "$DIR" 61*ea4fe0b6SHans Petter Selasky exit 62*ea4fe0b6SHans Petter Selasky fi 63*ea4fe0b6SHans Petter Selasky done 64*ea4fe0b6SHans Petter Selasky 65*ea4fe0b6SHans Petter Selasky # Should not happen 66*ea4fe0b6SHans Petter Selasky echo lib_not_found/lib$1 67*ea4fe0b6SHans Petter Selasky} 68*ea4fe0b6SHans Petter Selasky 69*ea4fe0b6SHans Petter Selasky# find library build directories given one or more library names 70*ea4fe0b6SHans Petter Selaskyresolvelibdirs() 71*ea4fe0b6SHans Petter Selasky{ 72*ea4fe0b6SHans Petter Selasky while read LIBNAME 73*ea4fe0b6SHans Petter Selasky do 74*ea4fe0b6SHans Petter Selasky cat $LIBDIRS | tr ' ' '\n' | findlibdir "$LIBNAME" 75*ea4fe0b6SHans Petter Selasky done 76*ea4fe0b6SHans Petter Selasky} 774d8bba46SRuslan Ermilov 784d8bba46SRuslan Ermilov# Generate interdependencies between libraries. 794d8bba46SRuslan Ermilov# 804d8bba46SRuslan Ermilovgenlibdepends() 814d8bba46SRuslan Ermilov{ 824d8bba46SRuslan Ermilov ( 83*ea4fe0b6SHans Petter Selasky # Reset file 84*ea4fe0b6SHans Petter Selasky echo -n > $LIBDIRS 85*ea4fe0b6SHans Petter Selasky 86*ea4fe0b6SHans Petter Selasky # First pass - generate list of directories 874d8bba46SRuslan Ermilov cd ${USRSRC} 88*ea4fe0b6SHans Petter Selasky find -s ${LIBS} -name Makefile | 89*ea4fe0b6SHans Petter Selasky xargs grep -l 'bsd\.lib\.mk' | 90*ea4fe0b6SHans Petter Selasky while read makefile; do 91*ea4fe0b6SHans Petter Selasky libdir=$(dirname ${makefile}) 92*ea4fe0b6SHans Petter Selasky libname=$( 93*ea4fe0b6SHans Petter Selasky cd ${libdir} 94*ea4fe0b6SHans Petter Selasky make -m ${USRSRC}/share/mk WITH_OFED=YES -V LIB 95*ea4fe0b6SHans Petter Selasky ) 96*ea4fe0b6SHans Petter Selasky if [ "${libname}" ]; then 97*ea4fe0b6SHans Petter Selasky echo "${libname} ${libdir}" >> $LIBDIRS 98*ea4fe0b6SHans Petter Selasky fi 99*ea4fe0b6SHans Petter Selasky done 100*ea4fe0b6SHans Petter Selasky 101*ea4fe0b6SHans Petter Selasky # Second pass - generate dependencies 102*ea4fe0b6SHans Petter Selasky find -s ${LIBS} -name Makefile | 1034d8bba46SRuslan Ermilov xargs grep -l 'bsd\.lib\.mk' | 1044d8bba46SRuslan Ermilov while read makefile; do 1054d8bba46SRuslan Ermilov libdir=$(dirname ${makefile}) 1064d8bba46SRuslan Ermilov deps=$( 1074d8bba46SRuslan Ermilov cd ${libdir} 108*ea4fe0b6SHans Petter Selasky make -m ${USRSRC}/share/mk WITH_OFED=YES -V LDADD 1094d8bba46SRuslan Ermilov ) 1104d8bba46SRuslan Ermilov if [ "${deps}" ]; then 111*ea4fe0b6SHans Petter Selasky echo ${libdir}"${FS}"$(echo ${deps} | tr ' ' '\n' | convert | resolvelibdirs) 1124d8bba46SRuslan Ermilov fi 1134d8bba46SRuslan Ermilov done 1144d8bba46SRuslan Ermilov ) 1154d8bba46SRuslan Ermilov} 1164d8bba46SRuslan Ermilov 1174d8bba46SRuslan Ermilovmain() 1184d8bba46SRuslan Ermilov{ 1194d8bba46SRuslan Ermilov if [ ! -f ${LIBDEPENDS} ]; then 1204d8bba46SRuslan Ermilov genlibdepends >${LIBDEPENDS} 1214d8bba46SRuslan Ermilov fi 1224d8bba46SRuslan Ermilov 1234d8bba46SRuslan Ermilov prebuild_libs=$( 124a9ff4acaSBryan Drewery awk -F"${FS}" '{ print $2 }' ${LIBDEPENDS} | tr ' ' '\n' | 125a9ff4acaSBryan Drewery sort -u 1264d8bba46SRuslan Ermilov ) 1274d8bba46SRuslan Ermilov echo "Libraries with dependents:" 1284d8bba46SRuslan Ermilov echo 129a9ff4acaSBryan Drewery echo ${prebuild_libs} | tr ' ' '\n' 1304d8bba46SRuslan Ermilov echo 1314d8bba46SRuslan Ermilov 1324d8bba46SRuslan Ermilov echo "List of interdependencies:" 1334d8bba46SRuslan Ermilov echo 1344d8bba46SRuslan Ermilov for lib in ${prebuild_libs}; do 1354d8bba46SRuslan Ermilov grep "^${lib}${FS}" ${LIBDEPENDS} || true 1364d8bba46SRuslan Ermilov done | 1374d8bba46SRuslan Ermilov awk -F"${FS}" '{ 1384d8bba46SRuslan Ermilov if ($2 in dependents) 1394d8bba46SRuslan Ermilov dependents[$2]=dependents[$2]" "$1 1404d8bba46SRuslan Ermilov else 1414d8bba46SRuslan Ermilov dependents[$2]=$1 1424d8bba46SRuslan Ermilov } 1434d8bba46SRuslan Ermilov END { 1444d8bba46SRuslan Ermilov for (lib in dependents) 1454d8bba46SRuslan Ermilov print dependents[lib]": " lib 1464d8bba46SRuslan Ermilov }' | 1474d8bba46SRuslan Ermilov sort 1484d8bba46SRuslan Ermilov 1494d8bba46SRuslan Ermilov exit 0 1504d8bba46SRuslan Ermilov} 1514d8bba46SRuslan Ermilov 1524d8bba46SRuslan Ermilovmain 153