xref: /netbsd-src/usr.bin/rump_wmd/rump_wmd.sh (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1#!/bin/sh
2#
3#	$NetBSD: rump_wmd.sh,v 1.4 2014/01/28 13:58:25 pooka Exp $
4#
5# Copyright (c) 2014 Antti Kantee <pooka@iki.fi>
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19# DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26# SUCH DAMAGE.
27#
28
29: ${CC:=cc}
30DEBUGLEVEL=0
31LIBDIR=/usr/lib
32
33die ()
34{
35
36	echo $* >&2
37	exit 1
38}
39
40usage ()
41{
42
43	die "Usage: $0 [-hv] [-L libdir] -lrump_component [...]"
44}
45
46unset FIRSTLIB
47while getopts 'hl:L:v' opt; do
48	case "${opt}" in
49	l)
50		: ${FIRSTLIB:=${OPTIND}}
51		;;
52	L)
53		[ -z "${FIRSTLIB}" ] || usage
54		LIBDIR=${OPTARG}
55		;;
56	v)
57		[ -z "${FIRSTLIB}" ] || usage
58		DEBUGLEVEL=$((DEBUGLEVEL + 1))
59		;;
60	-h|*)
61		usage
62		;;
63	esac
64done
65[ -z "${FIRSTLIB}" ] && usage
66shift $((${FIRSTLIB} - 2))
67[ $# -eq 0 ] && usage
68
69debug ()
70{
71
72	[ ${DEBUGLEVEL} -ge ${1} ] && \
73	    { lvl=$1; shift; echo DEBUG${lvl}: $* >&2; }
74}
75
76# filters from list
77filter ()
78{
79
80	filtee=$1
81	vname=$2
82	tmplist=''
83	found=false
84	for x in $(eval echo \${${vname}}); do
85		if [ "${filtee}" = "${x}" ]; then
86			found=true
87		else
88			tmplist="${tmplist} ${x}"
89		fi
90	done
91	${found} || die \"${1}\" not found in \$${2}
92
93	eval ${vname}="\${tmplist}"
94}
95
96SEEDPROG='int rump_init(void); int main() { rump_init(); }'
97CCPARAMS='-Wl,--no-as-needed -o /dev/null -x c -'
98
99# sanity-check
100for lib in $* ; do
101	[ "${lib#-l}" = "${lib}" -o -z "${lib#-l}" ] \
102	    && die Param \"${lib}\" is not of format -llib
103done
104
105# starting set and available components
106WANTEDCOMP="$*"
107RUMPBASE='-lrump -lrumpuser'
108CURCOMP="${WANTEDCOMP}"
109NEEDEDCOMP=''
110ALLCOMP=$(ls ${LIBDIR} 2>/dev/null \
111    | sed -n '/^librump.*.so$/{s/lib/-l/;s/\.so//p;}')
112[ -z "${ALLCOMP}" ] && die No rump kernel components in \"${LIBDIR}\"
113
114# filter out ones we'll definitely not use
115for f in ${CURCOMP} -lrumphijack -lrumpclient; do
116	filter ${f} ALLCOMP
117done
118
119# put the factions first so that they'll be tried first.
120# this is an optimization to minimize link attempts.
121FACTIONS='-lrumpvfs -lrumpnet -lrumpdev'
122for f in ${FACTIONS}; do
123	filter ${f} ALLCOMP
124done
125ALLCOMP="${FACTIONS} ${ALLCOMP}"
126
127debug 0 Searching component combinations.  This may take a while ...
128while :; do
129	debug 1 Current components: ${CURCOMP}
130
131	IFS=' '
132	out=$(echo ${SEEDPROG} \
133	    | ${CC} -L${LIBDIR} ${CCPARAMS} ${CURCOMP} ${RUMPBASE} 2>&1)
134	[ -z "${out}" ] && break
135	undef=$(echo ${out} \
136	    | sed -n '/undefined reference to/{s/.*`//;s/.$//p;q;}')
137	[ -z "${undef}" ] && break
138
139	debug 1 Trying to find ${undef}
140	for attempt in ${ALLCOMP}; do
141		debug 2 Component attempt: ${attempt}
142		unset IFS
143		nowundef=$(echo ${SEEDPROG}				\
144		    | ${CC} -L${LIBDIR} ${CCPARAMS}			\
145		      ${attempt} ${CURCOMP} ${RUMPBASE} 2>&1		\
146		    | sed -n '/undefined reference to/{s/.*`//;s/.$//p;}')
147		for one in ${nowundef}; do
148			[ "${one}" = "${undef}" ] && continue 2
149		done
150		CURCOMP="${attempt} ${CURCOMP}"
151		filter ${attempt} ALLCOMP
152		debug 1 Found ${undef} from ${attempt}
153		continue 2
154	done
155	die Internal error: unreachable statement
156done
157
158[ ! -z "${out}" ] && { echo 'ERROR:' >&2 ; echo ${out} >&2 ; exit 1 ; }
159debug 0 Found a set
160echo ${CURCOMP}
161exit 0
162