(Retracted by #9155)
[p5sagit/p5-mst-13.2.git] / hints / aix.sh
1 # hints/aix.sh
2 # AIX 3.x.x hints thanks to Wayne Scott <wscott@ichips.intel.com>
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@lafcol.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 using nm for symbol extraction
55 case "$osvers" in
56    3.*|4.1.*|4.2.*)
57       usenm='undef'
58       usenativedlopen='false'
59       ;;
60    *)
61       usenm='true'
62       usenativedlopen='true'
63       ;;
64 esac
65
66 so="a"
67 # AIX itself uses .o (libc.o) but we prefer compatibility
68 # with the rest of the world and with rest of the scripting
69 # languages (Tcl, Python) and related systems (SWIG).
70 # Stephanie Beals <bealzy@us.ibm.com>
71 dlext="so"
72
73 # Take possible hint from the environment.  If 32-bit is set in the
74 # environment, we can override it later.  If set for 64, the
75 # 'sizeof' test sees a native 64-bit architecture and never looks back.
76 case "$OBJECT_MODE" in
77 32)
78     cat >&4 <<EOF
79
80 You have OBJECT_MODE=32 set in the environment. 
81 I take this as a hint you do not want to
82 build for a 64-bit address space. You will be
83 given the opportunity to change this later.
84 EOF
85     ;;
86 64)
87     cat >&4 <<EOF
88
89 You have OBJECT_MODE=64 set in the environment. 
90 This forces a full 64-bit build.  If that is
91 not what you intended, please terminate this
92 program, unset it and restart.
93 EOF
94     ;;
95 *)  ;;
96 esac
97
98 # Trying to set this breaks the POSIX.c compilation
99
100 # Make setsockopt work correctly.  See man page.
101 # ccflags='-D_BSD=44'
102
103 # uname -m output is too specific and not appropriate here
104 case "$archname" in
105 '') archname="$osname" ;;
106 esac
107
108 cc=${cc:-cc}
109
110 case "$osvers" in
111 3*) d_fchmod=undef
112     ccflags="$ccflags -D_ALL_SOURCE"
113     ;;
114 *)  # These hints at least work for 4.x, possibly other systems too.
115     ccflags="$ccflags -D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE"
116     case "$cc" in
117      *gcc*) ;;
118      *) ccflags="$ccflags -qmaxmem=16384" ;;
119     esac
120     nm_opt='-B'
121     ;;
122 esac
123
124 # These functions don't work like Perl expects them to.
125 d_setregid='undef'
126 d_setreuid='undef'
127
128 # Changes for dynamic linking by Wayne Scott <wscott@ichips.intel.com>
129 #
130 # Tell perl which symbols to export for dynamic linking.
131 case "$cc" in
132 *gcc*) ccdlflags='-Xlinker' ;;
133 *) ccversion=`lslpp -L | grep 'C for AIX Compiler$' | awk '{print $2}'`
134    case "$ccversion" in
135      '') ccversion=`lslpp -L | grep 'IBM C and C++ Compilers LUM$' | awk '{print $2}'`
136         ;;
137      esac
138    case "$ccversion" in
139      3.6.6.0)
140         optimize='none'
141         ;;
142      4.4.0.0|4.4.0.1|4.4.0.2)
143         cat >&4 <<EOF
144 ***
145 *** This C compiler ($ccversion) is outdated.
146 ***
147 *** Please upgrade to at least 4.4.0.3.
148 ***
149 EOF
150         ;;
151      5.0.1.0)
152         cat >&4 <<EOF
153 ***
154 *** This C compiler ($ccversion) is known to have optimizer problems
155 *** when compiling regcomp.c.
156 ***
157 *** Disabling optimization for that file but consider upgrading
158 *** your C compiler.
159 ***
160 EOF
161 regcomp_cflags='optimize='
162         ;;
163      esac
164 esac
165 # the required -bE:$installarchlib/CORE/perl.exp is added by
166 # libperl.U (Configure) later.
167
168 case "$ldlibpthname" in
169 '') ldlibpthname=LIBPATH ;;
170 esac
171
172 # The first 3 options would not be needed if dynamic libs. could be linked
173 # with the compiler instead of ld.
174 # -bI:$(PERL_INC)/perl.exp  Read the exported symbols from the perl binary
175 # -bE:$(BASEEXT).exp        Export these symbols.  This file contains only one
176 #                           symbol: boot_$(EXP)  can it be auto-generated?
177 case "$osvers" in
178 3*) 
179     lddlflags="$lddlflags -H512 -T512 -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -e _nostart -lc"
180     ;;
181 *) 
182     lddlflags="$lddlflags -bhalt:4 -bM:SRE -bI:\$(PERL_INC)/perl.exp -bE:\$(BASEEXT).exp -b noentry -lc"
183     ;;
184 esac
185 # AIX 4.2 (using latest patchlevels on 20001130) has a broken bind
186 # library (getprotobyname and getprotobynumber are outversioned by
187 # the same calls in libc, at least for xlc version 3...
188 case "`oslevel`" in
189     4.2.1.*)  # Test for xlc version too, should we?
190       case "$ccversion" in    # Don't know if needed for gcc
191           3.1.4.*)    # libswanted "bind ... c ..." => "... c bind ..."
192               set `echo X "$libswanted "| sed -e 's/ bind\( .*\) \([cC]\) / \1 \2 bind /'`
193               shift
194               libswanted="$*"
195               ;;
196           esac
197       ;;
198     esac
199
200 # This script UU/usethreads.cbu will get 'called-back' by Configure 
201 # after it has prompted the user for whether to use threads.
202 cat > UU/usethreads.cbu <<'EOCBU'
203 case "$usethreads" in
204 $define|true|[yY]*)
205         ccflags="$ccflags -DNEED_PTHREAD_INIT"
206         case "$cc" in
207         gcc) ;;
208         cc_r) ;;
209         cc|xl[cC]_r) 
210             echo >&4 "Switching cc to cc_r because of POSIX threads."
211             # xlc_r has been known to produce buggy code in AIX 4.3.2.
212             # (e.g. pragma/overload core dumps)  Let's suspect xlC_r, too.
213             # --jhi@iki.fi
214             cc=cc_r
215             ;;
216         '') 
217             cc=cc_r
218             ;;
219         *)
220             cat >&4 <<EOM
221 *** For pthreads you should use the AIX C compiler cc_r.
222 *** (now your compiler was set to '$cc')
223 *** Cannot continue, aborting.
224 EOM
225             exit 1
226             ;;
227         esac
228
229         # c_rify libswanted.
230         set `echo X "$libswanted "| sed -e 's/ \([cC]\) / \1_r /g'`
231         shift
232         libswanted="$*"
233         # c_rify lddlflags.
234         set `echo X "$lddlflags "| sed -e 's/ \(-l[cC]\) / \1_r /g'`
235         shift
236         lddlflags="$*"
237
238         # Insert pthreads to libswanted, before any libc or libC.
239         set `echo X "$libswanted "| sed -e 's/ \([cC]\) / pthreads \1 /'`
240         shift
241         libswanted="$*"
242         # Insert pthreads to lddlflags, before any libc or libC.
243         set `echo X "$lddlflags " | sed -e 's/ \(-l[cC]\) / -lpthreads \1 /'`
244         shift
245         lddlflags="$*"
246
247         ;;
248 esac
249 EOCBU
250
251 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
252 # after it has prompted the user for whether to use large files.
253 cat > UU/uselargefiles.cbu <<'EOCBU'
254 case "$uselargefiles" in
255 ''|$define|true|[yY]*)
256 # Keep these at the left margin.
257 ccflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_CFLAGS 2>/dev/null`"
258 ldflags_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LDFLAGS 2>/dev/null`"
259         # _Somehow_ in AIX 4.3.1.0 the above getconf call manages to
260         # insert(?) *something* to $ldflags so that later (in Configure) evaluating
261         # $ldflags causes a newline after the '-b64' (the result of the getconf).
262         # (nothing strange shows up in $ldflags even in hexdump;
263         #  so it may be something (a bug) in the shell, instead?)
264         # Try it out: just uncomment the below line and rerun Configure:
265 # echo >&4 "AIX 4.3.1.0 $ldflags_uselargefiles mystery" ; exit 1
266         # Just don't ask me how AIX does it, I spent hours wondering.
267         # Therefore the line re-evaluating ldflags_uselargefiles: it seems to fix
268         # the whatever it was that AIX managed to break. --jhi
269         ldflags_uselargefiles="`echo $ldflags_uselargefiles`"
270 # Keep this at the left margin.
271 libswanted_uselargefiles="`getconf XBS5_ILP32_OFFBIG_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
272         case "$ccflags_uselargefiles$ldflags_uselargefiles$libs_uselargefiles" in
273         '');;
274         *) ccflags="$ccflags $ccflags_uselargefiles"
275            ldflags="$ldflags $ldflags_uselargefiles"
276            libswanted="$libswanted $libswanted_uselargefiles"
277            ;;
278         esac
279         case "$gccversion" in
280         '') ;;
281         *)
282         cat >&4 <<EOM
283
284 *** Warning: gcc in AIX might not work with the largefile support of Perl
285 *** (default since 5.6.0), this combination hasn't been tested.
286 *** I will try, though.
287
288 EOM
289         # Remove xlc-spefific -qflags.
290         ccflags="`echo $ccflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
291         ldflags="`echo $ldflags | sed -e 's@ -q[^ ]*@ @g' -e 's@^-q[^ ]* @@g'`"
292         echo >&4 "(using ccflags $ccflags)"
293         echo >&4 "(using ldflags $ldflags)"
294         ;; 
295         esac
296         ;;
297 esac
298 EOCBU
299
300 # This script UU/use64bitint.cbu will get 'called-back' by Configure 
301 # after it has prompted the user for whether to use 64 bit integers.
302 cat > UU/use64bitint.cbu <<'EOCBU'
303 case "$use64bitint" in
304 $define|true|[yY]*)
305             case "`oslevel`" in
306             3.*|4.[012].*)
307                 cat >&4 <<EOM
308 AIX `oslevel` does not support 64-bit interfaces.
309 You should upgrade to at least AIX 4.3.
310 EOM
311                 exit 1
312                 ;;
313             esac
314             ;;
315 esac
316 EOCBU
317
318 cat > UU/use64bitall.cbu <<'EOCBU'
319 # This script UU/use64bitall.cbu will get 'called-back' by Configure 
320 # after it has prompted the user for whether to be maximally 64-bitty.
321 case "$use64bitall" in
322 $define|true|[yY]*)
323             case "`oslevel`" in
324             3.*|4.[012].*)
325                 cat >&4 <<EOM
326 AIX `oslevel` does not support 64-bit interfaces.
327 You should upgrade to at least AIX 4.3.
328 EOM
329                 exit 1
330                 ;;
331             esac
332             echo " "
333             echo "Checking the CPU width of your hardware..." >&4
334             $cat >size.c <<EOCP
335 #include <stdio.h>
336 #include <sys/systemcfg.h>
337 int main (void)
338 {
339   printf("%d\n",_system_configuration.width);
340   return(0);
341 }
342 EOCP
343             set size
344             if eval $compile_ok; then
345                 qacpuwidth=`./size`
346                 echo "You are running on $qacpuwidth bit hardware."
347             else
348                 dflt="32"
349                 echo " "
350                 echo "(I can't seem to compile the test program.  Guessing...)"
351                 rp="What is the width of your CPU (in bits)?"
352                 . ./myread
353                 qacpuwidth="$ans"
354             fi
355             $rm -f size.c size
356             case "$qacpuwidth" in
357             32*)
358                 cat >&4 <<EOM
359 Bzzzt! At present, you can only perform a
360 full 64-bit build on a 64-bit machine.
361 EOM
362                 exit 1
363                 ;;
364             esac
365             qacflags="`getconf XBS5_LP64_OFF64_CFLAGS 2>/dev/null`"
366             qaldflags="`getconf XBS5_LP64_OFF64_LDFLAGS 2>/dev/null`"
367             # See jhi's comments above regarding this re-eval.  I've
368             # seen similar weirdness in the form of:
369             #
370 # 1506-173 (W) Option lm is not valid.  Enter xlc for list of valid options.
371             #
372             # error messages from 'cc -E' invocation. Again, the offending
373             # string is simply not detectable by any means.  Since it doesn't
374             # do any harm, I didn't pursue it. -- sh
375             qaldflags="`echo $qaldflags`"
376             qalibs="`getconf XBS5_LP64_OFF64_LIBS 2>/dev/null|sed -e 's@^-l@@' -e 's@ -l@ @g`"
377             # -q32 and -b32 may have been set by uselargefiles or user.
378             # Remove them.
379             ccflags="`echo $ccflags | sed -e 's@-q32@@'`"
380             ldflags="`echo $ldflags | sed -e 's@-b32@@'`"
381             # Tell archiver to use large format.  Unless we remove 'ar'
382             # from 'trylist', the Configure script will just reset it to 'ar'
383             # immediately prior to writing config.sh.  This took me hours
384             # to figure out.
385             trylist="`echo $trylist | sed -e 's@^ar @@' -e 's@ ar @ @g' -e 's@ ar$@@'`"
386             ar="ar -X64"
387             nm_opt="-X64 $nm_opt"
388             # Note: Placing the 'qacflags' variable into the 'ldflags' string
389             # is NOT a typo.  ldqalags is passed to the C compiler for final
390             # linking, and it wants -q64 (-b64 is for ld only!).
391             case "$qacflags$qaldflags$qalibs" in
392             '');;
393             *) ccflags="$ccflags $qacflags"
394                ldflags="$ldflags $qacflags"
395                lddqalags="$qaldflags $lddqalags"
396                libswanted="$libswanted $qalibs"
397                ;;
398             esac
399             case "$ccflags" in
400             *-DUSE_64_BIT_ALL*) ;;
401             *) ccflags="$ccflags -DUSE_64_BIT_ALL";;
402             esac
403             case "$archname64" in
404             ''|64*) archname64=64all ;;
405             esac
406             longsize="8"
407             # Don't try backwards compatibility
408             bincompat="$undef"
409             d_bincompat5005="$undef"
410             qacflags=''
411             qaldflags=''
412             qalibs=''
413             qacpuwidth=''
414             ;;
415 esac
416 EOCBU
417
418 cat > UU/uselongdouble.cbu <<'EOCBU'
419 # This script UU/uselongdouble.cbu will get 'called-back' by Configure 
420 # after it has prompted the user for whether to use long doubles.
421 case "$uselongdouble" in
422 $define|true|[yY]*)
423         case "$cc" in
424         *gcc*) ;;
425         *) ccflags="$ccflags -qlongdouble" ;;
426         esac
427         # The explicit cc128, xlc128, xlC128 are not needed,
428         # the -qlongdouble should do the trick. --jhi
429         d_Gconvert='sprintf((b),"%.*llg",(n),(x))'
430         ;;
431 esac
432 EOCBU
433
434 if test $usenativedlopen = 'true'
435 then
436         ccflags="$ccflags -DUSE_NATIVE_DLOPEN"
437 else
438     # If the C++ libraries, libC and libC_r, are available we will prefer them
439     # over the vanilla libc, because the libC contain loadAndInit() and
440     # terminateAndUnload() which work correctly with C++ statics while libc
441     # load() and unload() do not.  See ext/DynaLoader/dl_aix.xs.
442     # The C-to-C_r switch is done by usethreads.cbu, if needed.
443     if test -f /lib/libC.a -a X"`$cc -v 2>&1 | grep gcc`" = X; then
444         # Cify libswanted.
445         set `echo X "$libswanted "| sed -e 's/ c / C c /'`
446         shift
447         libswanted="$*"
448         # Cify lddlflags.
449         set `echo X "$lddlflags "| sed -e 's/ -lc / -lC -lc /'`
450         shift
451         lddlflags="$*"
452     fi
453 fi
454
455 # EOF