setitimer() does not exist in Unicos, despite of what
[p5sagit/p5-mst-13.2.git] / hints / hpux.sh
index f6b18fd..da8485f 100644 (file)
@@ -37,36 +37,95 @@ echo "Archname is $archname"
 
 ### HP-UX OS specific behaviour
 
-# Initial setting of some flags
-ccflags="$ccflags -D_HPUX_SOURCE"
-ldflags="$ldflags -D_HPUX_SOURCE"
-
-# When HP-UX runs a script with "#!", it sets argv[0] to the script name.
-toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
+# -ldbm is obsolete and should not be used
+# -lBSD contains BSD-style duplicates of SVR4 routines that cause confusion
+# -lPW is obsolete and should not be used
+# The libraries crypt, malloc, ndir, and net are empty.
+set `echo "X $libswanted " | sed -e 's/ ld / /' -e 's/ dbm / /' -e 's/ BSD / /' -e 's/ PW / /'`
+shift
+libswanted="$*"
 
 cc=${cc:-cc}
-ar=${ar:-/usr/bin/ar}
+ar=/usr/bin/ar # Yes, truly override.  We do not want the GNU ar.
+full_ar=$ar    # I repeat, no GNU ar.  arrr.
+
+set `echo "X $ccflags " | sed -e 's/ -A[ea] / /' -e 's/ -D_HPUX_SOURCE / /'`
+shift
+       cc_cppflags="$* -D_HPUX_SOURCE"
+cppflags="-Aa -D__STDC_EXT__ $cc_cppflags"
 
+case "$prefix" in
+    "") prefix='/opt/perl5' ;;
+    esac
+
+    gnu_as=no
+    gnu_ld=no
 case `$cc -v 2>&1`"" in
-    *gcc*)  ccisgcc="$define" ;;
-    *)      ccisgcc=''
-           ccversion=`which cc | xargs what | awk '/Compiler/{print $2}'`
+    *gcc*)  ccisgcc="$define"
+           ccflags="$cc_cppflags"
            case "`getconf KERNEL_BITS 2>/dev/null`" in
-               *64*) ldflags="$ldflags -Wl,+vnocompatwarnings" ;;
+               *64*)
+                   echo "main(){}">try.c
+                   # gcc with gas will not accept +DA2.0
+                   case "`$cc -c -Wa,+DA2.0 try.c 2>&1`" in
+                       *"+DA2.0"*)             # gas
+                           gnu_as=yes
+                           ;;
+                       *)                      # HPas
+                           ccflags="$ccflags -Wa,+DA2.0"
+                           ;;
+                       esac
+                   # gcc with gld will not accept +vnocompatwarnings
+                   case "`$cc -o try -Wl,+vnocompatwarnings try.c 2>&1`" in
+                       *"+vnocompat"*)         # gld
+                           gnu_ld=yes
+                           ;;
+                       *)                      # HPld
+                           ldflags="$ldflags -Wl,+vnocompatwarnings"
+                           ccflags="$ccflags -Wl,+vnocompatwarnings"
+                           ;;
+                       esac
+                   ;;
                esac
+           ;;
+    *)      ccisgcc=''
+           ccversion=`which cc | xargs what | awk '/Compiler/{print $2}'`
+           ccflags="-Ae $cc_cppflags -Wl,+vnocompatwarnings"
+           # Needed because cpp does only support -Aa (not -Ae)
+           cpplast='-'
+           cppminus='-'
+           cppstdin='cc -E -Aa -D__STDC_EXT__'
+           cpprun=$cppstdin
            case "$d_casti32" in
                "") d_casti32='undef' ;;
                esac
            ;;
     esac
 
-set `echo X "$libswanted "| sed -e 's/ BSD//' -e 's/ PW//'`
-shift
-libswanted="$*"
-
+# When HP-UX runs a script with "#!", it sets argv[0] to the script name.
+toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
 
 ### 64 BITNESS
 
+# Some gcc versions do native 64 bit long (e.g. 2.9-hppa-000310)
+# We have to force 64bitness to go search the right libraries
+    gcc_64native=no
+case "$ccisgcc" in
+    $define|true|[Yy])
+       echo 'int main(){long l;printf("%d\n",sizeof(l));}'>try.c
+       $cc -o try $ccflags $ldflags try.c
+       if [ "`try`" = "8" ]; then
+           cat <<EOM >&4
+
+*** This version of gcc uses 64 bit longs. -Duse64bitall is
+*** implicitly set to enable continuation
+EOM
+           use64bitall=$define
+           gcc_64native=yes
+           fi
+       ;;
+    esac
+
 case "$use64bitall" in
     $define|true|[yY]*) use64bitint="$define" ;;
     esac
@@ -117,8 +176,23 @@ EOM
            exit 1
            fi
 
-       ccflags="$ccflags +DD64"
-       ldflags="$ldflags +DD64"
+       case "$ccisgcc" in
+           $define|true|[Yy])
+               # For the moment, don't care that it ain't supported (yet)
+               # by gcc (up to and including 2.95.3), cause it'll crash
+               # anyway. Expect auto-detection of 64-bit enabled gcc on
+               # HP-UX soon, including a user-friendly exit
+               case $gcc_64native in
+                   no) ccflags="$ccflags -mlp64"
+                       ldflags="$ldflags -Wl,+DD64"
+                       ;;
+                   esac
+               ;;
+           *)
+               ccflags="$ccflags +DD64"
+               ldflags="$ldflags +DD64"
+               ;;
+           esac
 
        # Reset the library checker to make sure libraries
        # are the right type
