This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
71705163d46859ca20d6cf160982cb535edec756
[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 cat >UU/uselargefiles.cbu <<'EOCBU'
414 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
415 # after it has prompted the user for whether to use large files.
416 case "$uselargefiles" in
417     ""|$define|true|[yY]*)
418         # there are largefile flags available via getconf(1)
419         # but we cheat for now.  (Keep that in the left margin.)
420 ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
421
422         case " $ccflags " in
423         *" $ccflags_uselargefiles "*) ;;
424         *) ccflags="$ccflags $ccflags_uselargefiles" ;;
425         esac
426
427         if test -z "$ccisgcc" -a -z "$gccversion"; then
428             # The strict ANSI mode (-Aa) doesn't like large files.
429             ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
430             case "$ccflags" in
431                 *-Ae*) ;;
432                 *)     ccflags="$ccflags -Ae" ;;
433                 esac
434             fi
435         ;;
436     esac
437 EOCBU
438
439 # THREADING
440
441 # This script UU/usethreads.cbu will get 'called-back' by Configure 
442 # after it has prompted the user for whether to use threads.
443 cat >UU/usethreads.cbu <<'EOCBU'
444 case "$usethreads" in
445     $define|true|[yY]*)
446         if [ "$xxOsRevMajor" -lt 10 ]; then
447             cat <<EOM >&4
448
449 HP-UX $xxOsRevMajor cannot support POSIX threads.
450 Consider upgrading to at least HP-UX 11.
451 Cannot continue, aborting.
452 EOM
453             exit 1
454             fi
455
456         if [ "$xxOsRevMajor" -eq 10 ]; then
457             # Under 10.X, a threaded perl can be built
458             if [ -f /usr/include/pthread.h ]; then
459                 if [ -f /usr/lib/libcma.sl ]; then
460                     # DCE (from Core OS CD) is installed
461
462                    # Check if it is pristine, or patched
463                    cmavsn=`what /usr/lib/libcma.sl 2>&1 | grep 1996`
464                    if [ ! -z "$cmavsn" ]; then
465                        cat <<EOM >&4
466 \a
467 ***************************************************************************
468
469 Perl will support threading through /usr/lib/libcma.sl from
470 the HP DCE package, but the version found is too old to be
471 reliable.
472
473 If you are not depending on this specific version of the library,
474 consider to upgrade using patch PHSS_23672 (read README.hpux)
475
476 ***************************************************************************
477
478 (sleeping for 10 seconds...)
479 EOM
480                        sleep 10
481                        fi
482
483                     # It needs # libcma and OLD_PTHREADS_API. Also
484                     # <pthread.h> needs to be #included before any
485                     # other includes (in perl.h)
486
487                     # HP-UX 10.X uses the old pthreads API
488                     d_oldpthreads="$define"
489
490                     # include libcma before all the others
491                     libswanted="cma $libswanted"
492
493                     # tell perl.h to include <pthread.h> before other
494                     # include files
495                     ccflags="$ccflags -DPTHREAD_H_FIRST"
496 # First column on purpose:
497 # this is not a standard Configure variable
498 # but we need to get this noticed.
499 pthread_h_first="$define"
500
501                     # HP-UX 10.X seems to have no easy
502                     # way of detecting these *time_r protos.
503                     d_gmtime_r_proto='define'
504                     gmtime_r_proto='REENTRANT_PROTO_I_TS'
505                     d_localtime_r_proto='define'
506                     localtime_r_proto='REENTRANT_PROTO_I_TS'
507
508                     # Avoid the poisonous conflicting (and irrelevant)
509                     # prototypes of setkey(). 
510                     i_crypt="$undef"
511
512                     # CMA redefines select to cma_select, and cma_select
513                     # expects int * instead of fd_set * (just like 9.X)
514                     selecttype='int *'
515
516                 elif [ -f /usr/lib/libpthread.sl ]; then
517                     # PTH package is installed
518                     libswanted="pthread $libswanted"
519                 else
520                     libswanted="no_threads_available"
521                     fi
522             else
523                 libswanted="no_threads_available"
524                 fi
525
526             if [ $libswanted = "no_threads_available" ]; then
527                 cat <<EOM >&4
528
529 In HP-UX 10.X for POSIX threads you need both of the files
530 /usr/include/pthread.h and either /usr/lib/libcma.sl or /usr/lib/libpthread.sl.
531 Either you must upgrade to HP-UX 11 or install a posix thread library:
532
533     DCE-CoreTools from HP-UX 10.20 Hardware Extensions 3.0 CD (B3920-13941)
534
535 or
536
537     PTH package from e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html
538
539 Cannot continue, aborting.
540 EOM
541                 exit 1
542                 fi
543         else
544             # 12 may want upping the _POSIX_C_SOURCE datestamp...
545             ccflags=" -D_POSIX_C_SOURCE=199506L -D_REENTRANT $ccflags"
546             set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
547             shift
548             libswanted="$*"
549             fi
550
551         ;;
552     esac
553 EOCBU
554
555 # The mysterious io_xs memory corruption in 11.00 32bit seems to get
556 # fixed by not using Perl's malloc.  Flip side is performance loss.
557 # So we want mymalloc for all situations possible
558 usemymalloc='y'
559 case "$usethreads" in
560     $define|true|[yY]*) usemymalloc='n' ;;
561     *)  case "$ccisgcc" in
562            $undef|false|[nN]*)
563                case "$use64bitint" in
564                    $undef|false|[nN]*)
565                        case "$ccflags" in
566                            *-DDEBUGGING*) ;;
567                            *) usemymalloc='n' ;;
568                            esac
569                        ;;
570                    esac
571                ;;
572            esac
573        ;;
574     esac
575
576 usemymalloc='n'
577 case "$useperlio" in
578     $undef|false|[nN]*) usemymalloc='y' ;;
579     esac
580
581 # fpclassify() is a macro, the library call is Fpclassify
582 # Similarly with the others below.
583 d_fpclassify='define'
584 d_isnan='define'
585 d_isinf='define'
586 d_isfinite='define'
587 d_unordered='define'
588 # Next one(s) need the leading tab.  These are special 'hint' symbols that
589 # are not to be propagated to config.sh, all related to pthreads draft 4
590 # interfaces.
591 case "$d_oldpthreads" in
592     ''|$undef)
593         d_crypt_r_proto='undef'
594         d_getgrent_r_proto='undef'
595         d_getpwent_r_proto='undef'
596         d_strerror_r_proto='undef'
597         ;;
598     esac