This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
AIX 3 support removed from default hints after its separation
[perl5.git] / hints / aix.sh
1 # hints/aix.sh
2 #
3 # AIX 4.1 hints thanks to Christopher Chan-Nui <channui@austin.ibm.com>.
4 # AIX 4.1 pthreading by Christopher Chan-Nui <channui@austin.ibm.com> and
5 #         Jarkko Hietaniemi <jhi@iki.fi>.
6 # AIX 4.3.x LP64 build by Steven Hirsch <hirschs@btv.ibm.com>
7 # Merged on Mon Feb  6 10:22:35 EST 1995 by
8 #   Andy Dougherty  <doughera@lafayette.edu>
9
10 #
11 # Contact dfavor@corridor.com for any of the following:
12 #
13 #    - AIX 43x and above support
14 #    - gcc + threads support
15 #    - socks support
16 #
17 # Apr 99 changes:
18 #
19 #    - use nm in AIX 43x and above
20 #    - gcc + threads now builds
21 #    [(added support for socks) Jul 99 SOCKS support rewritten]
22 #
23 # Notes:
24 #
25 #    - shared libperl support is tricky. if ever libperl.a ends up
26 #      in /usr/local/lib/* it can override any subsequent builds of
27 #      that same perl release. to make sure you know where the shared
28 #      libperl.a is coming from do a 'dump -Hv perl' and check all the
29 #      library search paths in the loader header.
30 #
31 #      it would be nice to warn the user if a libperl.a exists that is
32 #      going to override the current build, but that would be complex.
33 #
34 #      better yet, a solid fix for this situation should be developed.
35 #
36
37 # Configure finds setrgid and setruid, but they're useless.  The man
38 # pages state:
39 #    setrgid: The EPERM error code is always returned.
40 #    setruid: The EPERM error code is always returned. Processes cannot
41 #             reset only their real user IDs.
42 d_setrgid='undef'
43 d_setruid='undef'
44
45 alignbytes=8
46
47 case "$usemymalloc" in
48 '')  usemymalloc='n' ;;
49 esac
50
51 # Intuiting the existence of system calls under AIX is difficult,
52 # at best; the safest technique is to find them empirically.
53
54 # AIX 4.3.* and above default to letting Configure test if nm
55 # extraction will work.
56 case "$osvers" in
57    4.1.*|4.2.*)
58       case "$usenm" in
59           '') usenm='undef'
60           esac
61       case "$usenativedlopen" in
62           '') usenativedlopen='false'
63           esac
64       ;;
65    *)
66       case "$usenativedlopen" in
67           '') usenativedlopen='true'
68           esac
69       ;;
70 esac
71
72 so="a"
73 # AIX itself uses .o (libc.o) but we prefer compatibility
74 # with the rest of the world and with rest of the scripting
75 # languages (Tcl, Python) and related systems (SWIG).
76 # Stephanie Beals <bealzy@us.ibm.com>
77 dlext="so"
78
79 # Take possible hint from the environment.  If 32-bit is set in the
80 # environment, we can override it later.  If set for 64, the
81 # 'sizeof' test sees a native 64-bit architecture and never looks back.
82 case "$OBJECT_MODE" in
83 32)
84     cat >&4 <<EOF
85
86 You have OBJECT_MODE=32 set in the environment. 
87 I take this as a hint you do not want to
88 build for a 64-bit address space. You will be
89 given the opportunity to change this later.
90 EOF
91     ;;
92 64)
93     cat >&4 <<EOF
94
95 You have OBJECT_MODE=64 set in the environment. 
96 This forces a full 64-bit build.  If that is
97 not what you intended, please terminate this
98 program, unset it and restart.
99 EOF
100     ;;
101 *)  ;;
102 esac
103
104 # Trying to set this breaks the POSIX.c compilation
105
106 # Make setsockopt work correctly.  See man page.
107 # ccflags='-D_BSD=44'
108
109 # uname -m output is too specific and not appropriate here
110 case "$archname" in
111 '') archname="$osname" ;;
112 esac
113
114 cc=${cc:-cc}
115
116 ccflags="$ccflags -D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE"
117 case "$cc" in
118     *gcc*) ;;
119     *) ccflags="$ccflags -qmaxmem=-1 -qnoansialias" ;;
120     esac
121 nm_opt='-B'
122
123 # These functions don't work like Perl expects them to.
124 d_setregid='undef'
125 d_setreuid='undef'
126
127 # Changes for dynamic linking by Wayne Scott <wscott@ichips.intel.com>
128 #
129 # Tell perl which symbols to export for dynamic linking.
130 cccdlflags='none'       # All AIX code is position independent
131    cc_type=xlc          # do not export to config.sh
132 case "$cc" in
133 *gcc*)
134    cc_type=gcc
135    ccdlflags='-Xlinker'
136    if [ "X$gccversion" = "X" ]; then
137      # Done too late in Configure if hinted
138      gccversion=`$cc --version | sed 's/.*(GCC) *//'`
139      fi
140    ;;
141 *) ccversion=`lslpp -L | grep 'C for AIX Compiler$' | grep -v '\.msg\.[A-Za-z_]*\.' | head -1 | awk '{print $1,$2}'`
142    case "$ccversion" in
143      '') ccversion=`lslpp -L | grep 'IBM C and C++ Compilers LUM$'`
144          ;;
145      *.*.*.*.*.*.*)             # Ahhrgg, more than one C compiler installed
146          first_cc_path=`which ${cc:-cc}`
147          case "$first_cc_path" in
148            *vac*)
149              cc_type=vac ;;
150            /usr/bin/cc)         # Check the symlink
151              if [ -h $first_cc_path ] ; then
152                ls -l $first_cc_path > reflect
153                if grep -i vac reflect >/dev/null 2>&1 ; then
154                  cc_type=vac
155                  fi
156                rm -f reflect
157                fi
158              ;;
159            esac
160          ccversion=`lslpp -L | grep 'C for AIX Compiler$' | grep -i $cc_type | head -1`
161          ;;
162      vac*.*.*.*)
163          cc_type=vac
164          ;;
165      esac
166    ccversion=`echo "$ccversion" | awk '{print $2}'`
167    case "$ccversion" in
168      3.6.6.0)
169         optimize='none'
170         ;;
171      4.4.0.0|4.4.0.1|4.4.0.2)
172         cat >&4 <<EOF
173 ***
174 *** This C compiler ($ccversion) is outdated.
175 ***
176 *** Please upgrade to at least 4.4.0.3.
177 ***
178 EOF
179         ;;
180      5.0.0.0)
181         cat >&4 <<EOF
182 ***
183 *** This C compiler ($ccversion) is known to have too many optimizer
184 *** bugs to compile a working Perl.
185 ***
186 *** Consider upgrading your C compiler, or getting the GNU cc (gcc).
187 ***
188 *** Cannot continue, aborting.
189 EOF
190         exit 1
191         ;;
192      5.0.1.0)
193         cat >&4 <<EOF
194 ***
195 *** This C compiler ($ccversion) is known to have optimizer problems
196 *** when compiling regcomp.c.
197 ***
198 *** Disabling optimization for that file but consider upgrading
199 *** your C compiler.
200 ***
201 EOF
202 regcomp_cflags='optimize='
203         ;;
204      esac
205 esac
206 # the required -bE:$installarchlib/CORE/perl.exp is added by
207 # libperl.U (Configure) later.
208
209 # The first 3 options would not be needed if dynamic libs. could be linked
210 # with the compiler instead of ld.
211 # -bI:$(PERL_INC)/perl.exp  Read the exported symbols from the perl binary
212 # -bE:$(BASEEXT).exp        Export these symbols.  This file contains only one
213 #                           symbol: boot_$(EXP)  can it be auto-generated?
214 lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -bnoentry -lc"
215
216 case "$use64bitall" in
217     $define|true|[yY]*) use64bitint="$define" ;;
218     esac
219
220 case "$usemorebits" in
221     $define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;;
222     esac
223
224 case $cc_type in
225     vac|xlc)
226         case "$uselongdouble" in
227             $define|true|[yY]*)
228                 ccflags="$ccflags -qlongdouble"
229                 libswanted="c128 $libswanted"
230                 lddlflags=`echo "$lddlflags " | sed -e 's/ -lc / -lc128 -lc /'`
231                 ;;
232             esac
233     esac
234
235 case "$cc" in
236 *gcc*) ;;
237 cc*|xlc*) # cc should've been set by line 116 or so if empty.
238         if test ! -x /usr/bin/$cc -a -x /usr/vac/bin/$cc; then
239                 case ":$PATH:" in
240                 *:/usr/vac/bin:*) ;;
241                 *) if test ! -x /QOpenSys/usr/bin/$cc; then
242                         # The /QOpenSys/usr/bin/$cc saves us if we are
243                         # building natively in OS/400 PASE.
244                         cat >&4 <<EOF
245
246 ***
247 *** You either implicitly or explicitly specified an IBM C compiler,
248 *** but you do not seem to have one in /usr/bin, but you seem to have
249 *** the VAC installed in /usr/vac, but you do not have the /usr/vac/bin
250 *** in your PATH.  I suggest adding that and retrying Configure.
251 ***
252 EOF
253                         exit 1
254                    fi 
255                    ;;
256                 esac
257         fi
258         ;;
259 esac
260
261 case "$ldlibpthname" in
262 '') ldlibpthname=LIBPATH ;;
263 esac
264
265 # AIX 4.2 (using latest patchlevels on 20001130) has a broken bind
266 # library (getprotobyname and getprotobynumber are outversioned by
267 # the same calls in libc, at least for xlc version 3...
268 case "`oslevel`" in
269     4.2.1.*)
270       case "$ccversion" in    # Don't know if needed for gcc
271           3.1.4.*|5.0.2.*)    # libswanted "bind ... c ..." => "... c bind ..."
272               set `echo X "$libswanted "| sed -e 's/ bind\( .*\) \([cC]\) / \1 \2 bind /'`
273               shift
274               libswanted="$*"
275               ;;
276           esac
277       ;;
278     esac
279
280 # This script UU/usethreads.cbu will get 'called-back' by Configure 
281 # after it has prompted the user for whether to use threads.
282 cat > UU/usethreads.cbu <<'EOCBU'
283 case "$usethreads" in
284 $define|true|[yY]*)
285         ccflags="$ccflags -DNEED_PTHREAD_INIT"
286         case "$cc" in
287         *gcc*)
288             ccflags="-D_THREAD_SAFE $ccflags"
289             echo "GCC $gccversion disabling some _r functions" >&4
290             case "$gccversion" in
291                 3*) d_drand48_r='undef'
292                     d_endgrent_r='undef'
293                     d_endpwent_r='undef'
294                     d_getgrent_r='undef'
295                     d_getpwent_r='undef'
296                     d_random_r='undef'
297                     d_srand48_r='undef'
298                     d_strerror_r='undef'
299                     ;;
300                 esac
301             ;;
302         cc_r) ;;
303         cc|xl[cC]|xl[cC]_r) 
304             echo >&4 "Switching cc to cc_r because of POSIX threads."
305             # xlc_r has been known to produce buggy code in AIX 4.3.2.
306             # (e.g. pragma/overload core dumps)  Let's suspect xlC_r, too.
307             # --jhi@iki.fi
308             cc=cc_r
309
310             case "`oslevel`" in
311                 4.2.1.*) i_crypt='undef' ;;
312                 esac
313             ;;
314         '') 
315             cc=cc_r
316             ;;
317         *)
318             cat >&4 <<EOM
319 *** For pthreads you should use the AIX C compiler cc_r.
320 *** (now your compiler was set to '$cc')
321 *** Cannot continue, aborting.
322 EOM
323             exit 1
324             ;;
325         esac
326
327         # c_rify libswanted.
328         set `echo X "$libswanted "| sed -e 's/ \([cC]\) / \1_r /g'`
329         shift
330         libswanted="$*"
331         # c_rify lddlflags.
332         set `echo X "$lddlflags "| sed -e 's/ \(-l[cC]\) / \1_r /g'`
333         shift
334         lddlflags="$*"
335
336         # Insert pthreads to libswanted, before any libc or libC.
337         set `echo X "$libswanted "| sed -e 's/ \([cC]_r\) / pthreads \1 /'`
338         shift
339         libswanted="$*"
340         # Insert pthreads to lddlflags, before any libc or libC.
341         set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]_r\) / -lpthreads \1 /'`
342         shift
343         lddlflags="$*"
344
345         ;;
346 esac
347 EOCBU
348
349 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
350 # after it has prompted the user for whether to use large files.
351 cat > UU/uselargefiles.cbu <<'EOCBU'
352 case "$uselargefiles" in
353 ''|$define|true|[yY]*)
354     # Configure should take care of use64bitint and use64bitall being
355     # defined before uselargefiles.cbu is consulted.
356     if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
357 # Keep these at the left margin.
358 ccflags_uselargefiles="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
359 ldflags_uselargefiles="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
360     else
361 # Keep these at the left margin.
362 ccflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
363 ldflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
364     fi
365         # _Somehow_ in AIX 4.3.1.0 the above getconf call manages to
366         # insert(?) *something* to $ldflags so that later (in Configure) evaluating
367         # $ldflags causes a newline after the '-b64' (the result of the getconf).
368         # (nothing strange shows up in $ldflags even in hexdump;
369         #  so it may be something (a bug) in the shell, instead?)
370         # Try it out: just uncomment the below line and rerun Configure:
371 # echo >&4 "AIX 4.3.1.0 $ldflags_uselargefiles mystery" ; exit 1
372         # Just don't ask me how AIX does it, I spent hours wondering.
373         # Therefore the line re-evaluating ldflags_uselargefiles: it seems to fix
374         # the whatever it was that AIX managed to break. --jhi
375         ldflags_uselargefiles="`echo $ldflags_uselargefiles`"
376     if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
377 # Keep this at the left margin.
378 libswanted_uselargefiles="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
379     else
380 # Keep this at the left margin.
381 libswanted_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
382     fi
383         case "$ccflags_uselargefiles$ldflags_uselargefiles$libs_uselargefiles" in
384         '');;
385         *) ccflags="$ccflags $ccflags_uselargefiles"
386            ldflags="$ldflags $ldflags_uselargefiles"
387            libswanted="$libswanted $libswanted_uselargefiles"
388            ;;
389         esac
390         case "$gccversion" in
391         '') ;;
392         *) # Remove xlc-specific -qflags.
393            ccflags="`echo $ccflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
394            ldflags="`echo $ldflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
395            # Move xlc-specific -bflags.
396            ccflags="`echo $ccflags | sed -e 's@ -b@ -Wl,-b@g'`"
397            ldflags="`echo ' '$ldflags | sed -e 's@ -b@ -Wl,-b@g'`"
398            lddlflags="`echo ' '$lddlflags | sed -e 's@ -b@ -Wl,-b@g'`"
399            ld='gcc'
400            echo >&4 "(using ccflags   $ccflags)"
401            echo >&4 "(using ldflags   $ldflags)"
402            echo >&4 "(using lddlflags $lddlflags)"
403            ;; 
404         esac
405         ;;
406 esac
407 EOCBU
408
409 # This script UU/use64bitint.cbu will get 'called-back' by Configure 
410 # after it has prompted the user for whether to use 64 bit integers.
411 cat > UU/use64bitint.cbu <<'EOCBU'
412 case "$use64bitint" in
413 $define|true|[yY]*)
414         case "`oslevel`" in
415             4.[012].*)
416                 cat >&4 <<EOM
417 AIX `oslevel` does not support 64-bit interfaces.
418 You should upgrade to at least AIX 4.3.
419 EOM
420                 exit 1
421                 ;;
422             esac
423             ;;
424 esac
425 EOCBU
426
427 cat > UU/use64bitall.cbu <<'EOCBU'
428 # This script UU/use64bitall.cbu will get 'called-back' by Configure 
429 # after it has prompted the user for whether to be maximally 64-bitty.
430 case "$use64bitall" in
431 $define|true|[yY]*)
432         case "`oslevel`" in
433             4.[012].*)
434                 cat >&4 <<EOM
435 AIX `oslevel` does not support 64-bit interfaces.
436 You should upgrade to at least AIX 4.3.
437 EOM
438                 exit 1
439                 ;;
440             esac
441             echo " "
442             echo "Checking the CPU width of your hardware..." >&4
443             $cat >size.c <<EOCP
444 #include <stdio.h>
445 #include <sys/systemcfg.h>
446 int main (void)
447 {
448   printf("%d\n",_system_configuration.width);
449   return(0);
450 }
451 EOCP
452             set size
453             if eval $compile_ok; then
454                 qacpuwidth=`./size`
455                 echo "You are running on $qacpuwidth bit hardware."
456             else
457                 dflt="32"
458                 echo " "
459                 echo "(I can't seem to compile the test program.  Guessing...)"
460                 rp="What is the width of your CPU (in bits)?"
461                 . ./myread
462                 qacpuwidth="$ans"
463             fi
464             $rm -f size.c size
465             case "$qacpuwidth" in
466             32*)
467                 cat >&4 <<EOM
468 Bzzzt! At present, you can only perform a
469 full 64-bit build on a 64-bit machine.
470 EOM
471                 exit 1
472                 ;;
473             esac
474             qacflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
475             qaldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
476             # See jhi's comments above regarding this re-eval.  I've
477             # seen similar weirdness in the form of:
478             #
479 # 1506-173 (W) Option lm is not valid.  Enter xlc for list of valid options.
480             #
481             # error messages from 'cc -E' invocation. Again, the offending
482             # string is simply not detectable by any means.  Since it doesn't
483             # do any harm, I didn't pursue it. -- sh
484             qaldflags="`echo $qaldflags`"
485             qalibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
486             # -q32 and -b32 may have been set by uselargefiles or user.
487             # Remove them.
488             ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
489             ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
490             # Tell archiver to use large format.  Unless we remove 'ar'
491             # from 'trylist', the Configure script will just reset it to 'ar'
492             # immediately prior to writing config.sh.  This took me hours
493             # to figure out.
494             trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @ @g' -e 's@ ar$@@'`"
495             ar="ar -X64"
496             nm_opt="-X64 $nm_opt"
497             # Note: Placing the 'qacflags' variable into the 'ldflags' string
498             # is NOT a typo.  ldflags is passed to the C compiler for final
499             # linking, and it wants -q64 (-b64 is for ld only!).
500             case "$qacflags$qaldflags$qalibs" in
501             '');;
502             *) ccflags="$ccflags $qacflags"
503                ldflags="$ldflags $qacflags"
504                lddlflags="$qaldflags $lddlflags"
505                libswanted="$libswanted $qalibs"
506                ;;
507             esac
508             case "$ccflags" in
509             *-DUSE_64_BIT_ALL*) ;;
510             *) ccflags="$ccflags -DUSE_64_BIT_ALL";;
511             esac
512             case "$archname64" in
513             ''|64*) archname64=64all ;;
514             esac
515             longsize="8"
516             qacflags=''
517             qaldflags=''
518             qalibs=''
519             qacpuwidth=''
520             ;;
521 esac
522 EOCBU
523
524 if test $usenativedlopen = 'true'
525 then
526     ccflags="$ccflags -DUSE_NATIVE_DLOPEN"
527     case "$cc" in
528       *gcc*) ldflags="$ldflags -Wl,-brtl" ;;
529       *)     ldflags="$ldflags -brtl" ;;
530       esac
531 else
532     case `oslevel` in
533         4.2.*)  ;;      # libC_r has broke gettimeofday
534         *)  # If the C++ libraries, libC and libC_r, are available we will
535             # prefer them over the vanilla libc, because the libC contain
536             # loadAndInit() and terminateAndUnload() which work correctly
537             # with C++ statics while libc load() and unload() do not. See
538             # ext/DynaLoader/dl_aix.xs. The C-to-C_r switch is done by
539             # usethreads.cbu, if needed.
540             if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
541                 # Cify libswanted.
542                 set `echo X "$libswanted "| sed -e 's/ c / C c /'`
543                 shift
544                 libswanted="$*"
545                 # Cify lddlflags.
546                 set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
547                 shift
548                 lddlflags="$*"
549             fi
550         esac
551 fi
552
553 case "$PASE" in
554 define)
555         case "$prefix" in
556         '') prefix=/QOpenSys/perl ;;
557         esac
558         cat >&4 <<EOF
559
560 ***
561 *** You seem to be compiling in AIX for the OS/400 PASE environment.
562 *** I'm not going to use the AIX bind, nsl, and possible util libraries, then.
563 *** I'm also not going to install perl as /usr/bin/perl.
564 *** Perl will be installed under $prefix.
565 *** For instructions how to install this build from AIX to PASE,
566 *** see the file README.os400.  Accept the "aix" for the question
567 *** about "Operating system name".
568 ***
569 EOF
570         set `echo " $libswanted " | sed -e 's@ bind @ @' -e 's@ nsl @ @' -e 's@ util @ @'`
571         shift
572         libswanted="$*"
573         installusrbinperl="$undef"
574
575         # V5R1 doesn't have this (V5R2 does), without knowing
576         # which one we have it's safer to be pessimistic.
577         # Cwd will work fine even without fchdir(), but if
578         # V5R1 tries to use code compiled assuming fchdir(),
579         # lots of grief will issue forth from Cwd.
580         case "$d_fchdir" in
581         '') d_fchdir="$undef" ;;
582         esac
583         ;;
584 esac
585
586 # EOF