X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=hints%2Fsolaris_2.sh;h=5d643deffd36db2447e9d689fbf7fa5044b0a3ca;hb=7ca4b19ac3a324a55438434cebf9e27504201570;hp=dd947fc72b3bdb9fd4b1530e71c13c856aac9f43;hpb=5ae8d7b492625717ffaa50d6e3919f762d3ab467;p=p5sagit%2Fp5-mst-13.2.git diff --git a/hints/solaris_2.sh b/hints/solaris_2.sh index dd947fc..5d643de 100644 --- a/hints/solaris_2.sh +++ b/hints/solaris_2.sh @@ -1,37 +1,50 @@ # hints/solaris_2.sh -# Last modified: Thu Nov 9 14:21:02 EST 2000 -# Andy Dougherty -# Based on input from lots of folks, especially -# Dean Roehrich +# Contributions by (in alphabetical order) Alan Burlison, Andy Dougherty, +# Dean Roehrich, Jarkko Hietaniemi, Lupe Christoph, Richard Soderberg and +# many others. # # See README.solaris for additional information. # +# For consistency with gcc, we do not adopt Sun Marketing's +# removal of the '2.' prefix from the Solaris version number. +# (Configure tries to detect an old fixincludes and needs +# this information.) + # If perl fails tests that involve dynamic loading of extensions, and # you are using gcc, be sure that you are NOT using GNU as and ld. One # way to do that is to invoke Configure with -# +# # sh Configure -Dcc='gcc -B/usr/ccs/bin/' # # (Note that the trailing slash is *required*.) # gcc will occasionally emit warnings about "unused prefix", but # these ought to be harmless. See below for more details. - -# See man vfork. -usevfork=false -d_suidsafe=define +# Solaris has secure SUID scripts +d_suidsafe=${d_suidsafe:-define} + +# Be paranoid about nm failing to find symbols +mistrustnm=run + +# Several people reported problems with perl's malloc, especially +# when use64bitall is defined or when using gcc. +# http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-01/msg01318.html +# http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-01/msg00465.html +usemymalloc=${usemymalloc:-false} # Avoid all libraries in /usr/ucblib. -set `echo $glibpth | sed -e 's@/usr/ucblib@@'` +# /lib is just a symlink to /usr/lib +set `echo $glibpth | sed -e 's@/usr/ucblib@@' -e 's@ /lib @ @'` glibpth="$*" -# Remove bad libraries. -lucb contains incompatible routines. -# -lld doesn't do anything useful. +# Remove unwanted libraries. -lucb contains incompatible routines. +# -lld and -lsec don't do anything useful. -lcrypt does not +# really provide anything we need over -lc, so we drop it, too. # -lmalloc can cause a problem with GNU CC & Solaris. Specifically, # libmalloc.a may allocate memory that is only 4 byte aligned, but # GNU CC on the Sparc assumes that doubles are 8 byte aligned. # Thanks to Hallvard B. Furuseth -set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ malloc @ @' -e 's@ ucb @ @'` +set `echo " $libswanted " | sed -e 's@ ld @ @' -e 's@ malloc @ @' -e 's@ ucb @ @' -e 's@ sec @ @' -e 's@ crypt @ @'` libswanted="$*" # Look for architecture name. We want to suggest a useful default. @@ -47,44 +60,31 @@ case "$archname" in ;; esac -cc=${cc:-cc} +# +# This extracts the library directories that will be searched by the Sun +# Workshop compiler, given the command-line supplied in $tryworkshopcc. +# Use thusly: loclibpth="`$getworkshoplibs` $loclibpth" +# + getworkshoplibs=`cat <<'END' +eval $tryworkshopcc -### 2>&1 | \ +sed -n '/ -Y /s!.* -Y "P,\([^"]*\)".*!\1!p' | tr ':' ' ' | \ +sed -e 's!/usr/lib/sparcv9!!' -e 's!/usr/ccs/lib/sparcv9!!' \ + -e 's!/usr/lib!!g' -e 's!/usr/ccs/lib!!g' +END +` -ccversion="`$cc -V 2>&1|head -1|sed 's/^cc: //'`" -case "$ccversion" in -*WorkShop*) ccname=workshop ;; -*) ccversion='' ;; -esac +case "$cc" in +'') if test -f /opt/SUNWspro/bin/cc; then + cc=/opt/SUNWspro/bin/cc + cat <&4 -cat >UU/workshoplibpth.cbu<<'EOCBU' -case "$workshoplibpth_done" in -'') case "$use64bitall" in - "$define"|true|[yY]*) - loclibpth="$loclibpth /usr/lib/sparcv9" - if test -n "$workshoplibs"; then - loclibpth=`echo $loclibpth | sed -e "s% $workshoplibs%%" ` - for lib in $workshoplibs; do - # Logically, it should be sparcv9. - # But the reality fights back, it's v9. - loclibpth="$loclibpth $lib/sparcv9 $lib/v9" - done - fi - ;; - *) loclibpth="$loclibpth $workshoplibs" - ;; - esac - workshoplibpth_done="$define" - ;; -esac -EOCBU +You specified no cc but you seem to have the Workshop compiler +($cc) installed, using that. +If you want something else, specify that in the command line, +e.g. Configure -Dcc=gcc -case "$ccname" in -workshop) - cat >try.c < -int main() { return(0); } EOF - workshoplibs=`cc -### try.c -lsunmath -o try 2>&1|grep " -Y "|sed 's%.* -Y "P,\(.*\)".*%\1%'|tr ':' '\n'|grep '/SUNWspro/'` - . ./UU/workshoplibpth.cbu + fi ;; esac @@ -97,12 +97,12 @@ esac # To: perl5-porters@africa.nicoh.com # Subject: Re: On perl5/solaris/gcc # -# Here's another draft of the perl5/solaris/gcc sanity-checker. +# Here's another draft of the perl5/solaris/gcc sanity-checker. case `type ${cc:-cc}` in */usr/ucb/cc*) cat <&4 -NOTE: Some people have reported problems with /usr/ucb/cc. +NOTE: Some people have reported problems with /usr/ucb/cc. If you have difficulties, please make sure the directory containing your C compiler is before /usr/ucb in your PATH. @@ -113,7 +113,7 @@ esac # Check that /dev/fd is mounted. If it is not mounted, let the # user know that suid scripts may not work. -/usr/bin/df /dev/fd 2>&1 > /dev/null +mount | grep '^/dev/fd ' 2>&1 > /dev/null case $? in 0) ;; *) @@ -160,7 +160,7 @@ if grep GNU make.vers > /dev/null 2>&1; then case "`/usr/bin/ls -lL $tmp`" in ??????s*) cat <&2 - + NOTE: Your PATH points to GNU make, and your GNU make has the set-group-id bit set. You must either rearrange your PATH to put /usr/ccs/bin before the GNU utilities or you must ask your system administrator to disable the @@ -172,35 +172,37 @@ END fi rm -f make.vers -# XXX EXPERIMENTAL A.D. 2/27/1998 -# XXX This script UU/cc.cbu will get 'called-back' by Configure after it -# XXX has prompted the user for the C compiler to use. -cat > UU/cc.cbu <<'EOSH' +cat > UU/cc.cbu <<'EOCBU' +# This script UU/cc.cbu will get 'called-back' by Configure after it +# has prompted the user for the C compiler to use. + # If the C compiler is gcc: # - check the fixed-includes # - check as(1) and ld(1), they should not be GNU # (GNU as and ld 2.8.1 and later are reportedly ok, however.) # If the C compiler is not gcc: +# - Check if it is the Workshop/Forte compiler. +# If it is, prepare for 64 bit and long doubles. # - check as(1) and ld(1), they should not be GNU # (GNU as and ld 2.8.1 and later are reportedly ok, however.) # # Watch out in case they have not set $cc. -# Perl compiled with some combinations of GNU as and ld may not +# Perl compiled with some combinations of GNU as and ld may not # be able to perform dynamic loading of extensions. If you have a # problem with dynamic loading, be sure that you are using the Solaris # /usr/ccs/bin/as and /usr/ccs/bin/ld. You can do that with # sh Configure -Dcc='gcc -B/usr/ccs/bin/' -# (note the trailing slash is required). +# (note the trailing slash is required). # Combinations that are known to work with the following hints: # # gcc-2.7.2, GNU as 2.7, GNU ld 2.7 # egcs-1.0.3, GNU as 2.9.1 and GNU ld 2.9.1 -# --Andy Dougherty +# --Andy Dougherty # Tue Apr 13 17:19:43 EDT 1999 # Get gcc to share its secrets. -echo 'main() { return 0; }' > try.c +echo 'int main() { return 0; }' > try.c # Indent to avoid propagation to config.sh verbose=`${cc:-cc} -v -o try try.c 2>&1` @@ -208,12 +210,7 @@ if echo "$verbose" | grep '^Reading specs from' >/dev/null 2>&1; then # # Using gcc. # - - tmp=`echo "$verbose" | grep '^Reading' | - awk '{print $NF}' | sed 's/specs$/include/'` - - # Determine if the fixed-includes look like they'll work. - # Doesn't work anymore for gcc-2.7.2. + ccversion='gcc' # See if as(1) is GNU as(1). GNU as(1) might not work for this job. if echo "$verbose" | grep ' /usr/ccs/bin/as ' >/dev/null 2>&1; then @@ -250,15 +247,21 @@ END # apparently don't reveal that unless you pass in -V. # (This may all depend on local configurations too.) + # Recompute verbose with -Wl,-v to find GNU ld if present + verbose=`${cc:-cc} -v -Wl,-v -o try try.c 2>&1 | grep ld 2>&1` + myld=`echo $verbose| grep ld | awk '/\/ld/ {print $1}'` # This assumes that gcc's output will not change, and that # /full/path/to/ld will be the first word of the output. - # Thus myld is something like opt/gnu/sparc-sun-solaris2.5/bin/ld + # Thus myld is something like /opt/gnu/sparc-sun-solaris2.5/bin/ld - if $myld -V 2>&1 | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then + # Allow that $myld may be '', due to changes in gcc's output + if ${myld:-ld} -V 2>&1 | + grep "ld: Software Generation Utilities" >/dev/null 2>&1; then # Ok, /usr/ccs/bin/ld eventually does get called. : else + echo "Found GNU ld='$myld'" >&4 cat <&2 NOTE: You are using GNU ld(1). GNU ld(1) might not build Perl. If you @@ -270,7 +273,7 @@ doesn't work, you should use -B/usr/ccs/bin/ instead. END ccdlflags="$ccdlflags -Wl,-E" - lddlflags="$lddlflags -W,l-E -G" + lddlflags="$lddlflags -Wl,-E -G" fi fi @@ -278,6 +281,24 @@ else # # Not using gcc. # + cat > try.c << 'EOM' +#include +int main() { +#ifdef __SUNPRO_C + printf("workshop\n"); +#else + printf("\n"); +#endif +return(0); +} +EOM + tryworkshopcc="${cc:-cc} try.c -o try" + if $tryworkshopcc >/dev/null 2>&1; then + ccversion=`./try` + if test "$ccversion" = "workshop" -a ! "$use64bitall_done"; then + loclibpth="/usr/lib /usr/ccs/lib `$getworkshoplibs` $loclibpth" + fi + fi # See if as(1) is GNU as(1). GNU might not work for this job. case `as --version < /dev/null 2>&1` in @@ -295,22 +316,12 @@ END # See if ld(1) is GNU ld(1). GNU ld(1) might not work for this job. # ld --version doesn't properly report itself as a GNU tool, # as of ld version 2.6, so we need to be more strict. TWP 9/5/96 - gnu_ld=false - case `ld --version < /dev/null 2>&1` in - *GNU*|ld\ version\ 2*) - gnu_ld=true ;; - *) ;; - esac - if $gnu_ld ; then : + # Sun's ld always emits the "Software Generation Utilities" string. + if ld -V 2>&1 | grep "ld: Software Generation Utilities" >/dev/null 2>&1; then + # Ok, ld is /usr/ccs/bin/ld. + : else - # Try to guess from path - case `type ld | awk '{print $NF}'` in - *gnu*|*GNU*|*FSF*) - gnu_ld=true ;; - esac - fi - if $gnu_ld ; then - cat <&2 + cat <&2 NOTE: You are apparently using GNU ld(1). GNU ld(1) might not build Perl. You should arrange to use /usr/ccs/bin/ld, perhaps by adding /usr/ccs/bin @@ -318,29 +329,35 @@ to the beginning of your PATH. END fi +fi +# Check to see if the selected compiler and linker +# support the -z ignore, -z lazyload and -z combreloc flags. +echo "int main() { return(0); } " > try.c + zflgs='' +for zf in ignore lazyload combreloc; do + if ${cc:-cc} -o try try.c -z $zf > /dev/null 2>&1; then + zflgs="$zflgs -z $zf" + fi +done +if test -n "$zflgs"; then + ccdlflags="$ccdlflags $zflgs" + lddlflags="$lddlflags -G $zflgs" fi # as --version or ld --version might dump core. -rm -f try try.c -rm -f core - -# XXX -EOSH +rm -f try try.c core +EOCBU cat > UU/usethreads.cbu <<'EOCBU' -# This script UU/usethreads.cbu will get 'called-back' by Configure +# This script UU/usethreads.cbu will get 'called-back' by Configure # after it has prompted the user for whether to use threads. case "$usethreads" in $define|true|[yY]*) ccflags="-D_REENTRANT $ccflags" - # sched_yield is in -lposix4 up to Solaris 2.6, in -lrt starting with Solaris 7 - case `uname -r` in - 5.[0-6] | 5.5.1) sched_yield_lib="posix4" ;; - *) sched_yield_lib="rt"; - esac - set `echo X "$libswanted "| sed -e "s/ c / $sched_yield_lib pthread c /"` + sched_yield='yield' + set `echo X "$libswanted "| sed -e "s/ c / pthread c /"` shift libswanted="$*" @@ -354,12 +371,12 @@ $define|true|[yY]*) cat >try.c <<'EOM' /* Test for sig(set|long)jmp bug. */ #include - - main() + + int main() { sigjmp_buf env; int ret; - + ret = sigsetjmp(env, 1); if (ret) { return ret == 2; } siglongjmp(env, 2); @@ -376,12 +393,33 @@ for more information. EOM fi + + # These prototypes should be visible since we using + # -D_REENTRANT, but that does not seem to work. + # It does seem to work for getnetbyaddr_r, weirdly enough, + # and other _r functions. (Solaris 8) + + d_ctermid_r_proto="$define" + d_gethostbyaddr_r_proto="$define" + d_gethostbyname_r_proto="$define" + d_getnetbyname_r_proto="$define" + d_getprotobyname_r_proto="$define" + d_getprotobynumber_r_proto="$define" + d_getservbyname_r_proto="$define" + d_getservbyport_r_proto="$define" + + # Ditto. (Solaris 7) + d_readdir_r_proto="$define" + d_readdir64_r_proto="$define" + d_tmpnam_r_proto="$define" + d_ttyname_r_proto="$define" + ;; esac EOCBU cat > UU/uselargefiles.cbu <<'EOCBU' -# This script UU/uselargefiles.cbu will get 'called-back' by Configure +# This script UU/uselargefiles.cbu will get 'called-back' by Configure # after it has prompted the user for whether to use large files. case "$uselargefiles" in ''|$define|true|[yY]*) @@ -401,21 +439,60 @@ EOCBU # This is truly a mess. case "$usemorebits" in "$define"|true|[yY]*) - use64bitint="$define" - uselongdouble="$define" + use64bitint="$define" + uselongdouble="$define" ;; esac -cat > UU/use64bitall.cbu <<'EOCBU' -# This script UU/use64bitall.cbu will get 'called-back' by Configure +if test `uname -p` = "sparc"; then + cat > UU/use64bitint.cbu <<'EOCBU' +# This script UU/use64bitint.cbu will get 'called-back' by Configure +# after it has prompted the user for whether to use 64 bit integers. +case "$use64bitint" in +"$define"|true|[yY]*) + case "`uname -r`" in + 5.[0-4]) + cat >&4 <&4 + regexec_cflags='optimize=' + echo "regexec_cflags='optimize=\"\"'" >> config.sh + ;; + esac + ;; + esac + ;; +esac +EOCBU + + cat > UU/use64bitall.cbu <<'EOCBU' +# This script UU/use64bitall.cbu will get 'called-back' by Configure # after it has prompted the user for whether to be maximally 64 bitty. case "$use64bitall-$use64bitall_done" in "$define-"|true-|[yY]*-) case "`uname -r`" in - 5.[1-6]) + 5.[0-6]) cat >&4 <&4 </dev/null" in + case "${cc:-cc} -v 2>/dev/null" in *gcc*) - echo 'main() { return 0; }' > try.c + echo 'int main() { return 0; }' > try.c case "`${cc:-cc} -mcpu=v9 -m64 -S try.c 2>&1 | grep 'm64 is not supported by this configuration'`" in *"m64 is not supported"*) cat >&4 </dev/null` != X; then ccflags="$ccflags -Wa,`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`" @@ -472,76 +540,52 @@ EOM ccflags="$ccflags `getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`" ldflags="$ldflags `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`" lddlflags="$lddlflags -G `getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`" + echo "int main() { return(0); } " > try.c + tryworkshopcc="${cc:-cc} try.c -o try $ccflags" + loclibpth="/usr/lib/sparcv9 /usr/ccs/lib/sparcv9 `$getworkshoplibs` $loclibpth" ;; - esac - - libscheck='case "`/usr/bin/file $xxx`" in -*64-bit*|*SPARCV9*) ;; -*) xxx=/no/64-bit$xxx ;; -esac' - - case "`$cc -E $cflags /usr/include/stdio.h | grep _ptr`" in - *"unsigned char"*) stdchar='unsigned char' ;; - *) stdchar='char' ;; esac use64bitall_done=yes + archname64=64 ;; esac EOCBU - -# Actually, we want to run this already now, if so requested, -# because we need to fix up things right now. -case "$use64bitall" in -"$define"|true|[yY]*) - # Need to be double smart because we can be either here or there. - if test -f UU/use64bitall.cbu; then - . ./UU/use64bitall.cbu - else - if test -f use64bitall.cbu; then - . ./use64bitall.cbu - fi - fi + + # Actually, we want to run this already now, if so requested, + # because we need to fix up things right now. + case "$use64bitall" in + "$define"|true|[yY]*) + # CBUs expect to be run in UU + cd UU; . ./use64bitall.cbu; cd .. ;; -esac + esac +fi cat > UU/uselongdouble.cbu <<'EOCBU' -# This script UU/uselongdouble.cbu will get 'called-back' by Configure +# This script UU/uselongdouble.cbu will get 'called-back' by Configure # after it has prompted the user for whether to use long doubles. -case "$uselongdouble-$uselongdouble_done" in -"$define-"|true-|[yY]*-) - case "$ccname" in - workshop) - libswanted="$libswanted sunmath" - loclibpth="$loclibpth /opt/SUNWspro/lib" - ;; - *) cat >&4 < try.c << 'EOM' +#include +int main() { (void) powl(2, 256); return(0); } +EOM + if ${cc:-cc} try.c -lsunmath -o try > /dev/null 2>&1 && ./try; then + libswanted="$libswanted sunmath" fi + else + cat >&4 <