This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
The AIX cc 5.0.0.0 is simply too buggy.
[perl5.git] / hints / aix.sh
index a22ca82..40c7b66 100644 (file)
@@ -54,10 +54,20 @@ esac
 # AIX 4.3.* and above default to using nm for symbol extraction
 case "$osvers" in
    3.*|4.1.*|4.2.*)
-      usenm='undef'
+      case "$usenm" in
+         '') usenm='undef'
+         esac
+      case "$usenativedlopen" in
+         '') usenativedlopen='false'
+         esac
       ;;
    *)
-      usenm='true'
+      case "$usenm" in
+         '') usenm='true'
+         esac
+      case "$usenativedlopen" in
+         '') usenativedlopen='true'
+         esac
       ;;
 esac
 
@@ -126,8 +136,52 @@ d_setreuid='undef'
 # Changes for dynamic linking by Wayne Scott <wscott@ichips.intel.com>
 #
 # Tell perl which symbols to export for dynamic linking.
+cccdlflags='none'      # All AIX code is position independent
 case "$cc" in
 *gcc*) ccdlflags='-Xlinker' ;;
+*) ccversion=`lslpp -L | grep 'C for AIX Compiler$' | awk '{print $2}'`
+   case "$ccversion" in
+     '') ccversion=`lslpp -L | grep 'IBM C and C++ Compilers LUM$' | awk '{print $2}'`
+       ;;
+     esac
+   case "$ccversion" in
+     3.6.6.0)
+       optimize='none'
+       ;;
+     4.4.0.0|4.4.0.1|4.4.0.2)
+       cat >&4 <<EOF
+***
+*** This C compiler ($ccversion) is outdated.
+***
+*** Please upgrade to at least 4.4.0.3.
+***
+EOF
+       ;;
+     5.0.0.0)
+       cat >&4 <<EOF
+***
+*** This C compiler ($ccversion) is known to have too many optimizer
+*** bugs to compile a working Perl.
+***
+*** Consider upgrading your C compiler, or getting the GNU cc (gcc).
+***
+*** Cannot continue, aborting.
+EOF
+       exit 1
+       ;;
+     5.0.1.0)
+       cat >&4 <<EOF
+***
+*** This C compiler ($ccversion) is known to have optimizer problems
+*** when compiling regcomp.c.
+***
+*** Disabling optimization for that file but consider upgrading
+*** your C compiler.
+***
+EOF
+regcomp_cflags='optimize='
+       ;;
+     esac
 esac
 # the required -bE:$installarchlib/CORE/perl.exp is added by
 # libperl.U (Configure) later.
@@ -146,9 +200,23 @@ case "$osvers" in
     lddlflags="$lddlflags -H512 -T512 -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -e _nostart -lc"
     ;;
 *) 
-    lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -b noentry -lc"
+    lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -bnoentry -lc"
     ;;
 esac
+# AIX 4.2 (using latest patchlevels on 20001130) has a broken bind
+# library (getprotobyname and getprotobynumber are outversioned by
+# the same calls in libc, at least for xlc version 3...
+case "`oslevel`" in
+    4.2.1.*)
+      case "$ccversion" in    # Don't know if needed for gcc
+          3.1.4.*)    # libswanted "bind ... c ..." => "... c bind ..."
+              set `echo X "$libswanted "| sed -e 's/ bind\( .*\) \([cC]\) / \1 \2 bind /'`
+              shift
+              libswanted="$*"
+              ;;
+          esac
+      ;;
+    esac
 
 # This script UU/usethreads.cbu will get 'called-back' by Configure 
 # after it has prompted the user for whether to use threads.
@@ -171,9 +239,9 @@ $define|true|[yY]*)
            ;;
        *)
            cat >&4 <<EOM
-For pthreads you should use the AIX C compiler cc_r.
-(now your compiler was set to '$cc')
-Cannot continue, aborting.
+*** For pthreads you should use the AIX C compiler cc_r.
+*** (now your compiler was set to '$cc')
+*** Cannot continue, aborting.
 EOM
            exit 1
            ;;
@@ -189,11 +257,11 @@ EOM
        lddlflags="$*"
 
        # Insert pthreads to libswanted, before any libc or libC.
-       set `echo X "$libswanted "| sed -e 's/ \([cC]\) / pthreads \1 /'`
+       set `echo X "$libswanted "| sed -e 's/ \([cC]_r\) / pthreads \1 /'`
        shift
        libswanted="$*"
        # Insert pthreads to lddlflags, before any libc or libC.
-       set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]\) / -lpthreads \1 /'`
+       set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]_r\) / -lpthreads \1 /'`
        shift
        lddlflags="$*"
 