@@ -141,44 +215,123 @@ EOM
        ;;
     esac
 
+# By setting the deferred flag below, this means that if you run perl
+# on a system that does not have the required shared library that you
+# linked it with, it will die when you try to access a symbol in the
+# (missing) shared library.  If you would rather know at perl startup
+# time that you are missing an important shared library, switch the
+# comments so that immediate, rather than deferred loading is
+# performed.  Even with immediate loading, you can postpone errors for
+# undefined (or multiply defined) routines until actual access by
+# adding the "nonfatal" option.
+# ccdlflags="-Wl,-E -Wl,-B,immediate $ccdlflags"
+# ccdlflags="-Wl,-E -Wl,-B,immediate,-B,nonfatal $ccdlflags"
+if [ "$gnu_ld" = "yes" ]; then
+    ccdlflags="-Wl,-E $ccdlflags"
+else
+    ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
+    fi
+
 
 ### COMPILER SPECIFICS
 
+## Local restrictions (point to README.hpux to lift these)
+
+## Optimization limits
+cat >try.c <<EOF
+#include <sys/resource.h>
+
+int main ()
+{
+    struct rlimit rl;
+    int i = getrlimit (RLIMIT_DATA, &rl);
+    printf ("%d\n", rl.rlim_cur / (1024 * 1024));
+    } /* main */
+EOF
+$cc -o try $ccflags $ldflags try.c
+       maxdsiz=`try`
+if [ $maxdsiz -le 64 ]; then
+    # 64 Mb is probably not enough to optimize toke.c
+    # and regexp.c with -O2
+    cat <<EOM >&4
+Your kernel limits the data section of your programs to $maxdsiz Mb,
+which is (sadly) not enough to fully optimize some parts of the
+perl binary. I'll try to use a lower optimization level for
+those parts. If you are a sysadmin, and you *do* want full
+optimization, raise the 'maxdsiz' kernel configuration parameter
+to at least 0x08000000 (128 Mb) and rebuild your kernel.
+EOM
+regexec_cflags=''
+    fi
+
 case "$ccisgcc" in
     $define|true|[Yy])
        
        case "$optimize" in
-           "") optimize="-g -O" ;;
+           "")           optimize="-g -O" ;;
+           *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
            esac
-       ld="$cc"
+       #ld="$cc"
+       ld=/usr/bin/ld
        cccdlflags='-fPIC'
-       lddlflags='-shared'
+       #lddlflags='-shared'
+       lddlflags='-b'
+       case "$optimize" in
+           *-g*-O*|*-O*-g*)
+               # gcc without gas will not accept -g
+               echo "main(){}">try.c
+               case "`$cc $optimize -c try.c 2>&1`" in
+                   *"-g option disabled"*)
+                       set `echo "X $optimize " | sed -e 's/ -g / /'`
+                       shift
+                       optimize="$*"
+                       ;;
+                   esac
+               ;;
+           esac
+       if [ $maxdsiz -le 64 ]; then
+           case "$optimize" in
+               *O2*)   opt=`echo "$optimize" | sed -e 's/O2/O1/'`
+                       toke_cflags="$toke_cflags;optimize=\"$opt\""
+                       regexec_cflags="optimize=\"$opt\""
+                       ;;
+               esac
+           fi
        ;;
 
     *) # HP's compiler cannot combine -g and -O
        case "$optimize" in
-           "") optimize="-O" ;;
+           "")           optimize="+O2 +Onolimit" ;;
+           *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
            esac
+       if [ $maxdsiz -le 64 ]; then
+           case "$optimize" in
+               *-O*|\
+               *O2*)   opt=`echo "$optimize" | sed -e 's/-O/+O2/' -e 's/O2/O1/' -e 's/ *+Onolimit//'`
+                       toke_cflags="$toke_cflags;optimize=\"$opt\""
+                       regexec_cflags="optimize=\"$opt\""
+                       ;;
+               esac
+           fi
        ld=/usr/bin/ld
        cccdlflags='+Z'
-       lddlflags='-b'
+       lddlflags='-b +vnocompatwarnings'
        ;;
     esac
 
-
 ## LARGEFILES
 
-case "$uselargefiles-$ccisgcc" in
-    "$define-$define"|'-define') 
-       cat <<EOM >&4
-
-*** I'm ignoring large files for this build because
-*** I don't know how to do use large files in HP-UX using gcc.
-
-EOM
-       uselargefiles="$undef"
-       ;;
-    esac
+#case "$uselargefiles-$ccisgcc" in
+#    "$define-$define"|'-define') 
+#      cat <<EOM >&4
+#
+#*** I'm ignoring large files for this build because
+#*** I don't know how to do use large files in HP-UX using gcc.
+#
+#EOM
+#      uselargefiles="$undef"
+#      ;;
+#    esac
 
 cat >UU/uselargefiles.cbu <<'EOCBU'
 # This script UU/uselargefiles.cbu will get 'called-back' by Configure