xref: /openbsd/gnu/usr.bin/perl/hints/solaris_2.sh (revision db3296cf)
1# hints/solaris_2.sh
2# Last modified: Mon Jan 29 12:52:28 2001
3# Lupe Christoph <lupe@lupe-christoph.de>
4# Based on version by:
5# Andy Dougherty  <doughera@lafayette.edu>
6# Which was based on input from lots of folks, especially
7# Dean Roehrich <roehrich@ironwood-fddi.cray.com>
8# Additional input from Alan Burlison, Jarkko Hietaniemi,
9# and Richard Soderberg.
10#
11# See README.solaris for additional information.
12#
13# For consistency with gcc, we do not adopt Sun Marketing's
14# removal of the '2.' prefix from the Solaris version number.
15# (Configure tries to detect an old fixincludes and needs
16# this information.)
17
18# If perl fails tests that involve dynamic loading of extensions, and
19# you are using gcc, be sure that you are NOT using GNU as and ld.  One
20# way to do that is to invoke Configure with
21#
22#     sh Configure -Dcc='gcc -B/usr/ccs/bin/'
23#
24#  (Note that the trailing slash is *required*.)
25#  gcc will occasionally emit warnings about "unused prefix", but
26#  these ought to be harmless.  See below for more details.
27
28# See man vfork.
29usevfork=${usevfork:-false}
30
31# Solaris has secure SUID scripts
32d_suidsafe=${d_suidsafe:-define}
33
34# Several people reported problems with perl's malloc, especially
35# when use64bitall is defined or when using gcc.
36#     http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-01/msg01318.html
37#     http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-01/msg00465.html
38usemymalloc=${usemymalloc:-false}
39
40# Avoid all libraries in /usr/ucblib.
41# /lib is just a symlink to /usr/lib
42set `echo $glibpth | sed -e 's@/usr/ucblib@@' -e 's@ /lib @ @'`
43glibpth="$*"
44
45# Remove unwanted libraries.  -lucb contains incompatible routines.
46# -lld and -lsec don't do anything useful. -lcrypt does not
47# really provide anything we need over -lc, so we drop it, too.
48# -lmalloc can cause a problem with GNU CC & Solaris.  Specifically,
49# libmalloc.a may allocate memory that is only 4 byte aligned, but
50# GNU CC on the Sparc assumes that doubles are 8 byte aligned.
51# Thanks to  Hallvard B. Furuseth <h.b.furuseth@usit.uio.no>
52set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ malloc @ @' -e 's@ ucb @ @' -e 's@ sec @ @' -e 's@ crypt @ @'`
53libswanted="$*"
54
55# Look for architecture name.  We want to suggest a useful default.
56case "$archname" in
57'')
58    if test -f /usr/bin/arch; then
59        archname=`/usr/bin/arch`
60    	archname="${archname}-${osname}"
61    elif test -f /usr/ucb/arch; then
62        archname=`/usr/ucb/arch`
63    	archname="${archname}-${osname}"
64    fi
65    ;;
66esac
67
68cat > UU/workshoplibpth.cbu << 'EOCBU'
69# This script UU/workshoplibpth.cbu will get 'called-back'
70# by other CBUs this script creates.
71case "$workshoplibpth_done" in
72    '')	if test `uname -p` = "sparc"; then
73	case "$use64bitall" in
74	    "$define"|true|[yY]*)
75		# add SPARC-specific 64 bit libraries
76		loclibpth="$loclibpth /usr/lib/sparcv9"
77		if test -n "$workshoplibs"; then
78		    loclibpth=`echo $loclibpth | sed -e "s% $workshoplibs%%" `
79		    for lib in $workshoplibs; do
80			# Logically, it should be sparcv9.
81			# But the reality fights back, it's v9.
82			loclibpth="$loclibpth $lib/sparcv9 $lib/v9"
83		    done
84		fi
85	    ;;
86	*)  loclibpth="$loclibpth $workshoplibs"
87	    ;;
88	esac
89	else
90	    loclibpth="$loclibpth $workshoplibs"
91	fi
92	workshoplibpth_done="$define"
93	;;
94esac
95EOCBU
96
97case "$cc" in
98'')	if test -f /opt/SUNWspro/bin/cc; then
99		cc=/opt/SUNWspro/bin/cc
100		cat <<EOF >&4	
101
102You specified no cc but you seem to have the Workshop compiler
103($cc) installed, using that.
104If you want something else, specify that in the command line,
105e.g. Configure -Dcc=gcc
106
107EOF
108	fi
109	;;
110esac
111
112######################################################
113# General sanity testing.  See below for excerpts from the Solaris FAQ.
114#
115# From roehrich@ironwood-fddi.cray.com Wed Sep 27 12:51:46 1995
116# Date: Thu, 7 Sep 1995 16:31:40 -0500
117# From: Dean Roehrich <roehrich@ironwood-fddi.cray.com>
118# To: perl5-porters@africa.nicoh.com
119# Subject: Re: On perl5/solaris/gcc
120#
121# Here's another draft of the perl5/solaris/gcc sanity-checker.
122
123case `type ${cc:-cc}` in
124*/usr/ucb/cc*) cat <<END >&4
125
126NOTE:  Some people have reported problems with /usr/ucb/cc.
127If you have difficulties, please make sure the directory
128containing your C compiler is before /usr/ucb in your PATH.
129
130END
131;;
132esac
133
134
135# Check that /dev/fd is mounted.  If it is not mounted, let the
136# user know that suid scripts may not work.
137df /dev/fd 2>&1 > /dev/null
138case $? in
1390) ;;
140*)
141	cat <<END >&4
142
143NOTE: Your system does not have /dev/fd mounted.  If you want to
144be able to use set-uid scripts you must ask your system administrator
145to mount /dev/fd.
146
147END
148	;;
149esac
150
151
152# See if libucb can be found in /usr/lib.  If it is, warn the user
153# that this may cause problems while building Perl extensions.
154/usr/bin/ls /usr/lib/libucb* >/dev/null 2>&1
155case $? in
1560)
157	cat <<END >&4
158
159NOTE: libucb has been found in /usr/lib.  libucb should reside in
160/usr/ucblib.  You may have trouble while building Perl extensions.
161
162END
163;;
164esac
165
166# Use shell built-in 'type' command instead of /usr/bin/which to
167# avoid possible csh start-up problems and also to use the same shell
168# we'll be using to Configure and make perl.
169# The path name is the last field in the output, but the type command
170# has an annoying array of possible outputs, e.g.:
171#	make is hashed (/opt/gnu/bin/make)
172# 	cc is /usr/ucb/cc
173#	foo not found
174# use a command like type make | awk '{print $NF}' | sed 's/[()]//g'
175
176# See if make(1) is GNU make(1).
177# If it is, make sure the setgid bit is not set.
178make -v > make.vers 2>&1
179if grep GNU make.vers > /dev/null 2>&1; then
180    tmp=`type make | awk '{print $NF}' | sed 's/[()]//g'`
181    case "`/usr/bin/ls -lL $tmp`" in
182    ??????s*)
183	    cat <<END >&2
184
185NOTE: Your PATH points to GNU make, and your GNU make has the set-group-id
186bit set.  You must either rearrange your PATH to put /usr/ccs/bin before the
187GNU utilities or you must ask your system administrator to disable the
188set-group-id bit on GNU make.
189
190END
191	    ;;
192    esac
193fi
194rm -f make.vers
195
196cat > UU/cc.cbu <<'EOCBU'
197# This script UU/cc.cbu will get 'called-back' by Configure after it
198# has prompted the user for the C compiler to use.
199
200# If the C compiler is gcc:
201#   - check the fixed-includes
202#   - check as(1) and ld(1), they should not be GNU
203#	(GNU as and ld 2.8.1 and later are reportedly ok, however.)
204# If the C compiler is not gcc:
205#   - Check if it is the Workshop/Forte compiler.
206#     If it is, prepare for 64 bit and long doubles.
207#   - check as(1) and ld(1), they should not be GNU
208#	(GNU as and ld 2.8.1 and later are reportedly ok, however.)
209#
210# Watch out in case they have not set $cc.
211
212# Perl compiled with some combinations of GNU as and ld may not
213# be able to perform dynamic loading of extensions.  If you have a
214# problem with dynamic loading, be sure that you are using the Solaris
215# /usr/ccs/bin/as and /usr/ccs/bin/ld.  You can do that with
216#  		sh Configure -Dcc='gcc -B/usr/ccs/bin/'
217# (note the trailing slash is required).
218# Combinations that are known to work with the following hints:
219#
220#  gcc-2.7.2, GNU as 2.7, GNU ld 2.7
221#  egcs-1.0.3, GNU as 2.9.1 and GNU ld 2.9.1
222#	--Andy Dougherty  <doughera@lafayette.edu>
223#	Tue Apr 13 17:19:43 EDT 1999
224
225# Get gcc to share its secrets.
226echo 'main() { return 0; }' > try.c
227	# Indent to avoid propagation to config.sh
228	verbose=`${cc:-cc} -v -o try try.c 2>&1`
229
230if echo "$verbose" | grep '^Reading specs from' >/dev/null 2>&1; then
231	#
232	# Using gcc.
233	#
234
235	# See if as(1) is GNU as(1).  GNU as(1) might not work for this job.
236	if echo "$verbose" | grep ' /usr/ccs/bin/as ' >/dev/null 2>&1; then
237	    :
238	else
239	    cat <<END >&2
240
241NOTE: You are using GNU as(1).  GNU as(1) might not build Perl.  If you
242have trouble, you can use /usr/ccs/bin/as by including -B/usr/ccs/bin/
243in your ${cc:-cc} command.  (Note that the trailing "/" is required.)
244
245END
246	    # Apparently not needed, at least for as 2.7 and later.
247	    # cc="${cc:-cc} -B/usr/ccs/bin/"
248	fi
249
250	# See if ld(1) is GNU ld(1).  GNU ld(1) might not work for this job.
251	# Recompute $verbose since we may have just changed $cc.
252	verbose=`${cc:-cc} -v -o try try.c 2>&1 | grep ld 2>&1`
253
254	if echo "$verbose" | grep ' /usr/ccs/bin/ld ' >/dev/null 2>&1; then
255	    # Ok, gcc directly calls the Solaris /usr/ccs/bin/ld.
256	    :
257	elif echo "$verbose" | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
258	    # Hmm.  gcc doesn't call /usr/ccs/bin/ld directly, but it
259	    # does appear to be using it eventually.  egcs-1.0.3's ld
260	    # wrapper does this.
261	    # All Solaris versions of ld I've seen contain the magic
262	    # string used in the grep.
263	    :
264	else
265	    # No evidence yet of /usr/ccs/bin/ld.  Some versions
266	    # of egcs's ld wrapper call /usr/ccs/bin/ld in turn but
267	    # apparently don't reveal that unless you pass in -V.
268	    # (This may all depend on local configurations too.)
269
270	    # Recompute verbose with -Wl,-v to find GNU ld if present
271	    verbose=`${cc:-cc} -v -Wl,-v -o try try.c 2>&1 | grep ld 2>&1`
272
273	    myld=`echo $verbose| grep ld | awk '/\/ld/ {print $1}'`
274	    # This assumes that gcc's output will not change, and that
275	    # /full/path/to/ld will be the first word of the output.
276	    # Thus myld is something like /opt/gnu/sparc-sun-solaris2.5/bin/ld
277
278	    # Allow that $myld may be '', due to changes in gcc's output
279	    if ${myld:-ld} -V 2>&1 |
280		grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
281		# Ok, /usr/ccs/bin/ld eventually does get called.
282		:
283	    else
284		echo "Found GNU ld='$myld'" >&4
285		cat <<END >&2
286
287NOTE: You are using GNU ld(1).  GNU ld(1) might not build Perl.  If you
288have trouble, you can use /usr/ccs/bin/ld by including -B/usr/ccs/bin/
289in your ${cc:-cc} command.  (Note that the trailing "/" is required.)
290
291I will try to use GNU ld by passing in the -Wl,-E flag, but if that
292doesn't work, you should use -B/usr/ccs/bin/ instead.
293
294END
295		ccdlflags="$ccdlflags -Wl,-E"
296		lddlflags="$lddlflags -Wl,-E -G"
297	    fi
298	fi
299
300else
301	#
302	# Not using gcc.
303	#
304
305	ccversion="`${cc:-cc} -V 2>&1|sed -n -e '1s/^cc: //p'`"
306	case "$ccversion" in
307	*WorkShop*) ccname=workshop ;;
308	*) ccversion='' ;;
309	esac
310
311	case "$ccname" in
312	workshop)
313		cat >try.c <<EOM
314#include <sunmath.h>
315int main() { return(0); }
316EOM
317		workshoplibs=`cc -### try.c -lsunmath -o try 2>&1|sed -n '/ -Y /s%.* -Y "P,\(.*\)".*%\1%p'|tr ':' '\n'|grep '/SUNWspro/'`
318		. ./workshoplibpth.cbu
319	;;
320	esac
321
322	# See if as(1) is GNU as(1).  GNU might not work for this job.
323	case `as --version < /dev/null 2>&1` in
324	*GNU*)
325		cat <<END >&2
326
327NOTE: You are using GNU as(1).  GNU as(1) might not build Perl.
328You must arrange to use /usr/ccs/bin/as, perhaps by adding /usr/ccs/bin
329to the beginning of your PATH.
330
331END
332		;;
333	esac
334
335	# See if ld(1) is GNU ld(1).  GNU ld(1) might not work for this job.
336	# ld --version doesn't properly report itself as a GNU tool,
337	# as of ld version 2.6, so we need to be more strict. TWP 9/5/96
338	# Sun's ld always emits the "Software Generation Utilities" string.
339	if ld -V 2>&1 | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then
340	    # Ok, ld is /usr/ccs/bin/ld.
341	    :
342	else
343	    cat <<END >&2
344
345NOTE: You are apparently using GNU ld(1).  GNU ld(1) might not build Perl.
346You should arrange to use /usr/ccs/bin/ld, perhaps by adding /usr/ccs/bin
347to the beginning of your PATH.
348
349END
350	fi
351
352fi
353
354# as --version or ld --version might dump core.
355rm -f try try.c
356rm -f core
357
358# XXX
359EOCBU
360
361cat > UU/usethreads.cbu <<'EOCBU'
362# This script UU/usethreads.cbu will get 'called-back' by Configure
363# after it has prompted the user for whether to use threads.
364case "$usethreads" in
365$define|true|[yY]*)
366        ccflags="-D_REENTRANT $ccflags"
367
368        # sched_yield is in -lposix4 up to Solaris 2.6, in -lrt starting with Solaris 2.7
369	case `uname -r` in
370	5.[0-6] | 5.5.1) sched_yield_lib="posix4" ;;
371	*) sched_yield_lib="rt";
372	esac
373        set `echo X "$libswanted "| sed -e "s/ c / $sched_yield_lib pthread c /"`
374        shift
375        libswanted="$*"
376
377        # On Solaris 2.6 x86 there is a bug with sigsetjmp() and siglongjmp()
378        # when linked with the threads library, such that whatever positive
379        # value you pass to siglongjmp(), sigsetjmp() returns 1.
380        # Thanks to Simon Parsons <S.Parsons@ftel.co.uk> for this report.
381        # Sun BugID is 4117946, "sigsetjmp always returns 1 when called by
382        # siglongjmp in a MT program". As of 19980622, there is no patch
383        # available.
384        cat >try.c <<'EOM'
385	/* Test for sig(set|long)jmp bug. */
386	#include <setjmp.h>
387
388	main()
389	{
390	    sigjmp_buf env;
391	    int ret;
392
393	    ret = sigsetjmp(env, 1);
394	    if (ret) { return ret == 2; }
395	    siglongjmp(env, 2);
396	}
397EOM
398        if test "`arch`" = i86pc -a `uname -r` = 5.6 && \
399           ${cc:-cc} try.c -lpthread >/dev/null 2>&1 && ./a.out; then
400 	    d_sigsetjmp=$undef
401	    cat << 'EOM' >&2
402
403You will see a *** WHOA THERE!!! ***  message from Configure for
404d_sigsetjmp.  Keep the recommended value.  See hints/solaris_2.sh
405for more information.
406
407EOM
408        fi
409
410	# These prototypes should be visible since we using
411	# -D_REENTRANT, but that does not seem to work.
412	# It does seem to work for getnetbyaddr_r, weirdly enough,
413	# and other _r functions. (Solaris 8)
414
415	d_ctermid_r_proto="$define"
416	d_gethostbyaddr_r_proto="$define"
417	d_gethostbyname_r_proto="$define"
418	d_getnetbyname_r_proto="$define"
419	d_getprotobyname_r_proto="$define"
420	d_getprotobynumber_r_proto="$define"
421	d_getservbyname_r_proto="$define"
422	d_getservbyport_r_proto="$define"
423
424	# Ditto. (Solaris 7)
425	d_readdir_r_proto="$define"
426	d_readdir64_r_proto="$define"
427	d_tmpnam_r_proto="$define"
428	d_ttyname_r_proto="$define"
429
430	;;
431esac
432EOCBU
433
434cat > UU/uselargefiles.cbu <<'EOCBU'
435# This script UU/uselargefiles.cbu will get 'called-back' by Configure
436# after it has prompted the user for whether to use large files.
437case "$uselargefiles" in
438''|$define|true|[yY]*)
439
440# Keep these in the left margin.
441ccflags_uselargefiles="`getconf LFS_CFLAGS 2>/dev/null`"
442ldflags_uselargefiles="`getconf LFS_LDFLAGS 2>/dev/null`"
443libswanted_uselargefiles="`getconf LFS_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
444
445    ccflags="$ccflags $ccflags_uselargefiles"
446    ldflags="$ldflags $ldflags_uselargefiles"
447    libswanted="$libswanted $libswanted_uselargefiles"
448    ;;
449esac
450EOCBU
451
452# This is truly a mess.
453case "$usemorebits" in
454"$define"|true|[yY]*)
455	use64bitint="$define"
456	uselongdouble="$define"
457	;;
458esac
459
460if test `uname -p` = "sparc"; then
461    cat > UU/use64bitint.cbu <<'EOCBU'
462# This script UU/use64bitint.cbu will get 'called-back' by Configure
463# after it has prompted the user for whether to use 64 bit integers.
464case "$use64bitint" in
465"$define"|true|[yY]*)
466	    case "`uname -r`" in
467	    5.[0-4])
468		cat >&4 <<EOM
469Solaris `uname -r|sed -e 's/^5\./2./'` does not support 64-bit integers.
470You should upgrade to at least Solaris 2.5.
471EOM
472		exit 1
473		;;
474	    esac
475	    ;;
476esac
477# gcc-2.8.1 on Solaris 8 with -Duse64bitint fails op/pat.t test 822
478# if we compile regexec.c with -O.  Turn off optimization for that one
479# file.  See hints/README.hints , especially
480# =head2 Propagating variables to config.sh, method 3.
481#  A. Dougherty  May 24, 2002
482case "$use64bitint" in
483"$define")
484    case "${gccversion}-${optimize}" in
485    2.8*-O*)
486	# Honor a command-line override (rather unlikely)
487	case "$regexec_cflags" in
488	'') echo "Disabling optimization on regexec.c for gcc $gccversion" >&4
489	    regexec_cflags='optimize='
490	    echo "regexec_cflags='optimize=\"\"'" >> config.sh
491	    ;;
492	esac
493	;;
494    esac
495    ;;
496esac
497EOCBU
498
499    cat > UU/use64bitall.cbu <<'EOCBU'
500# This script UU/use64bitall.cbu will get 'called-back' by Configure
501# after it has prompted the user for whether to be maximally 64 bitty.
502case "$use64bitall-$use64bitall_done" in
503"$define-"|true-|[yY]*-)
504	    case "`uname -r`" in
505	    5.[0-6])
506		cat >&4 <<EOM
507Solaris `uname -r|sed -e 's/^5\./2./'` does not support 64-bit pointers.
508You should upgrade to at least Solaris 2.7.
509EOM
510		exit 1
511		;;
512	    esac
513	    libc='/usr/lib/sparcv9/libc.so'
514	    if test ! -f $libc; then
515		cat >&4 <<EOM
516
517I do not see the 64-bit libc, $libc.
518Cannot continue, aborting.
519
520EOM
521		exit 1
522	    fi
523	    . ./workshoplibpth.cbu
524	    case "$cc -v 2>/dev/null" in
525	    *gcc*)
526		echo 'main() { return 0; }' > try.c
527		case "`${cc:-cc} -mcpu=v9 -m64 -S try.c 2>&1 | grep 'm64 is not supported by this configuration'`" in
528		*"m64 is not supported"*)
529		    cat >&4 <<EOM
530
531Full 64-bit build is not supported by this gcc configuration.
532Check http://gcc.gnu.org/ for the latest news of availability
533of gcc for 64-bit Sparc.
534
535Cannot continue, aborting.
536
537EOM
538		    exit 1
539		    ;;
540		esac
541		ccflags="$ccflags -mcpu=v9 -m64"
542		if test X`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null` != X; then
543		    ccflags="$ccflags -Wa,`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
544		fi
545		# no changes to ld flags, as (according to man ld):
546		#
547   		# There is no specific option that tells ld to link 64-bit
548		# objects; the class of the first object that gets processed
549		# by ld determines whether it is to perform a 32-bit or a
550		# 64-bit link edit.
551		;;
552	    *)
553		ccflags="$ccflags `getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
554		ldflags="$ldflags `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
555		lddlflags="$lddlflags -G `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
556		;;
557	    esac
558	    libscheck='case "`/usr/bin/file $xxx`" in
559*64-bit*|*SPARCV9*) ;;
560*) xxx=/no/64-bit$xxx ;;
561esac'
562
563	    use64bitall_done=yes
564	    ;;
565esac
566EOCBU
567
568    # Actually, we want to run this already now, if so requested,
569    # because we need to fix up things right now.
570    case "$use64bitall" in
571    "$define"|true|[yY]*)
572	# CBUs expect to be run in UU
573	cd UU; . ./use64bitall.cbu; cd ..
574	;;
575    esac
576fi
577
578cat > UU/uselongdouble.cbu <<'EOCBU'
579# This script UU/uselongdouble.cbu will get 'called-back' by Configure
580# after it has prompted the user for whether to use long doubles.
581case "$uselongdouble" in
582"$define"|true|[yY]*)
583	if test -f /opt/SUNWspro/lib/libsunmath.so; then
584		# Unfortunately libpth has already been set and
585		# searched, so we need to add in everything manually.
586		libpth="$libpth /opt/SUNWspro/lib"
587		libs="$libs -lsunmath"
588		ldflags="$ldflags -L/opt/SUNWspro/lib -R/opt/SUNWspro/lib"
589		d_sqrtl=define
590	else
591		cat >&4 <<EOM
592
593The Sun Workshop math library is not installed; therefore I do not
594know how to do long doubles, sorry.  I'm disabling the use of long
595doubles.
596EOM
597		uselongdouble="$undef"
598	fi
599	;;
600esac
601EOCBU
602
603rm -f try.c try.o try a.out
604