plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

9l (6206B)


      1 #!/bin/sh
      2 
      3 [ "$1" = "" ] && exit 1
      4 
      5 test -f "$PLAN9/config" && . "$PLAN9/config"
      6 libsl=""
      7 frameworks=""
      8 doautolib=true
      9 doautoframework=true
     10 verbose=false
     11 
     12 nmflags=""
     13 extralibs="-lm"
     14 tag="${SYSNAME:-`uname`}"
     15 case "$tag" in
     16 *DragonFly*|*BSD*)
     17 	ld="${CC9:-gcc} $CC9FLAGS"
     18 	userpath=true
     19 	extralibs="$extralibs -lutil"
     20 	;;
     21 *OSF1*)
     22 	ld="${CC9:-cc} $CC9FLAGS"
     23 	userpath=true
     24 	extralibs="$extralibs -lutil"
     25 	nmflags="-B"
     26 	;;
     27 *Linux*)
     28 	ld="${CC9:-gcc} $CC9FLAGS"
     29 	userpath=true
     30 	extralibs="$extralibs -lutil -lresolv -lpthread"
     31 	;;
     32 *Darwin*)
     33 	ld="${CC9:-gcc} -m64 $CC9FLAGS"
     34 	;;
     35 *SunOS*)
     36 	ld="${CC9:-cc} -g $CC9FLAGS"
     37 	extralibs="$extralibs -lrt -lpthread -lsocket -lnsl"
     38 	# Record paths to shared libraries to avoid needing LD_LIBRARY_PATH
     39 	for i in "$libsl $@"
     40 	do
     41 		case "$i" in
     42 		-L*)
     43 			s=`echo $i | sed 's/-L/-R/'`
     44 			extralibs="$extralibs $s"
     45 			;;
     46 		esac
     47 	done
     48 	case "${SYSVERSION:-`uname -r`}" in
     49 	5.[67])
     50 		echo do not know how to link right thread library on "$tag" 1>&2
     51 		;;
     52 	5.8)
     53 		# Some trickery is needed to force use of
     54 		# alternate thread lib from /usr/lib/lwp
     55 		# Likely, this only works with sun cc,
     56 		# for other compiler/loader we would need other flags.
     57 		ld="$ld -i"
     58 		extralibs="$extralibs /usr/lib/lwp/libthread.so -R/usr/lib/lwp:/usr/lib"
     59 		;;
     60 	esac
     61 	;;
     62 *AIX*)
     63 	ld="${CC9:-xlc_r} $CC9FLAGS"
     64 	nmflags="-A -B"
     65 	;;
     66 *)
     67 	echo do not know how to link on "$tag" 1>&2
     68 	exit 1
     69 esac
     70 
     71 if [ "x$1" = "x-l" ]
     72 then
     73 	shift
     74 	doautolib=false
     75 	doautoframework=false
     76 elif [ "x$1" = "x-v" ]
     77 then
     78 	shift
     79 	verbose=true
     80 fi
     81 
     82 target=a.out
     83 if [ "x$1" = "x-o" ]
     84 then
     85 	target=$2
     86 fi
     87 
     88 if $doautolib
     89 then
     90 	ofiles=""
     91 	lpaths="$PLAN9/lib"
     92 	for i
     93 	do
     94 		case "$i" in
     95 		*.[ao])
     96 			ofiles="$ofiles $i"
     97 			;;
     98 		-L*)
     99 			l=`echo $i | sed 's/-L//'`
    100 			lpaths="$lpaths $l"
    101 		esac
    102 	done
    103 
    104 	if $verbose
    105 	then
    106 		echo "ofiles $ofiles"
    107 		echo "lpaths $lpaths"
    108 	fi
    109 
    110 	autolibs=""
    111 	if [ "x$ofiles" != "x" ]
    112 	then
    113 		a=`
    114 			nm $nmflags $ofiles |
    115 			grep '__p9l_autolib_[a-zA-Z0-9+-]*' |
    116 			sed 's/.*__p9l_autolib_//; s/:.*//' |
    117 			sort -u
    118 		`
    119 		for i in $a
    120 		do
    121 			autolibs="$autolibs $i"
    122 			eval "need$i=true"
    123 		done
    124 	fi
    125 	if $verbose
    126 	then
    127 		echo "autolibs1 $autolibs"
    128 	fi
    129 
    130 	# fetch dependencies out of libraries
    131 	workq="$autolibs"
    132 	while [ "x$workq" != "x" ]
    133 	do
    134 		w="$workq"
    135 		workq=""
    136 		for i in $w
    137 		do
    138 			# can't trust the libraries about using
    139 			# libthread or libdraw - we might not be linking with
    140 			# those object files.
    141 			a=""
    142 			for lpath in $lpaths
    143 			do
    144 				b=`
    145 					nm $lpath/lib$i.a 2>/dev/null |
    146 					grep '__p9l_autolib_[a-zA-Z0-9+-]*' |
    147 					sed 's/.*__p9l_autolib_//; s/:.*//' |
    148 					sort -u |
    149 					egrep -v '^(thread|draw)$'
    150 				`
    151 				a="$a $b"
    152 			done
    153 			# fix up libraries that really need draw
    154 			if [ "x$i" = "xmemdraw" -o "x$i" = "xmemlayer" -o "x$i" = "xframe" ]
    155 			then
    156 				a="$a draw"
    157 			fi
    158 			okayfn="true"
    159 			for j in $a
    160 			do
    161 				if eval "[ x\$need$j = x ]"
    162 				then
    163 					autolibs="$autolibs $j"
    164 					workq="$workq $j"
    165 					eval "need$j=true"
    166 				fi
    167 				if [ $j != $i ]
    168 				then
    169 					okayfn="$okayfn && have$j"
    170 				fi
    171 			done
    172 			if $verbose
    173 			then
    174 				echo "can$i: $okayfn"
    175 			fi
    176 			eval "can$i() { $okayfn; }"
    177 		done
    178 	done
    179 	if $verbose
    180 	then
    181 		echo "autolibs $autolibs"
    182 	fi
    183 
    184 	for i in $autolibs
    185 	do
    186 		eval "have$i() { false; }"
    187 	done
    188 	havethread() { false; }
    189 	havesec() { false; }
    190 	canmemlayer() { havedraw; }
    191 
    192 	# now find correct order
    193 	libsl=""
    194 	while [ "x$autolibs" != x ]
    195 	do
    196 		stillneed=""
    197 		didnothing=true
    198 		for i in $autolibs
    199 		do
    200 			if eval "can$i"
    201 			then
    202 				libsl="-l$i $libsl"
    203 				eval "have$i() { true; }"
    204 				didnothing=false
    205 			else
    206 				stillneed="$stillneed $i"
    207 			fi
    208 		done
    209 		# break cycle by setting the last library on the list
    210 		# to have no dependencies
    211 		if $didnothing
    212 		then
    213 			j="xxx"
    214 			for i in $autolibs
    215 			do
    216 				j=$i
    217 			done
    218 			echo "dependency cycle: $autolibs; breaking with $j"
    219 			eval "can$j() { true; }"
    220 		fi
    221 		autolibs="$stillneed"
    222 	done
    223 	if $verbose
    224 	then
    225 		echo "liborder $libsl"
    226 	fi
    227 	libsl="$libsl -l9"
    228 
    229 	# cycle: lib9 expects p9main, which is defined in libthread.  oops.
    230 	if havethread
    231 	then
    232 		libsl="$libsl -lthread -l9"
    233 	fi
    234 
    235 	# cycle: lib9 netcrypt uses libsec
    236 	if havesec
    237 	then
    238 		libsl="$libsl -lsec -l9"
    239 	fi
    240 
    241 	if [ "x$needndb" = xtrue -a '(' -f /usr/lib/libresolv.a -o -f /usr/lib/libresolv.dylib ')' ]
    242 	then
    243 		libsl="$libsl -lresolv"
    244 	fi
    245 
    246 	if [ "x$needX11" = xtrue -a "x$WSYSTYPE" != xnowsys ]
    247 	then
    248 		if [ "x$X11" = "x" ]
    249 		then
    250 			X11=/usr/X11R6
    251 		fi
    252 		# Don't say -L with a non-existent directory: Xcode complains.
    253 		# x86_64 seems to put its 64-bit libraries in lib64.
    254 		if [ "`uname -m`" = "x86_64" -a -d "$X11/lib64" ]
    255 		then
    256 			libsl="$libsl -L$X11/lib64"
    257 		fi
    258 		if [ -d "$X11/lib" ]
    259 		then
    260 			libsl="$libsl -L$X11/lib"
    261 		fi
    262 		libsl="$libsl -lX11"
    263 	fi
    264 fi
    265 if $doautoframework
    266 then
    267 	ofiles=""
    268 	for i
    269 	do
    270 		case "$i" in
    271 		*.[ao])
    272 			ofiles="$ofiles $i"
    273 			;;
    274 		esac
    275 	done
    276 
    277 	# echo "ofiles $ofiles"
    278 	autoframeworks=""
    279 	if [ "x$ofiles" != "x" ]
    280 	then
    281 		a=`
    282 			nm $ofiles |
    283 			grep '__p9l_autoframework_[a-zA-Z0-9+-]*$' |
    284 			sed 's/.*__p9l_autoframework_//' |
    285 			sort -u
    286 		`
    287 		for i in $a
    288 		do
    289 			autoframeworks="$autoframeworks $i"
    290 			eval "need$i=true"
    291 		done
    292 	fi
    293 
    294 	if $verbose
    295 	then
    296 		echo "autoframeworks $autoframeworks"
    297 	fi
    298 
    299 	for i in $autoframeworks
    300 	do
    301 		eval "have$i() { false; }"
    302 	done
    303 
    304 	frameworks=""
    305 	for i in $autoframeworks
    306 	do
    307 		frameworks="-framework $i $frameworks"
    308 	done
    309 fi
    310 
    311 case "$userpath" in
    312 true)
    313 	for i in "$libsl $@"
    314 	do
    315 		case "$i" in
    316 		-L*)
    317 			s=`echo $i | sed 's/-L/-Wl,-rpath,/'`
    318 			extralibs="$extralibs $s"
    319 			;;
    320 		esac
    321 	done
    322 	;;
    323 esac
    324 
    325 if $verbose
    326 then
    327 	echo $ld -L"$PLAN9/lib" "$@" $libsl $extralibs $frameworks
    328 fi
    329 
    330 quiet()
    331 {
    332 	ignore='^$'
    333 	ignore=$ignore'|is (often|almost always) misused'
    334 	ignore=$ignore'|is dangerous, better use'
    335 	ignore=$ignore'|text-based stub'
    336 	# macOS linker is incessant about reoccurring -l9, -lsec, -lthread:
    337 	ignore=$ignore'|ld: warning: ignoring duplicate libraries:'
    338 
    339 	sed 's/.*: In function `[^:]*: *//' "$1" |
    340 	egrep -v "$ignore"
    341 }
    342 
    343 # Must use temp file to avoid pipe; pipe loses status.
    344 xtmp=${TMPDIR-/tmp}/9l.$$.$USER.out
    345 $ld -L"$PLAN9/lib" "$@" $libsl $extralibs $frameworks >"$xtmp" 2>&1
    346 status=$?
    347 quiet "$xtmp"
    348 rm -f "$xtmp"
    349 if [ "$status" -ne 0 ]
    350 then
    351 	rm -f "$target"
    352 fi
    353 exit $status