Re: perl@15244
[p5sagit/p5-mst-13.2.git] / hints / hpux.sh
1 #!/usr/bin/sh
2
3 ### SYSTEM ARCHITECTURE
4
5 # Determine the architecture type of this system.
6 # Keep leading tab below -- Configure Black Magic -- RAM, 03/02/97
7         xxOsRevMajor=`uname -r | sed -e 's/^[^0-9]*//' | cut -d. -f1`;
8 if [ "$xxOsRevMajor" -ge 10 ]; then
9     # This system is running >= 10.x
10
11     # Tested on 10.01 PA1.x and 10.20 PA[12].x.
12     # Idea: Scan /usr/include/sys/unistd.h for matches with
13     # "#define CPU_* `getconf # CPU_VERSION`" to determine CPU type.
14     # Note the text following "CPU_" is used, *NOT* the comment.
15     #
16     # ASSUMPTIONS: Numbers will continue to be defined in hex -- and in
17     # /usr/include/sys/unistd.h -- and the CPU_* #defines will be kept
18     # up to date with new CPU/OS releases.
19     xxcpu=`getconf CPU_VERSION`; # Get the number.
20     xxcpu=`printf '0x%x' $xxcpu`; # convert to hex
21     archname=`sed -n -e "s/^#[ \t]*define[ \t]*CPU_//p" /usr/include/sys/unistd.h |
22         sed -n -e "s/[ \t]*$xxcpu[ \t].*//p" |
23         sed -e s/_RISC/-RISC/ -e s/HP_// -e s/_/./ -e "s/[[:space:]]*//g"`;
24 else
25     # This system is running <= 9.x
26     # Tested on 9.0[57] PA and [78].0 MC680[23]0.  Idea: After removing
27     # MC6888[12] from context string, use first CPU identifier.
28     #
29     # ASSUMPTION: Only CPU identifiers contain no lowercase letters.
30     archname=`getcontext | tr ' ' '\012' | grep -v '[a-z]' | grep -v MC688 |
31         sed -e 's/HP-//' -e 1q`;
32     selecttype='int *'
33     fi
34     # For some strange reason, the u32align test from Configure hangs in
35     # HP-UX 10.20 since the December 2001 patches.  So hint it to avoid
36     # the test.
37     if [ "$xxOsRevMajor" -le 10 ]; then
38         d_u32align=$define
39     fi
40
41 echo "Archname is $archname"
42
43
44 ### HP-UX OS specific behaviour
45
46 # -ldbm is obsolete and should not be used
47 # -lBSD contains BSD-style duplicates of SVR4 routines that cause confusion
48 # -lPW is obsolete and should not be used
49 # The libraries crypt, malloc, ndir, and net are empty.
50 set `echo "X $libswanted " | sed -e 's/ ld / /' -e 's/ dbm / /' -e 's/ BSD / /' -e 's/ PW / /'`
51 shift
52 libswanted="$*"
53
54 cc=${cc:-cc}
55 ar=/usr/bin/ar  # Yes, truly override.  We do not want the GNU ar.
56 full_ar=$ar     # I repeat, no GNU ar.  arrr.
57
58 set `echo "X $ccflags " | sed -e 's/ -A[ea] / /' -e 's/ -D_HPUX_SOURCE / /'`
59 shift
60         cc_cppflags="$* -D_HPUX_SOURCE"
61 cppflags="-Aa -D__STDC_EXT__ $cc_cppflags"
62
63 case "$prefix" in
64     "") prefix='/opt/perl5' ;;
65     esac
66
67     gnu_as=no
68     gnu_ld=no
69 case `$cc -v 2>&1`"" in
70     *gcc*)  ccisgcc="$define"
71             ccflags="$cc_cppflags"
72             if [ "X$gccversion" = "X" ]; then
73                 # Done too late in Configure if hinted
74                 gccversion=`$cc --version`
75                 fi
76            case "$gccversion" in
77                [012]*) # HP-UX and gcc-2.* break UINT32_MAX :-(
78                        ccflags="$ccflags -DUINT32_MAX_BROKEN"
79                        ;;
80                esac
81             case "`getconf KERNEL_BITS 2>/dev/null`" in
82                 *64*)
83                     echo "main(){}">try.c
84                     case "$gccversion" in
85                         3*) ccflags="$ccflags -mpa-risc-2-0"
86                             ;;
87                         *)  # gcc with gas will not accept +DA2.0
88                             case "`$cc -c -Wa,+DA2.0 try.c 2>&1`" in
89                                 *"+DA2.0"*)             # gas
90                                     gnu_as=yes
91                                     ;;
92                                 *)                      # HPas
93                                     ccflags="$ccflags -Wa,+DA2.0"
94                                     ;;
95                                 esac
96                             ;;
97                         esac
98                     # gcc with gld will not accept +vnocompatwarnings
99                     case "`$cc -o try -Wl,+vnocompatwarnings try.c 2>&1`" in
100                         *"+vnocompat"*)         # gld
101                             gnu_ld=yes
102                             ;;
103                         *)                      # HPld
104                            case "$gccversion" in
105                                [12]*)
106                                    ldflags="$ldflags -Wl,+vnocompatwarnings"
107                                    ccflags="$ccflags -Wl,+vnocompatwarnings"
108                                    ;;
109                                esac
110                             ;;
111                         esac
112                     rm -f try.c
113                     ;;
114                 esac
115             ;;
116     *)      ccisgcc=''
117             ccversion=`which cc | xargs what | awk '/Compiler/{print $2}'`
118             case "$ccflags" in
119             "-Ae "*) ;;
120             *) ccflags="-Ae $cc_cppflags -Wl,+vnocompatwarnings" ;;
121             esac
122             # Needed because cpp does only support -Aa (not -Ae)
123             cpplast='-'
124             cppminus='-'
125             cppstdin='cc -E -Aa -D__STDC_EXT__'
126             cpprun=$cppstdin
127 #           case "$d_casti32" in
128 #               "") d_casti32='undef' ;;
129 #               esac
130             ;;
131     esac
132
133 # When HP-UX runs a script with "#!", it sets argv[0] to the script name.
134 toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
135
136 ### 64 BITNESS
137
138 # Some gcc versions do native 64 bit long (e.g. 2.9-hppa-000310 and gcc-3.0)
139 # We have to force 64bitness to go search the right libraries
140     gcc_64native=no
141 case "$ccisgcc" in
142     $define|true|[Yy])
143         echo 'int main(){long l;printf("%d\\n",sizeof(l));}'>try.c
144         $cc -o try $ccflags $ldflags try.c
145         if [ "`try`" = "8" ]; then
146             cat <<EOM >&4
147
148 *** This version of gcc uses 64 bit longs. -Duse64bitall is
149 *** implicitly set to enable continuation
150 EOM
151             use64bitall=$define
152             gcc_64native=yes
153             fi
154         ;;
155     esac
156
157 case "$use64bitall" in
158     $define|true|[yY]*) use64bitint="$define" ;;
159     esac
160
161 case "$usemorebits" in
162     $define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;;
163     esac
164
165 case "$archname" in
166     IA64*)
167         # While here, override so=sl auto-detection
168         so='so'
169         ;;
170     *)
171     case "$uselongdouble" in
172         *) ;;
173         $define|true|[yY]*)
174             cat <<EOM >&4
175
176 *** long doubles are not (yet) supported on HP-UX (any version)
177 *** Until it does, we cannot continue, aborting.
178 EOM
179             exit 1 ;;
180         esac
181         ;;
182     esac
183
184 case "$use64bitint" in
185     $define|true|[Yy])
186
187         if [ "$xxOsRevMajor" -lt 11 ]; then
188             cat <<EOM >&4
189
190 *** 64-bit compilation is not supported on HP-UX $xxOsRevMajor.
191 *** You need at least HP-UX 11.0.
192 *** Cannot continue, aborting.
193 EOM
194             exit 1
195             fi
196
197         # Set libc and the library paths
198         case "$archname" in
199             PA-RISC*)
200                 loclibpth="$loclibpth /lib/pa20_64"
201                 libc='/lib/pa20_64/libc.sl' ;;
202             IA64*) 
203                 loclibpth="$loclibpth /usr/lib/hpux64"
204                 libc='/usr/lib/hpux64/libc.so' ;;
205             esac
206         if [ ! -f "$libc" ]; then
207             cat <<EOM >&4
208
209 *** You do not seem to have the 64-bit libc.
210 *** I cannot find the file $libc.
211 *** Cannot continue, aborting.
212 EOM
213             exit 1
214             fi
215
216         case "$ccisgcc" in
217             $define|true|[Yy])
218                 # For the moment, don't care that it ain't supported (yet)
219                 # by gcc (up to and including 2.95.3), cause it'll crash
220                 # anyway. Expect auto-detection of 64-bit enabled gcc on
221                 # HP-UX soon, including a user-friendly exit
222                 case $gcc_64native in
223                     no) case "$gccversion" in
224                             [12]*)  ccflags="$ccflags -mlp64"
225                                     ldflags="$ldflags -Wl,+DD64"
226                                     ;;
227                             esac
228                         ;;
229                     esac
230                 ;;
231             *)
232                 ccflags="$ccflags +DD64"
233                 ldflags="$ldflags +DD64"
234                 ;;
235             esac
236
237         # Reset the library checker to make sure libraries
238         # are the right type
239         # (NOTE: on IA64, this doesn't work with .a files.)
240         libscheck='case "`/usr/bin/file $xxx`" in
241                        *ELF-64*|*LP64*|*PA-RISC2.0*) ;;
242                        *) xxx=/no/64-bit$xxx ;;
243                        esac'
244
245         ;;
246
247     *)  # Not in 64-bit mode
248
249         case "$archname" in
250             PA-RISC*)
251                 libc='/lib/libc.sl' ;;
252             IA64*) 
253                 loclibpth="$loclibpth /usr/lib/hpux32"
254                 libc='/usr/lib/hpux32/libc.so' ;;
255             esac
256         ;;
257     esac
258
259 # By setting the deferred flag below, this means that if you run perl
260 # on a system that does not have the required shared library that you
261 # linked it with, it will die when you try to access a symbol in the
262 # (missing) shared library.  If you would rather know at perl startup
263 # time that you are missing an important shared library, switch the
264 # comments so that immediate, rather than deferred loading is
265 # performed.  Even with immediate loading, you can postpone errors for
266 # undefined (or multiply defined) routines until actual access by
267 # adding the "nonfatal" option.
268 # ccdlflags="-Wl,-E -Wl,-B,immediate $ccdlflags"
269 # ccdlflags="-Wl,-E -Wl,-B,immediate,-B,nonfatal $ccdlflags"
270 if [ "$gnu_ld" = "yes" ]; then
271     ccdlflags="-Wl,-E $ccdlflags"
272 else
273     ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
274     fi
275
276
277 ### COMPILER SPECIFICS
278
279 ## Local restrictions (point to README.hpux to lift these)
280
281 ## Optimization limits
282 cat >try.c <<EOF
283 #include <sys/resource.h>
284
285 int main ()
286 {
287     struct rlimit rl;
288     int i = getrlimit (RLIMIT_DATA, &rl);
289     printf ("%d\n", rl.rlim_cur / (1024 * 1024));
290     } /* main */
291 EOF
292 $cc -o try $ccflags $ldflags try.c
293         maxdsiz=`try`
294 rm -f try try.c core
295 if [ $maxdsiz -le 64 ]; then
296     # 64 Mb is probably not enough to optimize toke.c
297     # and regexp.c with -O2
298     cat <<EOM >&4
299 Your kernel limits the data section of your programs to $maxdsiz Mb,
300 which is (sadly) not enough to fully optimize some parts of the
301 perl binary. I'll try to use a lower optimization level for
302 those parts. If you are a sysadmin, and you *do* want full
303 optimization, raise the 'maxdsiz' kernel configuration parameter
304 to at least 0x08000000 (128 Mb) and rebuild your kernel.
305 EOM
306 regexec_cflags=''
307 doop_cflags=''
308     fi
309
310 case "$ccisgcc" in
311     $define|true|[Yy])
312         
313         case "$optimize" in
314             "")           optimize="-g -O" ;;
315             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
316             esac
317         #ld="$cc"
318         ld=/usr/bin/ld
319         cccdlflags='-fPIC'
320         #lddlflags='-shared'
321         lddlflags='-b'
322         case "$optimize" in
323             *-g*-O*|*-O*-g*)
324                 # gcc without gas will not accept -g
325                 echo "main(){}">try.c
326                 case "`$cc $optimize -c try.c 2>&1`" in
327                     *"-g option disabled"*)
328                         set `echo "X $optimize " | sed -e 's/ -g / /'`
329                         shift
330                         optimize="$*"
331                         ;;
332                     esac
333                 ;;
334             esac
335         if [ $maxdsiz -le 64 ]; then
336             case "$optimize" in
337                 *O2*)   opt=`echo "$optimize" | sed -e 's/O2/O1/'`
338                         toke_cflags="$toke_cflags;optimize=\"$opt\""
339                         regexec_cflags="optimize=\"$opt\""
340                         ;;
341                 esac
342             fi
343         ;;
344
345     *)  # HP's compiler cannot combine -g and -O
346         case "$optimize" in
347             "")           optimize="+O2 +Onolimit" ;;
348             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
349             esac
350         case "$optimize" in
351             *-O*|\
352             *O2*)    opt=`echo "$optimize" | sed -e 's/-O/+O2/' -e 's/O2/O1/' -e 's/ *+Onolimit//'`
353                     ;;
354             *)  opt="$optimize"
355                 ;;
356                 esac
357         if [ $maxdsiz -le 64 ]; then
358                 toke_cflags="$toke_cflags;optimize=\"$opt\""
359                 regexec_cflags="optimize=\"$opt\""
360             fi
361         case "$archname" in
362             IA64*)
363                 doop_cflags="optimize=\"$opt\""
364                 ;;
365             esac
366         ld=/usr/bin/ld
367         cccdlflags='+Z'
368         lddlflags='-b +vnocompatwarnings'
369         ;;
370     esac
371
372 ## LARGEFILES
373
374 #case "$uselargefiles-$ccisgcc" in
375 #    "$define-$define"|'-define') 
376 #       cat <<EOM >&4
377 #
378 #*** I'm ignoring large files for this build because
379 #*** I don't know how to do use large files in HP-UX using gcc.
380 #
381 #EOM
382 #       uselargefiles="$undef"
383 #       ;;
384 #    esac
385
386 cat >UU/uselargefiles.cbu <<'EOCBU'
387 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
388 # after it has prompted the user for whether to use large files.
389 case "$uselargefiles" in
390     ""|$define|true|[yY]*)
391         # there are largefile flags available via getconf(1)
392         # but we cheat for now.  (Keep that in the left margin.)
393 ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
394
395         case " $ccflags " in
396         *" $ccflags_uselargefiles "*) ;;
397         *) ccflags="$ccflags $ccflags_uselargefiles" ;;
398         esac
399
400         if test -z "$ccisgcc" -a -z "$gccversion"; then
401             # The strict ANSI mode (-Aa) doesn't like large files.
402             ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
403             case "$ccflags" in
404                 *-Ae*) ;;
405                 *)     ccflags="$ccflags -Ae" ;;
406                 esac
407             fi
408         ;;
409     esac
410 EOCBU
411
412 # THREADING
413
414 # This script UU/usethreads.cbu will get 'called-back' by Configure 
415 # after it has prompted the user for whether to use threads.
416 cat >UU/usethreads.cbu <<'EOCBU'
417 case "$usethreads" in
418     $define|true|[yY]*)
419         if [ "$xxOsRevMajor" -lt 10 ]; then
420             cat <<EOM >&4
421
422 HP-UX $xxOsRevMajor cannot support POSIX threads.
423 Consider upgrading to at least HP-UX 11.
424 Cannot continue, aborting.
425 EOM
426             exit 1
427             fi
428
429         if [ "$xxOsRevMajor" -eq 10 ]; then
430             # Under 10.X, a threaded perl can be built
431             if [ -f /usr/include/pthread.h ]; then
432                 if [ -f /usr/lib/libcma.sl ]; then
433                     # DCE (from Core OS CD) is installed
434
435                    # Check if it is pristine, or patched
436                    cmavsn=`what /usr/lib/libcma.sl 2>&1 | grep 1996`
437                    if [ ! -z "$cmavsn" ]; then
438                        cat <<EOM >&4
439 \a
440 ***************************************************************************
441
442 Perl will support threading through /usr/lib/libcma.sl from
443 the HP DCE package, but the version found is too old to be
444 reliable.
445
446 If you are not depending on this specific version of the library,
447 consider to upgrade using patch PHSS_23672 (read README.hpux)
448
449 ***************************************************************************
450
451 (sleeping for 10 seconds...)
452 EOM
453                           sleep 10
454                        fi
455
456                     # It needs # libcma and OLD_PTHREADS_API. Also
457                     # <pthread.h> needs to be #included before any
458                     # other includes (in perl.h)
459
460                     # HP-UX 10.X uses the old pthreads API
461                     d_oldpthreads="$define"
462
463                     # include libcma before all the others
464                     libswanted="cma $libswanted"
465
466                     # tell perl.h to include <pthread.h> before other
467                     # include files
468                     ccflags="$ccflags -DPTHREAD_H_FIRST"
469
470                     # CMA redefines select to cma_select, and cma_select
471                     # expects int * instead of fd_set * (just like 9.X)
472                     selecttype='int *'
473
474                 elif [ -f /usr/lib/libpthread.sl ]; then
475                     # PTH package is installed
476                     libswanted="pthread $libswanted"
477                 else
478                     libswanted="no_threads_available"
479                     fi
480             else
481                 libswanted="no_threads_available"
482                 fi
483
484             if [ $libswanted = "no_threads_available" ]; then
485                 cat <<EOM >&4
486
487 In HP-UX 10.X for POSIX threads you need both of the files
488 /usr/include/pthread.h and either /usr/lib/libcma.sl or /usr/lib/libpthread.sl.
489 Either you must upgrade to HP-UX 11 or install a posix thread library:
490
491     DCE-CoreTools from HP-UX 10.20 Hardware Extensions 3.0 CD (B3920-13941)
492
493 or
494
495     PTH package from e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html
496
497 Cannot continue, aborting.
498 EOM
499                 exit 1
500                 fi
501         else
502             # 12 may want upping the _POSIX_C_SOURCE datestamp...
503             ccflags=" -D_POSIX_C_SOURCE=199506L -D_REENTRANT $ccflags"
504             set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
505             shift
506             libswanted="$*"
507             fi
508
509         usemymalloc='n'
510         ;;
511     esac
512 EOCBU
513
514 # fpclassify() is a macro, the library call is Fpclassify
515 # Similarly with the others below.
516 d_fpclassify='define'
517 d_isnan='define'
518 d_isinf='define'
519 d_isfinite='define'
520 d_unordered='define'