This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [RE-PATCH] Not OK: perl v5.8.0 on PA-RISC2.0 11.00
[perl5.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/^#[[:space:]]*define[[:space:]]*CPU_//p" /usr/include/sys/unistd.h |
22         sed -n -e "s/[[:space:]]*$xxcpu[[:space:]].*//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
35 # For some strange reason, the u32align test from Configure hangs in
36 # HP-UX 10.20 since the December 2001 patches.  So hint it to avoid
37 # the test.
38 if [ "$xxOsRevMajor" -le 10 ]; then
39     d_u32align=$define
40     fi
41
42 echo "Archname is $archname"
43
44 # Fix XSlib (CPAN) confusion when re-using a prefix but changing from ILP32
45 # to LP64 builds.  They're NOT binary compatible, so quit claiming they are.
46 archname64=LP64
47
48
49 ### HP-UX OS specific behaviour
50
51 # -ldbm is obsolete and should not be used
52 # -lBSD contains BSD-style duplicates of SVR4 routines that cause confusion
53 # -lPW is obsolete and should not be used
54 # The libraries crypt, malloc, ndir, and net are empty.
55 set `echo "X $libswanted " | sed -e 's/ ld / /' -e 's/ dbm / /' -e 's/ BSD / /' -e 's/ PW / /'`
56 shift
57 libswanted="$*"
58
59 cc=${cc:-cc}
60 ar=/usr/bin/ar  # Yes, truly override.  We do not want the GNU ar.
61 full_ar=$ar     # I repeat, no GNU ar.  arrr.
62
63 set `echo "X $ccflags " | sed -e 's/ -A[ea] / /' -e 's/ -D_HPUX_SOURCE / /'`
64 shift
65         cc_cppflags="$* -D_HPUX_SOURCE"
66 cppflags="-Aa -D__STDC_EXT__ $cc_cppflags"
67
68 case "$prefix" in
69     "") prefix='/opt/perl5' ;;
70     esac
71
72     gnu_as=no
73     gnu_ld=no
74 case `$cc -v 2>&1`"" in
75     *gcc*)  ccisgcc="$define"
76             ccflags="$cc_cppflags"
77             if [ "X$gccversion" = "X" ]; then
78                 # Done too late in Configure if hinted
79                 gccversion=`$cc --version | sed 's/.*(GCC) *//'`
80                 fi
81             case "$gccversion" in
82                 [012]*) # HP-UX and gcc-2.* break UINT32_MAX :-(
83                         ccflags="$ccflags -DUINT32_MAX_BROKEN"
84                         ;;
85                3*)     # GCC (both 32bit and 64bit) will define __STDC_EXT__
86                        # by default when using GCC 3.0 and newer versions of
87                        # the compiler.
88                        cppflags="$cc_cppflags"
89                        ;;
90                 esac
91             case "`getconf KERNEL_BITS 2>/dev/null`" in
92                 *64*)
93                     echo "main(){}">try.c
94                     case "$gccversion" in
95                         3*)
96                             case "$archname" in
97                                PA-RISC*)
98                                    case "$ccflags" in
99                                        *-mpa-risc*) ;;
100                                        *) ccflags="$ccflags -mpa-risc-2-0" ;;
101                                        esac
102                                    ;;
103                                 esac
104                             ;;
105                         *)  # gcc with gas will not accept +DA2.0
106                             case "`$cc -c -Wa,+DA2.0 try.c 2>&1`" in
107                                 *"+DA2.0"*)             # gas
108                                     gnu_as=yes
109                                     ;;
110                                 *)                      # HPas
111                                     ccflags="$ccflags -Wa,+DA2.0"
112                                     ;;
113                                 esac
114                             ;;
115                         esac
116                     # gcc with gld will not accept +vnocompatwarnings
117                     case "`$cc -o try -Wl,+vnocompatwarnings try.c 2>&1`" in
118                         *"+vnocompat"*)         # gld
119                             gnu_ld=yes
120                             ;;
121                         *)                      # HPld
122                            case "$gccversion" in
123                                [12]*)
124                                    # Why not 3 as well here?
125                                    # Since not relevant to IA64, not changed.
126                                    ldflags="$ldflags -Wl,+vnocompatwarnings"
127                                    ccflags="$ccflags -Wl,+vnocompatwarnings"
128                                    ;;
129                                esac
130                             ;;
131                         esac
132                     rm -f try.c
133                     ;;
134                 esac
135             ;;
136     *)      ccisgcc=''
137             ccversion=`which cc | xargs what | awk '/Compiler/{print $2}'`
138             case "$ccflags" in
139                "-Ae "*) ;;
140                *) ccflags="-Ae $cc_cppflags -Wl,+vnocompatwarnings" ;;
141                esac
142             # Needed because cpp does only support -Aa (not -Ae)
143             cpplast='-'
144             cppminus='-'
145             cppstdin='cc -E -Aa -D__STDC_EXT__'
146             cpprun=$cppstdin
147 #           case "$d_casti32" in
148 #               "") d_casti32='undef' ;;
149 #               esac
150             ;;
151     esac
152
153 # When HP-UX runs a script with "#!", it sets argv[0] to the script name.
154 toke_cflags='ccflags="$ccflags -DARG_ZERO_IS_SCRIPT"'
155
156 ### 64 BITNESS
157
158 # Some gcc versions do native 64 bit long (e.g. 2.9-hppa-000310 and gcc-3.0)
159 # We have to force 64bitness to go search the right libraries
160     gcc_64native=no
161 case "$ccisgcc" in
162     $define|true|[Yy])
163         echo 'int main(){long l;printf("%d\\n",sizeof(l));}'>try.c
164         $cc -o try $ccflags $ldflags try.c
165         if [ "`try`" = "8" ]; then
166             cat <<EOM >&4
167
168 *** This version of gcc uses 64 bit longs. -Duse64bitall is
169 *** implicitly set to enable continuation
170 EOM
171             use64bitall=$define
172             gcc_64native=yes
173             fi
174         ;;
175     esac
176
177 case "$use64bitall" in
178     $define|true|[yY]*) use64bitint="$define" ;;
179     esac
180
181 case "$usemorebits" in
182     $define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;;
183     esac
184
185 case "$archname" in
186     IA64*)
187         # While here, override so=sl auto-detection
188         so='so'
189         ;;
190     *)
191         case "$uselongdouble" in
192             *) ;;
193             $define|true|[yY]*)
194                 cat <<EOM >&4
195
196 *** long doubles are not (yet) supported on HP-UX (any version)
197 *** Until it does, we cannot continue, aborting.
198 EOM
199                 exit 1 ;;
200             esac
201         ;;
202     esac
203
204 case "$use64bitint" in
205     $define|true|[Yy])
206
207         if [ "$xxOsRevMajor" -lt 11 ]; then
208             cat <<EOM >&4
209
210 *** 64-bit compilation is not supported on HP-UX $xxOsRevMajor.
211 *** You need at least HP-UX 11.0.
212 *** Cannot continue, aborting.
213 EOM
214             exit 1
215             fi
216
217         # Set libc and the library paths
218         case "$archname" in
219             PA-RISC*)
220                 loclibpth="$loclibpth /lib/pa20_64"
221                 libc='/lib/pa20_64/libc.sl' ;;
222             IA64*) 
223                 loclibpth="$loclibpth /usr/lib/hpux64"
224                 libc='/usr/lib/hpux64/libc.so' ;;
225             esac
226         if [ ! -f "$libc" ]; then
227             cat <<EOM >&4
228
229 *** You do not seem to have the 64-bit libc.
230 *** I cannot find the file $libc.
231 *** Cannot continue, aborting.
232 EOM
233             exit 1
234             fi
235
236         case "$ccisgcc" in
237             $define|true|[Yy])
238                 # For the moment, don't care that it ain't supported (yet)
239                 # by gcc (up to and including 2.95.3), cause it'll crash
240                 # anyway. Expect auto-detection of 64-bit enabled gcc on
241                 # HP-UX soon, including a user-friendly exit
242                 case $gcc_64native in
243                     no) case "$gccversion" in
244                             [123]*) ccflags="$ccflags -mlp64"
245                                     case "$archname" in
246                                         PA-RISC*)
247                                             ldflags="$ldflags -Wl,+DD64"
248                                             ;;
249                                         IA64*)
250                                             ldflags="$ldflags -mlp64"
251                                             ;;
252                                         esac
253                                     ;;
254                             esac
255                         ;;
256                     esac
257                 ;;
258             *)
259                 ccflags="$ccflags +DD64"
260                 ldflags="$ldflags +DD64"
261                 ;;
262             esac
263
264         # Reset the library checker to make sure libraries
265         # are the right type
266         # (NOTE: on IA64, this doesn't work with .a files.)
267         libscheck='case "`/usr/bin/file $xxx`" in
268                        *ELF-64*|*LP64*|*PA-RISC2.0*) ;;
269                        *) xxx=/no/64-bit$xxx ;;
270                        esac'
271
272         ;;
273
274     *)  # Not in 64-bit mode
275
276         case "$archname" in
277             PA-RISC*)
278                 libc='/lib/libc.sl' ;;
279             IA64*) 
280                 loclibpth="$loclibpth /usr/lib/hpux32"
281                 libc='/usr/lib/hpux32/libc.so' ;;
282             esac
283         ;;
284     esac
285
286 # By setting the deferred flag below, this means that if you run perl
287 # on a system that does not have the required shared library that you
288 # linked it with, it will die when you try to access a symbol in the
289 # (missing) shared library.  If you would rather know at perl startup
290 # time that you are missing an important shared library, switch the
291 # comments so that immediate, rather than deferred loading is
292 # performed.  Even with immediate loading, you can postpone errors for
293 # undefined (or multiply defined) routines until actual access by
294 # adding the "nonfatal" option.
295 # ccdlflags="-Wl,-E -Wl,-B,immediate $ccdlflags"
296 # ccdlflags="-Wl,-E -Wl,-B,immediate,-B,nonfatal $ccdlflags"
297 if [ "$gnu_ld" = "yes" ]; then
298     ccdlflags="-Wl,-E $ccdlflags"
299 else
300     ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
301     fi
302
303
304 ### COMPILER SPECIFICS
305
306 ## Local restrictions (point to README.hpux to lift these)
307
308 ## Optimization limits
309 cat >try.c <<EOF
310 #include <sys/resource.h>
311
312 int main ()
313 {
314     struct rlimit rl;
315     int i = getrlimit (RLIMIT_DATA, &rl);
316     printf ("%d\n", rl.rlim_cur / (1024 * 1024));
317     } /* main */
318 EOF
319 $cc -o try $ccflags $ldflags try.c
320         maxdsiz=`try`
321 rm -f try try.c core
322 if [ $maxdsiz -le 64 ]; then
323     # 64 Mb is probably not enough to optimize toke.c
324     # and regexp.c with -O2
325     cat <<EOM >&4
326 Your kernel limits the data section of your programs to $maxdsiz Mb,
327 which is (sadly) not enough to fully optimize some parts of the
328 perl binary. I'll try to use a lower optimization level for
329 those parts. If you are a sysadmin, and you *do* want full
330 optimization, raise the 'maxdsiz' kernel configuration parameter
331 to at least 0x08000000 (128 Mb) and rebuild your kernel.
332 EOM
333 regexec_cflags=''
334 doop_cflags=''
335     fi
336
337 case "$ccisgcc" in
338     $define|true|[Yy])
339         
340         case "$optimize" in
341             "")           optimize="-g -O" ;;
342             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
343             esac
344         #ld="$cc"
345         ld=/usr/bin/ld
346         cccdlflags='-fPIC'
347         #lddlflags='-shared'
348         lddlflags='-b'
349         case "$optimize" in
350             *-g*-O*|*-O*-g*)
351                 # gcc without gas will not accept -g
352                 echo "main(){}">try.c
353                 case "`$cc $optimize -c try.c 2>&1`" in
354                     *"-g option disabled"*)
355                         set `echo "X $optimize " | sed -e 's/ -g / /'`
356                         shift
357                         optimize="$*"
358                         ;;
359                     esac
360                 ;;
361             esac
362         if [ $maxdsiz -le 64 ]; then
363             case "$optimize" in
364                 *O2*)   opt=`echo "$optimize" | sed -e 's/O2/O1/'`
365                         toke_cflags="$toke_cflags;optimize=\"$opt\""
366                         regexec_cflags="optimize=\"$opt\""
367                         ;;
368                 esac
369             fi
370         ;;
371
372     *)  # HP's compiler cannot combine -g and -O
373         case "$optimize" in
374             "")           optimize="+O2 +Onolimit" ;;
375             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
376             esac
377         case "$optimize" in
378             *-O*|\
379             *O2*)   opt=`echo "$optimize" | sed -e 's/-O/+O2/' -e 's/O2/O1/' -e 's/ *+Onolimit//'`
380                     ;;
381             *)      opt="$optimize"
382                     ;;
383             esac
384         if [ $maxdsiz -le 64 ]; then
385             toke_cflags="$toke_cflags;optimize=\"$opt\""
386             regexec_cflags="optimize=\"$opt\""
387             fi
388         case "$archname" in
389             IA64*)
390                 doop_cflags="optimize=\"$opt\""
391                 ;;
392             esac
393         ld=/usr/bin/ld
394         cccdlflags='+Z'
395         lddlflags='-b +vnocompatwarnings'
396         ;;
397     esac
398
399 ## LARGEFILES
400
401 #case "$uselargefiles-$ccisgcc" in
402 #    "$define-$define"|'-define') 
403 #       cat <<EOM >&4
404 #
405 #*** I'm ignoring large files for this build because
406 #*** I don't know how to do use large files in HP-UX using gcc.
407 #
408 #EOM
409 #       uselargefiles="$undef"
410 #       ;;
411 #    esac
412
413 # Once we have the compiler flags defined, Configure will
414 # execute the following call-back script. See hints/README.hints
415 # for details.
416 cat > UU/cc.cbu <<'EOCBU'
417 # This script UU/cc.cbu will get 'called-back' by Configure after it
418 # has prompted the user for the C compiler to use.
419
420 # Compile and run the a test case to see if a certain gcc bug is
421 # present. If so, lower the optimization level when compiling
422 # pp_pack.c.  This works around a bug in unpack.
423
424 if test -z "$ccisgcc" -a -z "$gccversion"; then
425     : no tests needed for HPc
426 else
427     echo " "
428     echo "Testing for a certain gcc bug is fixed in your compiler..."
429
430     # Try compiling the test case.
431     if $cc -o t001 -O $ccflags $ldflags ../hints/t001.c; then
432        gccbug=`$run ./t001`
433        case "$gccbug" in
434            *fails*)
435                cat >&4 <<EOF
436 This C compiler ($gccversion) is known to have optimizer
437 problems when compiling pp_pack.c.
438
439 Disabling optimization for pp_pack.c.
440 EOF
441                case "$pp_pack_cflags" in
442                    '') pp_pack_cflags='optimize='
443                        echo "pp_pack_cflags='optimize=\"\"'" >> config.sh ;;
444                    *)  echo "You specified pp_pack_cflags yourself, so we'll go with your value." >&4 ;;
445                    esac
446                ;;
447            *)  echo "Your compiler is ok." >&4
448                ;;
449            esac
450     else
451        echo " "
452        echo "*** WHOA THERE!!! ***" >&4
453        echo "    Your C compiler \"$cc\" doesn't seem to be working!" >&4
454        case "$knowitall" in
455            '') echo "    You'd better start hunting for one and let me know about it." >&4
456                exit 1
457                ;;
458            esac
459        fi
460
461     rm -f t001$_o t001$_exe
462     fi
463 EOCBU
464
465 cat >UU/uselargefiles.cbu <<'EOCBU'
466 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
467 # after it has prompted the user for whether to use large files.
468 case "$uselargefiles" in
469     ""|$define|true|[yY]*)
470         # there are largefile flags available via getconf(1)
471         # but we cheat for now.  (Keep that in the left margin.)
472 ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
473
474         case " $ccflags " in
475         *" $ccflags_uselargefiles "*) ;;
476         *) ccflags="$ccflags $ccflags_uselargefiles" ;;
477         esac
478
479         if test -z "$ccisgcc" -a -z "$gccversion"; then
480             # The strict ANSI mode (-Aa) doesn't like large files.
481             ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
482             case "$ccflags" in
483                 *-Ae*) ;;
484                 *)     ccflags="$ccflags -Ae" ;;
485                 esac
486             fi
487         ;;
488     esac
489 EOCBU
490
491 # THREADING
492
493 # This script UU/usethreads.cbu will get 'called-back' by Configure 
494 # after it has prompted the user for whether to use threads.
495 cat >UU/usethreads.cbu <<'EOCBU'
496 case "$usethreads" in
497     $define|true|[yY]*)
498         if [ "$xxOsRevMajor" -lt 10 ]; then
499             cat <<EOM >&4
500
501 HP-UX $xxOsRevMajor cannot support POSIX threads.
502 Consider upgrading to at least HP-UX 11.
503 Cannot continue, aborting.
504 EOM
505             exit 1
506             fi
507
508         if [ "$xxOsRevMajor" -eq 10 ]; then
509             # Under 10.X, a threaded perl can be built
510             if [ -f /usr/include/pthread.h ]; then
511                 if [ -f /usr/lib/libcma.sl ]; then
512                     # DCE (from Core OS CD) is installed
513
514                    # Check if it is pristine, or patched
515                    cmavsn=`what /usr/lib/libcma.sl 2>&1 | grep 1996`
516                    if [ ! -z "$cmavsn" ]; then
517                        cat <<EOM >&4
518 \a
519 ***************************************************************************
520
521 Perl will support threading through /usr/lib/libcma.sl from
522 the HP DCE package, but the version found is too old to be
523 reliable.
524
525 If you are not depending on this specific version of the library,
526 consider to upgrade using patch PHSS_23672 (read README.hpux)
527
528 ***************************************************************************
529
530 (sleeping for 10 seconds...)
531 EOM
532                        sleep 10
533                        fi
534
535                     # It needs # libcma and OLD_PTHREADS_API. Also
536                     # <pthread.h> needs to be #included before any
537                     # other includes (in perl.h)
538
539                     # HP-UX 10.X uses the old pthreads API
540                     d_oldpthreads="$define"
541
542                     # include libcma before all the others
543                     libswanted="cma $libswanted"
544
545                     # tell perl.h to include <pthread.h> before other
546                     # include files
547                     ccflags="$ccflags -DPTHREAD_H_FIRST"
548 # First column on purpose:
549 # this is not a standard Configure variable
550 # but we need to get this noticed.
551 pthread_h_first="$define"
552
553                     # HP-UX 10.X seems to have no easy
554                     # way of detecting these *time_r protos.
555                     d_gmtime_r_proto='define'
556                     gmtime_r_proto='REENTRANT_PROTO_I_TS'
557                     d_localtime_r_proto='define'
558                     localtime_r_proto='REENTRANT_PROTO_I_TS'
559
560                     # Avoid the poisonous conflicting (and irrelevant)
561                     # prototypes of setkey(). 
562                     i_crypt="$undef"
563
564                     # CMA redefines select to cma_select, and cma_select
565                     # expects int * instead of fd_set * (just like 9.X)
566                     selecttype='int *'
567
568                 elif [ -f /usr/lib/libpthread.sl ]; then
569                     # PTH package is installed
570                     libswanted="pthread $libswanted"
571                 else
572                     libswanted="no_threads_available"
573                     fi
574             else
575                 libswanted="no_threads_available"
576                 fi
577
578             if [ $libswanted = "no_threads_available" ]; then
579                 cat <<EOM >&4
580
581 In HP-UX 10.X for POSIX threads you need both of the files
582 /usr/include/pthread.h and either /usr/lib/libcma.sl or /usr/lib/libpthread.sl.
583 Either you must upgrade to HP-UX 11 or install a posix thread library:
584
585     DCE-CoreTools from HP-UX 10.20 Hardware Extensions 3.0 CD (B3920-13941)
586
587 or
588
589     PTH package from e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html
590
591 Cannot continue, aborting.
592 EOM
593                 exit 1
594                 fi
595         else
596             # 12 may want upping the _POSIX_C_SOURCE datestamp...
597             ccflags=" -D_POSIX_C_SOURCE=199506L -D_REENTRANT $ccflags"
598             set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
599             shift
600             libswanted="$*"
601             fi
602
603         ;;
604     esac
605 EOCBU
606
607 # The mysterious io_xs memory corruption in 11.00 32bit seems to get
608 # fixed by not using Perl's malloc.  Flip side is performance loss.
609 # So we want mymalloc for all situations possible
610 usemymalloc='y'
611 case "$usethreads" in
612     $define|true|[yY]*) usemymalloc='n' ;;
613     *)  case "$ccisgcc" in
614            $undef|false|[nN]*)
615                case "$use64bitint" in
616                    $undef|false|[nN]*)
617                        case "$ccflags" in
618                            *-DDEBUGGING*) ;;
619                            *) usemymalloc='n' ;;
620                            esac
621                        ;;
622                    esac
623                ;;
624            esac
625        ;;
626     esac
627
628 usemymalloc='n'
629 case "$useperlio" in
630     $undef|false|[nN]*) usemymalloc='y' ;;
631     esac
632
633 # fpclassify() is a macro, the library call is Fpclassify
634 # Similarly with the others below.
635 d_fpclassify='define'
636 d_isnan='define'
637 d_isinf='define'
638 d_isfinite='define'
639 d_unordered='define'
640 # Next one(s) need the leading tab.  These are special 'hint' symbols that
641 # are not to be propagated to config.sh, all related to pthreads draft 4
642 # interfaces.
643 case "$d_oldpthreads" in
644     ''|$undef)
645         d_crypt_r_proto='undef'
646         d_getgrent_r_proto='undef'
647         d_getpwent_r_proto='undef'
648         d_strerror_r_proto='undef'
649         ;;
650     esac