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