| #!/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 |
| |