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