xref: /freebsd/tools/make_libdeps.sh (revision d0b2dbfa)
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
30ea4fe0b6SHans Petter Selaskyset -e
31ea4fe0b6SHans Petter Selasky
32be460ad5SDag-Erling SmørgravLC_ALL=C			# make sort deterministic
334d8bba46SRuslan ErmilovFS=': '				# internal field separator
344d8bba46SRuslan ErmilovLIBDEPENDS=./_libdeps		# intermediate output file
35ea4fe0b6SHans 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
44ea4fe0b6SHans Petter Selasky	contrib/ofed
454d8bba46SRuslan Ermilov"				# where to scan for libraries
464d8bba46SRuslan Ermilov
47ea4fe0b6SHans Petter Selasky
48ea4fe0b6SHans Petter Selasky# convert -lfoo to foo
49ea4fe0b6SHans Petter Selaskyconvert()
50ea4fe0b6SHans Petter Selasky{
51ea4fe0b6SHans Petter Selasky    sed -e "s/\-l//g" -e "s/pthread/thr/g" -e "s/ncurses.*/ncurses/g"
52ea4fe0b6SHans Petter Selasky}
53ea4fe0b6SHans Petter Selasky
54ea4fe0b6SHans Petter Selasky# find library build directory given library name
55ea4fe0b6SHans Petter Selaskyfindlibdir()
56ea4fe0b6SHans Petter Selasky{
57ea4fe0b6SHans Petter Selasky	while read NAME && read DIR
58ea4fe0b6SHans Petter Selasky	do
59ea4fe0b6SHans Petter Selasky		if [ "$NAME" = "$1" ]; then
60ea4fe0b6SHans Petter Selasky			echo "$DIR"
61ea4fe0b6SHans Petter Selasky			exit
62ea4fe0b6SHans Petter Selasky		fi
63ea4fe0b6SHans Petter Selasky	done
64ea4fe0b6SHans Petter Selasky
65ea4fe0b6SHans Petter Selasky	# Should not happen
66ea4fe0b6SHans Petter Selasky	echo lib_not_found/lib$1
67ea4fe0b6SHans Petter Selasky}
68ea4fe0b6SHans Petter Selasky
69ea4fe0b6SHans Petter Selasky# find library build directories given one or more library names
70ea4fe0b6SHans Petter Selaskyresolvelibdirs()
71ea4fe0b6SHans Petter Selasky{
72ea4fe0b6SHans Petter Selasky	while read LIBNAME
73ea4fe0b6SHans Petter Selasky	do
74ea4fe0b6SHans Petter Selasky		cat $LIBDIRS | tr ' ' '\n' | findlibdir "$LIBNAME"
75ea4fe0b6SHans Petter Selasky	done
76ea4fe0b6SHans Petter Selasky}
774d8bba46SRuslan Ermilov
784d8bba46SRuslan Ermilov# Generate interdependencies between libraries.
794d8bba46SRuslan Ermilov#
804d8bba46SRuslan Ermilovgenlibdepends()
814d8bba46SRuslan Ermilov{
824d8bba46SRuslan Ermilov	(
83ea4fe0b6SHans Petter Selasky		# Reset file
84ea4fe0b6SHans Petter Selasky		echo -n > $LIBDIRS
85ea4fe0b6SHans Petter Selasky
86ea4fe0b6SHans Petter Selasky		# First pass - generate list of directories
874d8bba46SRuslan Ermilov		cd ${USRSRC}
88ea4fe0b6SHans Petter Selasky		find -s ${LIBS} -name Makefile |
89ea4fe0b6SHans Petter Selasky		xargs grep -l 'bsd\.lib\.mk' |
90ea4fe0b6SHans Petter Selasky		while read makefile; do
91ea4fe0b6SHans Petter Selasky			libdir=$(dirname ${makefile})
92ea4fe0b6SHans Petter Selasky			libname=$(
93ea4fe0b6SHans Petter Selasky				cd ${libdir}
94ea4fe0b6SHans Petter Selasky				make -m ${USRSRC}/share/mk WITH_OFED=YES -V LIB
95ea4fe0b6SHans Petter Selasky			)
96ea4fe0b6SHans Petter Selasky			if [ "${libname}" ]; then
97ea4fe0b6SHans Petter Selasky			    echo "${libname} ${libdir}" >> $LIBDIRS
98ea4fe0b6SHans Petter Selasky			fi
99ea4fe0b6SHans Petter Selasky		done
100ea4fe0b6SHans Petter Selasky
101ea4fe0b6SHans Petter Selasky		# Second pass - generate dependencies
102ea4fe0b6SHans 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}
108ea4fe0b6SHans Petter Selasky				make -m ${USRSRC}/share/mk WITH_OFED=YES -V LDADD
1094d8bba46SRuslan Ermilov			)
1104d8bba46SRuslan Ermilov			if [ "${deps}" ]; then
111ea4fe0b6SHans 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