mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
211 lines
3.1 KiB
Bash
Executable file
211 lines
3.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
libsl=""
|
|
|
|
doautolib=true
|
|
verbose=false
|
|
|
|
if [ "x$1" = "x-l" ]
|
|
then
|
|
shift
|
|
doautolib=false
|
|
elif [ "x$1" = "x-v" ]
|
|
then
|
|
shift
|
|
verbose=true
|
|
fi
|
|
|
|
target=a.out
|
|
if [ "x$1" = "x-o" ]
|
|
then
|
|
target=$2
|
|
fi
|
|
|
|
if $doautolib
|
|
then
|
|
ofiles=""
|
|
for i
|
|
do
|
|
case "$i" in
|
|
*.o)
|
|
ofiles="$ofiles $i"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# echo "ofiles $ofiles"
|
|
autolibs=""
|
|
if [ "x$ofiles" != "x" ]
|
|
then
|
|
a=`
|
|
nm $ofiles |
|
|
grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
|
|
sed 's/.*__p9l_autolib_//' |
|
|
sort -u
|
|
`
|
|
for i in $a
|
|
do
|
|
autolibs="$autolibs $i"
|
|
eval "need$i=true"
|
|
done
|
|
fi
|
|
|
|
# fetch dependencies out of libraries
|
|
workq="$autolibs"
|
|
while [ "x$workq" != "x" ]
|
|
do
|
|
w="$workq"
|
|
workq=""
|
|
for i in $w
|
|
do
|
|
a=`
|
|
nm $PLAN9/lib/lib$i.a |
|
|
grep '__p9l_autolib_[a-zA-Z0-9+-]*$' |
|
|
sed 's/.*__p9l_autolib_//' |
|
|
sort -u
|
|
`
|
|
okayfn="true"
|
|
for j in $a
|
|
do
|
|
if eval "[ x\$need$j = x ]"
|
|
then
|
|
autolibs="$autolibs $j"
|
|
workq="$workq $j"
|
|
eval "need$j=true"
|
|
fi
|
|
if [ $j != $i ]
|
|
then
|
|
okayfn="$okayfn && have$j"
|
|
fi
|
|
done
|
|
# echo "can$i: $okayfn"
|
|
eval "can$i() { $okayfn; }"
|
|
done
|
|
done
|
|
if $verbose
|
|
then
|
|
echo "autolibs $autolibs"
|
|
fi
|
|
|
|
for i in $autolibs
|
|
do
|
|
eval "have$i() { false; }"
|
|
done
|
|
havethread() { false; }
|
|
|
|
# now find correct order
|
|
libsl=""
|
|
while [ "x$autolibs" != x ]
|
|
do
|
|
stillneed=""
|
|
didnothing=true
|
|
for i in $autolibs
|
|
do
|
|
if eval "can$i"
|
|
then
|
|
libsl="-l$i $libsl"
|
|
eval "have$i() { true; }"
|
|
didnothing=false
|
|
else
|
|
stillneed="$stillneed $i"
|
|
fi
|
|
done
|
|
# break cycle by setting the last library on the list
|
|
# to have no dependencies
|
|
if $didnothing
|
|
then
|
|
j="xxx"
|
|
for i in $autolibs
|
|
do
|
|
j=$i
|
|
done
|
|
echo "dependency cycle: $autolibs; breaking with $j"
|
|
eval "can$j() { true; }"
|
|
fi
|
|
autolibs="$stillneed"
|
|
done
|
|
if $verbose
|
|
then
|
|
echo "liborder $libsl"
|
|
fi
|
|
libsl="$libsl -l9"
|
|
|
|
# cycle: lib9 expects p9main, which is defined in libthread. oops.
|
|
if $havethread
|
|
then
|
|
libsl="$libsl -lthread"
|
|
fi
|
|
|
|
if [ "x$needdraw" = xtrue ]
|
|
then
|
|
if [ "x$X11" = "x" ]
|
|
then
|
|
X11=/usr/X11R6
|
|
fi
|
|
libsl="$libsl -L$X11/lib -lX11"
|
|
fi
|
|
fi
|
|
|
|
extralibs="-lm"
|
|
tag="${SYSNAME:-`uname`}-${OBJTYPE:-`uname -m`}"
|
|
case "$tag" in
|
|
*OpenBSD*)
|
|
ld=gcc
|
|
extralibs="$extralibs -lutil -lpthread"
|
|
;;
|
|
*FreeBSD*)
|
|
ld=gcc
|
|
extralibs="$extralibs -lutil"
|
|
case "`uname -r`" in
|
|
[5-9].*)
|
|
extralibs="$extralibs -lpthread"
|
|
;;
|
|
esac
|
|
;;
|
|
*BSD*)
|
|
ld=gcc
|
|
extralibs="$extralibs -lutil"
|
|
;;
|
|
*Linux*)
|
|
ld=gcc
|
|
extralibs="$extralibs -lutil"
|
|
case "`uname -r`" in
|
|
2.6.*)
|
|
extralibs="$extralibs -lpthread"
|
|
;;
|
|
esac
|
|
;;
|
|
*Darwin*)
|
|
ld=gcc
|
|
;;
|
|
*SunOS*)
|
|
ld="${CC9:-cc} -g"
|
|
extralibs="$extralibs -lrt -lpthread -lsocket -lnsl"
|
|
# Record paths to shared libraries to avoid needing LD_LIBRARY_PATH
|
|
for i in "$@"
|
|
do
|
|
case "$i" in
|
|
-L*)
|
|
s=`echo $i | sed 's/-L/-R/'`
|
|
extralibs="$extralibs $s"
|
|
;;
|
|
esac
|
|
done
|
|
;;
|
|
*)
|
|
echo do not know how to link on "$tag" 1>&2
|
|
exit 1
|
|
esac
|
|
|
|
if $verbose
|
|
then
|
|
echo $ld -L$PLAN9/lib "$@" $libsl $extralibs
|
|
fi
|
|
if $ld -L$PLAN9/lib "$@" $libsl $extralibs
|
|
then
|
|
exit 0
|
|
else
|
|
rm -f $target
|
|
exit 1
|
|
fi
|
|
|