@@ -201,36 +269,71 @@ EOM
 esac
 EOCBU
 
-# This script UU/uselfs.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.
-cat > UU/uselfs.cbu <<'EOCBU'
+cat > UU/uselargefiles.cbu <<'EOCBU'
 case "$uselargefiles" in
 ''|$define|true|[yY]*)
-       lfcflags="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
-       lfldflags="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
+    # Configure should take care of use64bitint and use64bitall being
+    # defined before uselargefiles.cbu is consulted.
+    if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
+# Keep these at the left margin.
+ccflags_uselargefiles="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+ldflags_uselargefiles="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+    else
+# Keep these at the left margin.
+ccflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
+ldflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
+    fi
        # _Somehow_ in AIX 4.3.1.0 the above getconf call manages to
        # insert(?) *something* to $ldflags so that later (in Configure) evaluating
        # $ldflags causes a newline after the '-b64' (the result of the getconf).
        # (nothing strange shows up in $ldflags even in hexdump;
-       #  so it may be something in the shell, instead?)
+       #  so it may be something (a bug) in the shell, instead?)
        # Try it out: just uncomment the below line and rerun Configure:
-# echo >&4 "AIX 4.3.1.0 $lfldflags mystery" ; exit 1
+# echo >&4 "AIX 4.3.1.0 $ldflags_uselargefiles mystery" ; exit 1
        # Just don't ask me how AIX does it, I spent hours wondering.
-       # Therefore the line re-evaluating lfldflags: it seems to fix
+       # Therefore the line re-evaluating ldflags_uselargefiles: it seems to fix
        # the whatever it was that AIX managed to break. --jhi
-       lfldflags="`echo $lfldflags`"
-       lflibs="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
-       case "$lfcflags$lfldflags$lflibs" in
+       ldflags_uselargefiles="`echo $ldflags_uselargefiles`"
+    if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
+# Keep this at the left margin.
+libswanted_uselargefiles="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+    else
+# Keep this at the left margin.
+libswanted_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+    fi
+       case "$ccflags_uselargefiles$ldflags_uselargefiles$libs_uselargefiles" in
        '');;
-       *) ccflags="$ccflags $lfcflags"
-          ldflags="$ldflags $lfldflags"
-          libswanted="$libswanted $lflibs"
+       *) ccflags="$ccflags $ccflags_uselargefiles"
+          ldflags="$ldflags $ldflags_uselargefiles"
+          libswanted="$libswanted $libswanted_uselargefiles"
           ;;
        esac
-       lfcflags=''
-       lfldflags=''
-       lflibs=''
-       ;;
+       case "$gccversion" in
+       '') ;;
+       *)
+       cat >&4 <<EOM
+
+*** Warning: gcc in AIX might not work with the largefile support of Perl
+*** (default since 5.6.0), this combination hasn't been tested.
+*** I will try, though.
+
+EOM
+       # Remove xlc-spefific -qflags.
+        ccflags="`echo $ccflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
+        ldflags="`echo $ldflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
+        # Move xld-spefific -bflags.
+        ccflags="`echo $ccflags | sed -e 's@ -b@ -Wl,-b@g'`"
+        ldflags="`echo ' '$ldflags | sed -e 's@ -b@ -Wl,-b@g'`"
+        lddlflags="`echo ' '$lddlflags | sed -e 's@ -b@ -Wl,-b@g'`"
+        ld='gcc'
+        echo >&4 "(using ccflags   $ccflags)"
+        echo >&4 "(using ldflags   $ldflags)"
+        echo >&4 "(using lddlflags $lddlflags)"
+        ;; 
+        esac
+        ;;
 esac
 EOCBU
 
@@ -279,18 +382,18 @@ int main (void)
 EOCP
            set size
            if eval $compile_ok; then
-               lfcpuwidth=`./size`
-               echo "You are running on $lfcpuwidth bit hardware."
+               qacpuwidth=`./size`
+               echo "You are running on $qacpuwidth bit hardware."
            else
                dflt="32"
                echo " "
                echo "(I can't seem to compile the test program.  Guessing...)"
                rp="What is the width of your CPU (in bits)?"
                . ./myread
-               lfcpuwidth="$ans"
+               qacpuwidth="$ans"
            fi
            $rm -f size.c size
-           case "$lfcpuwidth" in
+           case "$qacpuwidth" in
            32*)
                cat >&4 <<EOM
 Bzzzt! At present, you can only perform a
@@ -299,8 +402,8 @@ EOM
                exit 1
                ;;
            esac
-           lfcflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
-           lfldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
+           qacflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
+           qaldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
            # See jhi's comments above regarding this re-eval.  I've
            # seen similar weirdness in the form of:
            #
