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