This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Enlarge the last slot on an op slab to fit
[perl5.git] / hints / aix.sh
1 # hints/aix.sh
2
3 # AIX 3 and AIX 4 are split off to aix_3.sh and aix_4.sh
4 #    early Feb 2004 by H.Merijn Brand
5 # please read comments in there for historic questions.
6 #    many now stripped here
7
8 # Contact dfavor@corridor.com for any of the following:
9 #
10 #    - AIX 43x and above support
11 #    - gcc + threads support
12 #    - socks support
13 #
14 # Notes:
15 #
16 #    - shared libperl support is tricky. if ever libperl.a ends up
17 #      in /usr/local/lib/* it can override any subsequent builds of
18 #      that same perl release. to make sure you know where the shared
19 #      libperl.a is coming from do a 'dump -Hv perl' and check all the
20 #      library search paths in the loader header.
21 #
22 #      it would be nice to warn the user if a libperl.a exists that is
23 #      going to override the current build, but that would be complex.
24 #
25 #      better yet, a solid fix for this situation should be developed.
26 #
27
28 # Configure finds setrgid and setruid, but they're useless.  The man
29 # pages state:
30 #    setrgid: The EPERM error code is always returned.
31 #    setruid: The EPERM error code is always returned. Processes cannot
32 #             reset only their real user IDs.
33 d_setrgid='undef'
34 d_setruid='undef'
35
36 alignbytes=8
37
38 case "$usemymalloc" in
39     '')  usemymalloc='n' ;;
40     esac
41
42 # malloc wrap works, but not in vac-5, see later
43 case "$usemallocwrap" in
44     '') usemallocwrap='define' ;;
45     esac
46
47 # Intuiting the existence of system calls under AIX is difficult,
48 # at best; the safest technique is to find them empirically.
49
50 case "$usenativedlopen" in
51     '') usenativedlopen='true' ;;
52     esac
53
54 so="a"
55 # AIX itself uses .o (libc.o) but we prefer compatibility
56 # with the rest of the world and with rest of the scripting
57 # languages (Tcl, Python) and related systems (SWIG).
58 # Stephanie Beals <bealzy@us.ibm.com>
59 dlext="so"
60
61 # Take possible hint from the environment.  If 32-bit is set in the
62 # environment, we can override it later.  If set for 64, the
63 # 'sizeof' test sees a native 64-bit architecture and never looks back.
64 case "$OBJECT_MODE" in
65     32) cat >&4 <<EOF
66
67 You have OBJECT_MODE=32 set in the environment.
68 I take this as a hint you do not want to
69 build for a 64-bit address space. You will be
70 given the opportunity to change this later.
71 EOF
72         ;;
73     64) cat >&4 <<EOF
74
75 You have OBJECT_MODE=64 set in the environment.
76 This forces a full 64-bit build.  If that is
77 not what you intended, please terminate this
78 program, unset it and restart.
79 EOF
80         ;;
81     esac
82
83  s=`lslpp -lc bos.adt.libm >/dev/null`
84 if [ $? != 0 ]; then
85     echo "You cannot build perl without the bos.adt.libm package installed" >&4
86     exit
87     fi
88
89 # uname -m output is too specific and not appropriate here
90 case "$archname" in
91     '') archname="$osname" ;;
92     esac
93
94 cc=${cc:-cc}
95
96 ccflags="$ccflags -D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE"
97 case "$cc" in
98     *gcc*) ;;
99     *) ccflags="$ccflags -qmaxmem=-1 -qnoansialias -qlanglvl=extc99" ;;
100     esac
101 nm_opt='-B'
102
103 # These functions don't work like Perl expects them to.
104 d_setregid='undef'
105 d_setreuid='undef'
106
107 # Changes for dynamic linking by Wayne Scott <wscott@ichips.intel.com>
108 #
109 # Tell perl which symbols to export for dynamic linking.
110 cccdlflags='none'       # All AIX code is position independent
111    cc_type=xlc          # do not export to config.sh
112 case "$cc" in
113     *gcc*)
114         cc_type=gcc
115         ccdlflags='-Xlinker'
116         if [ "X$gccversion" = "X" ]; then
117             # Done too late in Configure if hinted
118             gccversion=`$cc -dumpversion`
119             fi
120         ;;
121
122     *)  ccversion=`lslpp -ql -Ou vac.C | grep -v '^Path' | head -1 | awk '{print $1,$2}'`
123         case "$ccversion" in
124             '') ccversion=`lslpp -L | grep 'IBM C and C++ Compilers LUM$'` ;;
125
126             *.*.*.*.*.*.*)      # Ahhrgg, more than one C compiler installed
127                 first_cc_path=`which ${cc:-cc}`
128                 case "$first_cc_path" in
129                     *vac*)
130                         cc_type=vac ;;
131
132                     /usr/bin/cc)                # Check the symlink
133                         if [ -h $first_cc_path ] ; then
134                             ls -l $first_cc_path > reflect
135                             if grep -i vac reflect >/dev/null 2>&1 ; then
136                                 cc_type=vac
137                                 fi
138                             rm -f reflect
139                             fi
140                         ;;
141                     esac
142                 ccversion=`lslpp -L | grep 'C for AIX Compiler$' | grep -i $cc_type | head -1`
143                 ;;
144
145             vac*.*.*.*)
146                 cc_type=vac
147                 ;;
148             esac
149
150         ccversion=`echo "$ccversion" | awk '{print $2}'`
151         # Redbooks state AIX-5 only supports vac-5.0.2.0 and up
152         case "$ccversion" in
153             5*) usemallocwrap='n' ;; # panic in miniperl
154             esac
155         ;;
156     esac
157
158 # the required -bE:$installarchlib/CORE/perl.exp is added by
159 # libperl.U (Configure) later.
160
161 # The first 3 options would not be needed if dynamic libs. could be linked
162 # with the compiler instead of ld.
163 # -bI:$(PERL_INC)/perl.exp  Read the exported symbols from the perl binary
164 # -bE:$(BASEEXT).exp        Export these symbols.  This file contains only one
165 #                           symbol: boot_$(EXP)  can it be auto-generated?
166 if test $usenativedlopen = 'true' ; then
167     lddlflags="$lddlflags -bhalt:4 -G -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -bnoentry -lc -lm"
168 else
169     lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -bnoentry -lc"
170     fi
171
172 case "$use64bitall" in
173     $define|true|[yY]*) use64bitint="$define" ;;
174     esac
175
176 case "$usemorebits" in
177     $define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;;
178     esac
179
180 case $cc_type in
181     vac|xlc)
182         case "$uselongdouble" in
183             $define|true|[yY]*)
184                 ccflags="$ccflags -qlongdouble"
185                 libswanted="c128 $libswanted"
186                 lddlflags=`echo "$lddlflags " | sed -e 's/ -lc / -lc128 -lc /'`
187                 ;;
188             esac
189         ;;
190     esac
191
192 case "$cc" in
193     *gcc*) ;;
194
195     cc*|xlc*) # cc should've been set by line 116 or so if empty.
196         if test ! -x /usr/bin/$cc -a -x /usr/vac/bin/$cc; then
197             case ":$PATH:" in
198                 *:/usr/vac/bin:*) ;;
199                 *)  if test ! -x /QOpenSys/usr/bin/$cc; then
200                         # The /QOpenSys/usr/bin/$cc saves us if we are
201                         # building natively in OS/400 PASE.
202                         cat >&4 <<EOF
203
204 ***
205 *** You either implicitly or explicitly specified an IBM C compiler,
206 *** but you do not seem to have one in /usr/bin, but you seem to have
207 *** the VAC installed in /usr/vac, but you do not have the /usr/vac/bin
208 *** in your PATH.  I suggest adding that and retrying Configure.
209 ***
210 EOF
211                         exit 1
212                         fi
213                     ;;
214                 esac
215             fi
216         ;;
217     esac
218
219 case "$ldlibpthname" in
220     '') ldlibpthname=LIBPATH ;;
221     esac
222
223 # This script UU/usethreads.cbu will get 'called-back' by Configure
224 # after it has prompted the user for whether to use threads.
225 cat > UU/usethreads.cbu <<'EOCBU'
226 case "$usethreads" in
227     $define|true|[yY]*)
228         d_drand48_r='undef'
229         d_endgrent_r='undef'
230         d_endpwent_r='undef'
231         d_getgrent_r='undef'
232         d_getpwent_r='undef'
233         d_random_r='undef'
234         d_setgrent_r='undef'
235         d_setpwent_r='undef'
236         d_srand48_r='undef'
237         d_srandom_r='undef'
238         d_strerror_r='undef'
239
240         ccflags="$ccflags -DNEED_PTHREAD_INIT"
241         case "$cc" in
242             *gcc*) 
243               ccflags="-D_THREAD_SAFE $ccflags" 
244               ;;
245             cc_r) 
246               ;;
247             xlc_r) 
248               ;;
249             # we do not need the C++ compiler
250             xlC_r) 
251               cc=xlc_r 
252               ;;
253             '') 
254               cc=cc_r 
255               ;;
256             *)
257         esac
258
259         # Insert pthreads to libswanted, before any libc or libC.
260         set `echo X "$libswanted "| sed -e 's/ \([cC]\) / pthreads \1 /'`
261         shift
262         libswanted="$*"
263         # Insert pthreads to lddlflags, before any libc or libC.
264         set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]\) / -lpthreads \1 /'`
265         shift
266         lddlflags="$*"
267         ;;
268     *)
269         case "$cc" in
270             xlc) 
271               ;;
272             # we do not need the C++ compiler
273             xlC) 
274               cc=xlc 
275               ;;
276             *)
277         esac
278         ;;
279 esac
280 EOCBU
281
282 # This script UU/uselargefiles.cbu will get 'called-back' by Configure
283 # after it has prompted the user for whether to use large files.
284 cat > UU/uselargefiles.cbu <<'EOCBU'
285 case "$uselargefiles" in
286     ''|$define|true|[yY]*)
287         # Configure should take care of use64bitint and use64bitall being
288         # defined before uselargefiles.cbu is consulted.
289         if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
290 # Keep these at the left margin.
291 ccflags_uselargefiles="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
292 ldflags_uselargefiles="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
293         else
294 # Keep these at the left margin.
295 ccflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
296 ldflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
297             fi
298         if test X"$use64bitint:$quadtype" = X"$define:long" -o X"$use64bitall" = Xdefine; then
299 # Keep this at the left margin.
300 libswanted_uselargefiles="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g'`"
301         else
302 # Keep this at the left margin.
303 libswanted_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g'`"
304             fi
305
306         case "$ccflags_uselargefiles$ldflags_uselargefiles$libs_uselargefiles" in
307             '') ;;
308             *)  ccflags="$ccflags $ccflags_uselargefiles"
309                 ldflags="$ldflags $ldflags_uselargefiles"
310                 libswanted="$libswanted $libswanted_uselargefiles"
311                 ;;
312             esac
313
314         # -bmaxdata:0x80000000
315         # - This increases the size of heap memory available to perl.
316         #   Default is 256 MB, which sounds large but caused a software
317         #   vendor problems. So this sets heap to 2 GB maximum. Anything
318         #   higher and you'd want to consider 64 bit perl.
319         # - NOTE however, that setting this in 64bit mode will limit your
320         #   amount of available memory to 2GB, so we set this only in
321         #   32bit mode to avoid future problems a la "should be enough
322         #   for everyone" ...
323         #
324         case "$use64bitall" in
325             $define|true|[yY]*)
326                 :
327                 ;;
328             *)
329                 ldflags="$ldflags -bmaxdata:0x80000000"
330                 ;;
331             esac
332
333         case "$gccversion" in
334             '') # Not using gcc.
335                 # Due to calling $cc without $cflags when linking some
336                 # binaries we need to hardwire $cc to the right mode.
337                 # The correct fix would be to have Makefile.SH not set
338                 # CLDFLAGS from $ldflags ...
339                 case "$use64bitall" in
340                     $define|true|[yY]*) cc="$cc -q64"   ;;
341                     *)                  cc="$cc -q32"   ;;
342                     esac
343                 # Some 32-bit getconfs will set ccflags to include -qlonglong
344                 # but that's no longer needed with an explicit -qextc99.
345                 ccflags="`echo $ccflags | sed -e 's@ -qlonglong@@`"
346                 ;;
347             *)  # Remove xlc-specific -qflags.
348                 ccflags="`echo $ccflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
349                 ldflags="`echo $ldflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
350                 # Move xlc-specific -bflags.
351                 ccflags="`echo $ccflags | sed -e 's@ -b@ -Wl,-b@g'`"
352                 ldflags="`echo ' '$ldflags | sed -e 's@ -b@ -Wl,-b@g'`"
353                 lddlflags="`echo ' '$lddlflags | sed -e 's@ -b@ -Wl,-b@g'`"
354                 lddlflags="`echo ' '$lddlflags | sed -e 's@ -G @ -Wl,-G @g'`"
355
356                 # Due to calling $cc without $cflags when linking some
357                 # binaries we need to hardwire $cc to the right mode.
358                 case "$use64bitall" in
359                     $define|true|[yY]*)
360                         cc="$cc -maix64"
361                         ld="$cc"
362                         ;;
363                     *)
364                         cc="$cc -maix32"
365                         ld="$cc"
366                         ;;
367                     esac
368                 echo >&4 "(using ccflags   $ccflags)"
369                 echo >&4 "(using ldflags   $ldflags)"
370                 echo >&4 "(using lddlflags $lddlflags)"
371                 ;;
372             esac
373         ;;
374     esac
375 EOCBU
376
377 cat > UU/use64bitall.cbu <<'EOCBU'
378 # This script UU/use64bitall.cbu will get 'called-back' by Configure
379 # after it has prompted the user for whether to be maximally 64-bitty.
380 case "$use64bitall" in
381     $define|true|[yY]*)
382         echo " "
383         echo "Checking the CPU width of your hardware..." >&4
384         $cat >size.c <<EOCP
385 #include <stdio.h>
386 #include <sys/systemcfg.h>
387 int main (void)
388 {
389     printf ("%d\n", _system_configuration.width);
390     return (0);
391     }
392 EOCP
393         set size
394         if eval $compile_ok; then
395             qacpuwidth=`./size`
396             echo "You are running on $qacpuwidth bit hardware."
397         else
398             dflt="32"
399             echo " "
400             echo "(I can't seem to compile the test program.  Guessing...)"
401             rp="What is the width of your CPU (in bits)?"
402             . ./myread
403             qacpuwidth="$ans"
404             fi
405         $rm -f size.c size
406
407         case "$qacpuwidth" in
408             32*)
409                 cat >&4 <<EOM
410 Bzzzt! At present, you can only perform a
411 full 64-bit build on a 64-bit machine.
412 EOM
413                 exit 1
414                 ;;
415             esac
416         qacflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
417         qaldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
418         # See jhi's comments above regarding this re-eval.  I've
419         # seen similar weirdness in the form of:
420         #
421 # 1506-173 (W) Option lm is not valid.  Enter xlc for list of valid options.
422         #
423         # error messages from 'cc -E' invocation. Again, the offending
424         # string is simply not detectable by any means.  Since it doesn't
425         # do any harm, I didn't pursue it. -- sh
426         qaldflags="`echo $qaldflags`"
427         qalibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g'`"
428         # -q32 and -b32 may have been set by uselargefiles or user.
429         # Remove them.
430         ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
431         ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
432         case "$cc" in
433             *gcc*)
434                 ccflags="`echo $ccflags | sed -e 's@-q64@-maix64@'`"
435                 ccflags_uselargefiles="`echo $ccflags_uselargefiles | sed -e 's@-q64@-maix64@'`"
436                 qacflags="`echo $qacflags | sed -e 's@-q64@-maix64@'`"
437                 ;;
438             esac
439         # Tell archiver to use large format.  Unless we remove 'ar'
440         # from 'trylist', the Configure script will just reset it to 'ar'
441         # immediately prior to writing config.sh.  This took me hours
442         # to figure out.
443         trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @ @g' -e 's@ ar$@@'`"
444         ar="ar -X64"
445         nm_opt="-X64 $nm_opt"
446         case "$qacflags$qaldflags$qalibs" in
447             '') ;;
448             *)  ccflags="$ccflags $qacflags"
449                 ldflags="$ldflags"
450                 lddlflags="$qaldflags $lddlflags"
451                 libswanted="$libswanted $qalibs"
452                 ;;
453             esac
454         case "$ccflags" in
455             *-DUSE_64_BIT_ALL*) ;;
456             *) ccflags="$ccflags -DUSE_64_BIT_ALL";;
457             esac
458         case "$archname64" in
459             ''|64*) archname64=64all ;;
460             esac
461         longsize="8"
462         qacflags=''
463         qaldflags=''
464         qalibs=''
465         qacpuwidth=''
466         ;;
467     esac
468 EOCBU
469
470 if test $usenativedlopen = 'true' ; then
471     ccflags="$ccflags -DUSE_NATIVE_DLOPEN"
472     # -brtl                 Enables a binary to use run time linking
473     # -bdynamic             When used with -brtl, tells linker to search for
474     #                       ".so"-suffix libraries as well as ".a" suffix
475     #                       libraries. AIX allows both .so and .a libraries to
476     #                       contain dynamic shared objects.
477     case "$cc" in
478         *gcc*) ldflags="$ldflags -Wl,-brtl -Wl,-bdynamic" ;;
479         *)     ldflags="$ldflags -brtl -bdynamic" ;;
480         esac
481 elif test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
482     # If the C++ libraries, libC and libC_r, are available we will
483     # prefer them over the vanilla libc, because the libC contain
484     # loadAndInit() and terminateAndUnload() which work correctly
485     # with C++ statics while libc load() and unload() do not. See
486     # ext/DynaLoader/dl_aix.xs. The C-to-C_r switch is done by
487     # usethreads.cbu, if needed.
488
489     # Cify libswanted.
490     set `echo X "$libswanted "| sed -e 's/ c / C c /'`
491     shift
492     libswanted="$*"
493     # Cify lddlflags.
494     set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
495     shift
496     lddlflags="$*"
497     fi
498
499 case "$PASE" in
500     define)
501         case "$prefix" in
502             '') prefix=/QOpenSys/perl ;;
503             esac
504         cat >&4 <<EOF
505
506 ***
507 *** You seem to be compiling in AIX for the OS/400 PASE environment.
508 *** I'm not going to use the AIX bind, nsl, and possible util libraries, then.
509 *** I'm also not going to install perl as /usr/bin/perl.
510 *** Perl will be installed under $prefix.
511 *** For instructions how to install this build from AIX to PASE,
512 *** see the file README.os400.  Accept the "aix" for the question
513 *** about "Operating system name".
514 ***
515 EOF
516         set `echo " $libswanted " | sed -e 's@ bind @ @' -e 's@ nsl @ @' -e 's@ util @ @'`
517         shift
518         libswanted="$*"
519         installusrbinperl="$undef"
520
521         # V5R1 doesn't have this (V5R2 does), without knowing
522         # which one we have it's safer to be pessimistic.
523         # Cwd will work fine even without fchdir(), but if
524         # V5R1 tries to use code compiled assuming fchdir(),
525         # lots of grief will issue forth from Cwd.
526         case "$d_fchdir" in
527             '') d_fchdir="$undef" ;;
528             esac
529         ;;
530     esac
531
532 # remove libbsd.a from wanted libraries
533 libswanted=`echo " $libswanted " | sed -e 's/ bsd / /'`
534 libswanted=`echo " $libswanted " | sed -e 's/ BSD / /'`
535 d_flock='undef'
536
537 # remove libgdbm from wanted libraries
538 # The libgdbm < 1.8.3-5 from the AIX Toolbox is not working
539 # because two wrong .h are present
540 if [ -f "/opt/freeware/include/gdbm/dbm.h" ] ||
541    [ -f "/opt/freeware/include/gdbm/ndbm.h" ]; then
542     echo "GDBM support disabled because your GDBM package contains extraneous headers - see README.aix."
543     libswanted=`echo " $libswanted " | sed -e 's/ gdbm / /'`
544     i_gdbm='undef'
545     i_gdbmndbm='undef'
546 fi
547 # EOF