@@ -309,27 +412,28 @@ EOM
            # error messages from 'cc -E' invocation. Again, the offending
            # string is simply not detectable by any means.  Since it doesn't
            # do any harm, I didn't pursue it. -- sh
-           lfldflags="`echo $lfldflags`"
-           lflibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
-           # -q32 and -b32 may have been set by uselfs or user.  Remove them.
+           qaldflags="`echo $qaldflags`"
+           qalibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
+           # -q32 and -b32 may have been set by uselargefiles or user.
+           # Remove them.
            ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
            ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
            # Tell archiver to use large format.  Unless we remove 'ar'
            # from 'trylist', the Configure script will just reset it to 'ar'
            # immediately prior to writing config.sh.  This took me hours
            # to figure out.
-           trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @@g' -e 's@ ar$@@'`"
+           trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @ @g' -e 's@ ar$@@'`"
            ar="ar -X64"
            nm_opt="-X64 $nm_opt"
-           # Note: Placing the 'lfcflags' variable into the 'ldflags' string
-           # is NOT a typo.  ldlflags is passed to the C compiler for final
+           # Note: Placing the 'qacflags' variable into the 'ldflags' string
+           # is NOT a typo.  ldflags is passed to the C compiler for final
            # linking, and it wants -q64 (-b64 is for ld only!).
-           case "$lfcflags$lfldflags$lflibs" in
+           case "$qacflags$qaldflags$qalibs" in
            '');;
-           *) ccflags="$ccflags $lfcflags"
-              ldflags="$ldflags $lfcflags"
-              lddlflags="$lfldflags $lddlflags"
-              libswanted="$libswanted $lflibs"
+           *) ccflags="$ccflags $qacflags"
+              ldflags="$ldflags $qacflags"
+              lddlflags="$qaldflags $lddlflags"
+              libswanted="$libswanted $qalibs"
               ;;
            esac
            case "$ccflags" in
@@ -343,10 +447,10 @@ EOM
            # Don't try backwards compatibility
            bincompat="$undef"
            d_bincompat5005="$undef"
-           lfcflags=''
-           lfldflags=''
-           lflibs=''
-           lfcpuwidth=''
+           qacflags=''
+           qaldflags=''
+           qalibs=''
+           qacpuwidth=''
            ;;
 esac
 EOCBU
@@ -356,27 +460,40 @@ cat > UU/uselongdouble.cbu <<'EOCBU'
 # after it has prompted the user for whether to use long doubles.
 case "$uselongdouble" in
 $define|true|[yY]*)
-       ccflags="$ccflags -qlongdouble"
-       # The explicit cc128, xlc128, xlC128 are not needed,
-       # the -qlongdouble should do the trick. --jhi
+        # -qlongdouble for cc taken out on 20010522 cause it
+        # causes more trouble than it does any good --hmb
+        d_Gconvert='sprintf((b),"%.*llg",((int)(n)),(x))'
        ;;
 esac
 EOCBU
 
-# If the C++ libraries, libC and libC_r, are available we will prefer them
-# over the vanilla libc, because the libC contain loadAndInit() and
-# terminateAndUnload() which work correctly with C++ statics while libc
-# load() and unload() do not.  See ext/DynaLoader/dl_aix.xs.
-# The C-to-C_r switch is done by usethreads.cbu, if needed.
-if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
-    # Cify libswanted.
-    set `echo X "$libswanted "| sed -e 's/ c / C c /'`
-    shift
-    libswanted="$*"
-    # Cify lddlflags.
-    set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
-    shift
-    lddlflags="$*"
+if test $usenativedlopen = 'true'
+then
+    ccflags="$ccflags -DUSE_NATIVE_DLOPEN"
+    case "$cc" in
+      *gcc*) ldflags="$ldflags -Wl,-brtl" ;;
+      *)     ldflags="$ldflags -brtl" ;;
+      esac
+else
+    case `oslevel` in
+       4.2.*)  ;;      # libC_r has broke gettimeofday
+        *)  # If the C++ libraries, libC and libC_r, are available we will
+           # prefer them over the vanilla libc, because the libC contain
+           # loadAndInit() and terminateAndUnload() which work correctly
+           # with C++ statics while libc load() and unload() do not. See
+           # ext/DynaLoader/dl_aix.xs. The C-to-C_r switch is done by
+           # usethreads.cbu, if needed.
+           if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
+               # Cify libswanted.
+               set `echo X "$libswanted "| sed -e 's/ c / C c /'`
+               shift
+               libswanted="$*"
+               # Cify lddlflags.
+               set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
+               shift
+               lddlflags="$*"
+           fi
+       esac
 fi
 
 # EOF