| #!/bin/sh |
| |
| test -f $PLAN9/config && . $PLAN9/config |
| libsl="" |
| frameworks="" |
| doautolib=true |
| doautoframework=true |
| verbose=false |
| |
| nmflags="" |
| extralibs="-lm" |
| tag="${SYSNAME:-`uname`}-${OBJTYPE:-`uname -m`}" |
| case "$tag" in |
| *FreeBSD*) |
| ld=${CC9:-gcc} |
| userpath=true |
| extralibs="$extralibs -lutil" |
| case "`uname -r`" in |
| 5.2.*) |
| extralibs="$extralibs -lkse" |
| ;; |
| [5-9].*) |
| extralibs="$extralibs -lpthread" |
| ;; |
| esac |
| ;; |
| *DragonFly*|*BSD*) |
| ld=${CC9:-gcc} |
| userpath=true |
| extralibs="$extralibs -lutil" |
| ;; |
| *OSF1*) |
| ld=${CC9:-cc} |
| userpath=true |
| extralibs="$extralibs -lutil" |
| nmflags="-B" |
| ;; |
| *Linux*) |
| ld=${CC9:-gcc} |
| userpath=true |
| extralibs="$extralibs -lutil -lresolv" |
| case "${SYSVERSION:-`uname -r`}" in |
| 2.6.* | 3.*) |
| extralibs="$extralibs -lpthread" |
| ;; |
| esac |
| ;; |
| *Darwin*x86_64*) |
| ld="${CC9:-gcc} -m64" |
| ;; |
| *Darwin*) |
| ld="${CC9:-gcc} -m32" |
| ;; |
| *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 "$libsl $@" |
| do |
| case "$i" in |
| -L*) |
| s=`echo $i | sed 's/-L/-R/'` |
| extralibs="$extralibs $s" |
| ;; |
| esac |
| done |
| case "${SYSVERSION:-`uname -r`}" in |
| 5.[67]) |
| echo do not know how to link right thread library on "$tag" 1>&2 |
| ;; |
| 5.8) |
| # Some trickery is needed to force use of |
| # alternate thread lib from /usr/lib/lwp |
| # Likely, this only works with sun cc, |
| # for other compiler/loader we would need other flags. |
| ld="$ld -i" |
| extralibs="$extralibs /usr/lib/lwp/libthread.so -R/usr/lib/lwp:/usr/lib" |
| ;; |
| esac |
| ;; |
| *AIX*) |
| ld=${CC9:-gcc} |
| nmflags="-B" |
| ;; |
| *) |
| echo do not know how to link on "$tag" 1>&2 |
| exit 1 |
| esac |
| |
| if [ "x$1" = "x-l" ] |
| then |
| shift |
| doautolib=false |
| doautoframework=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="" |
| lpaths="$PLAN9/lib" |
| for i |
| do |
| case "$i" in |
| *.[ao]) |
| ofiles="$ofiles $i" |
| ;; |
| -L*) |
| l=`echo $i | sed 's/-L//'` |
| lpaths="$lpaths $l" |
| esac |
| done |
| |
| if $verbose |
| then |
| echo "ofiles $ofiles" |
| echo "lpaths $lpaths" |
| fi |
| |
| autolibs="" |
| if [ "x$ofiles" != "x" ] |
| then |
| a=` |
| nm $nmflags $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 |
| if $verbose |
| then |
| echo "autolibs1 $autolibs" |
| fi |
| |
| # fetch dependencies out of libraries |
| workq="$autolibs" |
| while [ "x$workq" != "x" ] |
| do |
| w="$workq" |
| workq="" |
| for i in $w |
| do |
| # can't trust the libraries about using |
| # libthread or libdraw - we might not be linking with |
| # those object files. |
| a="" |
| for lpath in $lpaths |
| do |
| b=` |
| nm $lpath/lib$i.a 2>/dev/null | |
| grep '__p9l_autolib_[a-zA-Z0-9+-]*$' | |
| sed 's/.*__p9l_autolib_//' | |
| sort -u | |
| egrep -v '^(thread|draw)$' |
| ` |
| a="$a $b" |
| done |
| # fix up libraries that really need draw |
| if [ "x$i" = "xmemdraw" -o "x$i" = "xmemlayer" -o "x$i" = "xframe" ] |
| then |
| a="$a draw" |
| fi |
| 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 |
| if $verbose |
| then |
| echo "can$i: $okayfn" |
| fi |
| 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; } |
| havesec() { false; } |
| canmemlayer() { havedraw; } |
| |
| # 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 -l9" |
| fi |
| |
| # cycle: lib9 netcrypt uses libsec |
| if havesec |
| then |
| libsl="$libsl -lsec -l9" |
| fi |
| |
| if [ "x$needndb" = xtrue -a '(' -f /usr/lib/libresolv.a -o -f /usr/lib/libresolv.dylib ')' ] |
| then |
| libsl="$libsl -lresolv" |
| fi |
| |
| if [ "x$needX11" = xtrue -a "x$WSYSTYPE" != xnowsys ] |
| then |
| if [ "x$X11" = "x" ] |
| then |
| X11=/usr/X11R6 |
| fi |
| # Don't say -L with a non-existent directory: Xcode complains. |
| # x86_64 seems to put its 64-bit libraries in lib64. |
| if [ "${OBJTYPE:-`uname -m`}" = "x86_64" -a -d "$X11/lib64" ] |
| then |
| libsl="$libsl -L$X11/lib64" |
| fi |
| if [ -d "$X11/lib" ] |
| then |
| libsl="$libsl -L$X11/lib" |
| fi |
| libsl="$libsl -lX11" |
| fi |
| fi |
| if $doautoframework |
| then |
| ofiles="" |
| for i |
| do |
| case "$i" in |
| *.[ao]) |
| ofiles="$ofiles $i" |
| ;; |
| esac |
| done |
| |
| # echo "ofiles $ofiles" |
| autoframeworks="" |
| if [ "x$ofiles" != "x" ] |
| then |
| a=` |
| nm $ofiles | |
| grep '__p9l_autoframework_[a-zA-Z0-9+-]*$' | |
| sed 's/.*__p9l_autoframework_//' | |
| sort -u |
| ` |
| for i in $a |
| do |
| autoframeworks="$autoframeworks $i" |
| eval "need$i=true" |
| done |
| fi |
| |
| if $verbose |
| then |
| echo "autoframeworks $autoframeworks" |
| fi |
| |
| for i in $autoframeworks |
| do |
| eval "have$i() { false; }" |
| done |
| |
| frameworks="" |
| for i in $autoframeworks |
| do |
| frameworks="-framework $i $frameworks" |
| done |
| fi |
| |
| case "$userpath" in |
| true) |
| for i in "$libsl $@" |
| do |
| case "$i" in |
| -L*) |
| s=`echo $i | sed 's/-L/-Wl,-rpath,/'` |
| extralibs="$extralibs $s" |
| ;; |
| esac |
| done |
| ;; |
| esac |
| |
| if $verbose |
| then |
| echo $ld -L$PLAN9/lib "$@" $libsl $extralibs $frameworks |
| fi |
| |
| xtmp=/tmp/9l.$$.$USER.out |
| xxout() { |
| sed 's/.*: In function `[^:]*: *//' $xtmp | egrep . | |
| egrep -v 'is (often|almost always) misused|is dangerous, better use' |
| rm -f $xtmp |
| } |
| |
| if $ld -L$PLAN9/lib "$@" $libsl $extralibs $frameworks >$xtmp 2>&1 |
| then |
| xxout |
| exit 0 |
| else |
| xxout |
| rm -f $target |
| exit 1 |
| fi |
| |