make_libdeps.sh revision 225778
172445Sassar#!/bin/sh -e
2178825Sdfr#
372445Sassar# Copyright (c) 2002 Ruslan Ermilov, The FreeBSD Project
472445Sassar# All rights reserved.
572445Sassar#
672445Sassar# Redistribution and use in source and binary forms, with or without
772445Sassar# modification, are permitted provided that the following conditions
872445Sassar# are met:
972445Sassar# 1. Redistributions of source code must retain the above copyright
1072445Sassar#    notice, this list of conditions and the following disclaimer.
1172445Sassar# 2. Redistributions in binary form must reproduce the above copyright
1272445Sassar#    notice, this list of conditions and the following disclaimer in the
1372445Sassar#    documentation and/or other materials provided with the distribution.
1472445Sassar#
1572445Sassar# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1672445Sassar# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1772445Sassar# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1872445Sassar# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1972445Sassar# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2072445Sassar# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2172445Sassar# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2272445Sassar# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2372445Sassar# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2472445Sassar# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2572445Sassar# SUCH DAMAGE.
2672445Sassar#
2772445Sassar# $FreeBSD: head/tools/make_libdeps.sh 225778 2011-09-27 07:14:12Z stas $
2872445Sassar
2972445Sassarexport PATH=/bin:/usr/bin
3072445Sassar
3172445SassarFS=': '				# internal field separator
3272445SassarLIBDEPENDS=./_libdeps		# intermediate output file
3372445SassarUSRSRC=${1:-/usr/src}		# source root
3472445SassarLIBS="
3572445Sassar	lib
3672445Sassar	gnu/lib
3772445Sassar	kerberos5/lib
3872445Sassar	secure/lib
39178825Sdfr	usr.bin/lex/lib
4072445Sassar	cddl/lib
4172445Sassar"				# where to scan for libraries
4272445Sassar
4372445Sassar# This sed(1) filter is used to convert -lfoo to path/to/libfoo.
4472445Sassar#
4572445SassarSED_FILTER="
4672445Sassarsed -E
4772445Sassar    -e's; ;! ;g'
4872445Sassar    -e's;$;!;'
4972445Sassar    -e's;-lbsdxml!;lib/libexpat;g'
5072445Sassar    -e's;-lpthread!;lib/libthr;g'
5172445Sassar    -e's;-lm!;lib/msun;g'
5272445Sassar    -e's;-l(ncurses|termcap)!;lib/ncurses/ncurses;g'
5390926Snectar    -e's;-l(gcc)!;gnu/lib/lib\1;g'
5490926Snectar    -e's;-lssp_nonshared!;gnu/lib/libssp/libssp_nonshared;g'
5572445Sassar    -e's;-l(asn1|hdb|heimntlm|hx509|krb5|roken)!;kerberos5/lib/lib\1;g'
5672445Sassar    -e's;-l(crypto|ssh|ssl)!;secure/lib/lib\1;g'
5772445Sassar    -e's;-l([^!]+)!;lib/lib\1;g'
5872445Sassar"
5972445Sassar
6072445Sassar# Generate interdependencies between libraries.
6172445Sassar#
6272445Sassargenlibdepends()
6372445Sassar{
6472445Sassar	(
6572445Sassar		cd ${USRSRC}
6672445Sassar		find ${LIBS} -mindepth 1 -name Makefile |
6790926Snectar		xargs grep -l 'bsd\.lib\.mk' |
6872445Sassar		while read makefile; do
6990926Snectar			libdir=$(dirname ${makefile})
7090926Snectar			deps=$(
7172445Sassar				cd ${libdir}
7290926Snectar				make -m ${USRSRC}/share/mk -V LDADD
7372445Sassar			)
7472445Sassar			if [ "${deps}" ]; then
7590926Snectar				echo ${libdir}"${FS}"$(
7690926Snectar					echo ${deps} |
7772445Sassar					eval ${SED_FILTER}
7890926Snectar				)
7990926Snectar			fi
8072445Sassar		done
8172445Sassar	)
8272445Sassar}
8372445Sassar
8490926Snectarmain()
8590926Snectar{
8690926Snectar	if [ ! -f ${LIBDEPENDS} ]; then
8790926Snectar		genlibdepends >${LIBDEPENDS}
8890926Snectar	fi
8990926Snectar
9072445Sassar	prebuild_libs=$(
9172445Sassar		awk -F"${FS}" '{ print $2 }' ${LIBDEPENDS} |rs 0 1 |sort -u
9272445Sassar	)
9372445Sassar	echo "Libraries with dependents:"
9472445Sassar	echo
9572445Sassar	echo ${prebuild_libs} |
9672445Sassar	rs 0 1
9772445Sassar	echo
9872445Sassar
9972445Sassar	echo "List of interdependencies:"
10072445Sassar	echo
10172445Sassar	for lib in ${prebuild_libs}; do
10272445Sassar		grep "^${lib}${FS}" ${LIBDEPENDS} || true
10372445Sassar	done |
10472445Sassar	awk -F"${FS}" '{
10572445Sassar		if ($2 in dependents)
10672445Sassar			dependents[$2]=dependents[$2]" "$1
10772445Sassar		else
10872445Sassar			dependents[$2]=$1
10972445Sassar	}
11072445Sassar	END {
11172445Sassar		for (lib in dependents)
11272445Sassar			print dependents[lib]": " lib
11372445Sassar	}' |
11472445Sassar	sort
11572445Sassar
11672445Sassar	exit 0
11772445Sassar}
11872445Sassar
11972445Sassarmain
12072445Sassar