f8ea087c71bda81ea8d3c2eeaf8f1f39472b3664
[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/_/./`;
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 "$uselongdouble" in
166     $define|true|[yY]*)
167         cat <<EOM >&4
168
169 *** long doubles are not (yet) supported on HP-UX (any version)
170 *** Until it does, we cannot continue, aborting.
171 EOM
172         exit 1 ;;
173     esac
174
175 case "$use64bitint" in
176     $define|true|[Yy])
177
178         if [ "$xxOsRevMajor" -lt 11 ]; then
179             cat <<EOM >&4
180
181 *** 64-bit compilation is not supported on HP-UX $xxOsRevMajor.
182 *** You need at least HP-UX 11.0.
183 *** Cannot continue, aborting.
184 EOM
185             exit 1
186             fi
187
188         # Set libc and the library paths
189         case "$archname" in
190             PA-RISC*)
191                 loclibpth="$loclibpth /lib/pa20_64"
192                 libc='/lib/pa20_64/libc.sl' ;;
193             IA64*) 
194                 loclibpth="$loclibpth /usr/lib/hpux64"
195                 libc='/usr/lib/hpux64/libc.so' ;;
196             esac
197         if [ ! -f "$libc" ]; then
198             cat <<EOM >&4
199
200 *** You do not seem to have the 64-bit libc.
201 *** I cannot find the file $libc.
202 *** Cannot continue, aborting.
203 EOM
204             exit 1
205             fi
206
207         case "$ccisgcc" in
208             $define|true|[Yy])
209                 # For the moment, don't care that it ain't supported (yet)
210                 # by gcc (up to and including 2.95.3), cause it'll crash
211                 # anyway. Expect auto-detection of 64-bit enabled gcc on
212                 # HP-UX soon, including a user-friendly exit
213                 case $gcc_64native in
214                     no) case "$gccversion" in
215                             [12]*)  ccflags="$ccflags -mlp64"
216                                     ldflags="$ldflags -Wl,+DD64"
217                                     ;;
218                             esac
219                         ;;
220                     esac
221                 ;;
222             *)
223                 ccflags="$ccflags +DD64"
224                 ldflags="$ldflags +DD64"
225                 ;;
226             esac
227
228         # Reset the library checker to make sure libraries
229         # are the right type
230         libscheck='case "`/usr/bin/file $xxx`" in
231                        *ELF-64*|*LP64*|*PA-RISC2.0*) ;;
232                        *) xxx=/no/64-bit$xxx ;;
233                        esac'
234
235         ;;
236
237     *)  # Not in 64-bit mode
238
239         case "$archname" in
240             PA-RISC*)
241                 libc='/lib/libc.sl' ;;
242             IA64*) 
243                 loclibpth="$loclibpth /usr/lib/hpux32"
244                 libc='/usr/lib/hpux32/libc.so' ;;
245             esac
246         ;;
247     esac
248
249 # By setting the deferred flag below, this means that if you run perl
250 # on a system that does not have the required shared library that you
251 # linked it with, it will die when you try to access a symbol in the
252 # (missing) shared library.  If you would rather know at perl startup
253 # time that you are missing an important shared library, switch the
254 # comments so that immediate, rather than deferred loading is
255 # performed.  Even with immediate loading, you can postpone errors for
256 # undefined (or multiply defined) routines until actual access by
257 # adding the "nonfatal" option.
258 # ccdlflags="-Wl,-E -Wl,-B,immediate $ccdlflags"
259 # ccdlflags="-Wl,-E -Wl,-B,immediate,-B,nonfatal $ccdlflags"
260 if [ "$gnu_ld" = "yes" ]; then
261     ccdlflags="-Wl,-E $ccdlflags"
262 else
263     ccdlflags="-Wl,-E -Wl,-B,deferred $ccdlflags"
264     fi
265
266
267 ### COMPILER SPECIFICS
268
269 ## Local restrictions (point to README.hpux to lift these)
270
271 ## Optimization limits
272 cat >try.c <<EOF
273 #include <sys/resource.h>
274
275 int main ()
276 {
277     struct rlimit rl;
278     int i = getrlimit (RLIMIT_DATA, &rl);
279     printf ("%d\n", rl.rlim_cur / (1024 * 1024));
280     } /* main */
281 EOF
282 $cc -o try $ccflags $ldflags try.c
283         maxdsiz=`try`
284 rm -f try try.c core
285 if [ $maxdsiz -le 64 ]; then
286     # 64 Mb is probably not enough to optimize toke.c
287     # and regexp.c with -O2
288     cat <<EOM >&4
289 Your kernel limits the data section of your programs to $maxdsiz Mb,
290 which is (sadly) not enough to fully optimize some parts of the
291 perl binary. I'll try to use a lower optimization level for
292 those parts. If you are a sysadmin, and you *do* want full
293 optimization, raise the 'maxdsiz' kernel configuration parameter
294 to at least 0x08000000 (128 Mb) and rebuild your kernel.
295 EOM
296 regexec_cflags=''
297     fi
298
299 case "$ccisgcc" in
300     $define|true|[Yy])
301         
302         case "$optimize" in
303             "")           optimize="-g -O" ;;
304             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
305             esac
306         #ld="$cc"
307         ld=/usr/bin/ld
308         cccdlflags='-fPIC'
309         #lddlflags='-shared'
310         lddlflags='-b'
311         case "$optimize" in
312             *-g*-O*|*-O*-g*)
313                 # gcc without gas will not accept -g
314                 echo "main(){}">try.c
315                 case "`$cc $optimize -c try.c 2>&1`" in
316                     *"-g option disabled"*)
317                         set `echo "X $optimize " | sed -e 's/ -g / /'`
318                         shift
319                         optimize="$*"
320                         ;;
321                     esac
322                 ;;
323             esac
324         if [ $maxdsiz -le 64 ]; then
325             case "$optimize" in
326                 *O2*)   opt=`echo "$optimize" | sed -e 's/O2/O1/'`
327                         toke_cflags="$toke_cflags;optimize=\"$opt\""
328                         regexec_cflags="optimize=\"$opt\""
329                         ;;
330                 esac
331             fi
332         ;;
333
334     *)  # HP's compiler cannot combine -g and -O
335         case "$optimize" in
336             "")           optimize="+O2 +Onolimit" ;;
337             *O[3456789]*) optimize=`echo "$optimize" | sed -e 's/O[3-9]/O2/'` ;;
338             esac
339         if [ $maxdsiz -le 64 ]; then
340             case "$optimize" in
341                 *-O*|\
342                 *O2*)   opt=`echo "$optimize" | sed -e 's/-O/+O2/' -e 's/O2/O1/' -e 's/ *+Onolimit//'`
343                         toke_cflags="$toke_cflags;optimize=\"$opt\""
344                         regexec_cflags="optimize=\"$opt\""
345                         ;;
346                 esac
347             fi
348         ld=/usr/bin/ld
349         cccdlflags='+Z'
350         lddlflags='-b +vnocompatwarnings'
351         ;;
352     esac
353
354 ## LARGEFILES
355
356 #case "$uselargefiles-$ccisgcc" in
357 #    "$define-$define"|'-define') 
358 #       cat <<EOM >&4
359 #
360 #*** I'm ignoring large files for this build because
361 #*** I don't know how to do use large files in HP-UX using gcc.
362 #
363 #EOM
364 #       uselargefiles="$undef"
365 #       ;;
366 #    esac
367
368 cat >UU/uselargefiles.cbu <<'EOCBU'
369 # This script UU/uselargefiles.cbu will get 'called-back' by Configure 
370 # after it has prompted the user for whether to use large files.
371 case "$uselargefiles" in
372     ""|$define|true|[yY]*)
373         # there are largefile flags available via getconf(1)
374         # but we cheat for now.  (Keep that in the left margin.)
375 ccflags_uselargefiles="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
376
377         case "$ccflags" in
378         *" $ccflags_uselargefiles") ;;
379         *) ccflags="$ccflags $ccflags_uselargefiles" ;;
380         esac
381
382         if test -z "$ccisgcc" -a -z "$gccversion"; then
383             # The strict ANSI mode (-Aa) doesn't like large files.
384             ccflags=`echo " $ccflags "|sed 's@ -Aa @ @g'`
385             case "$ccflags" in
386                 *-Ae*) ;;
387                 *)     ccflags="$ccflags -Ae" ;;
388                 esac
389             fi
390         ;;
391     esac
392 EOCBU
393
394 # THREADING
395
396 # This script UU/usethreads.cbu will get 'called-back' by Configure 
397 # after it has prompted the user for whether to use threads.
398 cat >UU/usethreads.cbu <<'EOCBU'
399 case "$usethreads" in
400     $define|true|[yY]*)
401         if [ "$xxOsRevMajor" -lt 10 ]; then
402             cat <<EOM >&4
403
404 HP-UX $xxOsRevMajor cannot support POSIX threads.
405 Consider upgrading to at least HP-UX 11.
406 Cannot continue, aborting.
407 EOM
408             exit 1
409             fi
410
411         if [ "$xxOsRevMajor" -eq 10 ]; then
412             # Under 10.X, a threaded perl can be built
413             if [ -f /usr/include/pthread.h ]; then
414                 if [ -f /usr/lib/libcma.sl ]; then
415                     # DCE (from Core OS CD) is installed
416
417                    # Check if it is pristine, or patched
418                    cmavsn=`what /usr/lib/libcma.sl 2>&1 | grep 1996`
419                    if [ ! -z "$cmavsn" ]; then
420                        cat <<EOM >&4
421 \a
422 ***************************************************************************
423
424 Perl will support threading through /usr/lib/libcma.sl from
425 the HP DCE package, but the version found is too old to be
426 reliable.
427
428 If you are not depending on this specific version of the library,
429 consider to upgrade using patch PHSS_23672 (read README.hpux)
430
431 ***************************************************************************
432
433 (sleeping for 10 seconds...)
434 EOM
435                           sleep 10
436                        fi
437
438                     # It needs # libcma and OLD_PTHREADS_API. Also
439                     # <pthread.h> needs to be #included before any
440                     # other includes (in perl.h)
441
442                     # HP-UX 10.X uses the old pthreads API
443                     d_oldpthreads="$define"
444
445                     # include libcma before all the others
446                     libswanted="cma $libswanted"
447
448                     # tell perl.h to include <pthread.h> before other
449                     # include files
450                     ccflags="$ccflags -DPTHREAD_H_FIRST"
451
452                     # CMA redefines select to cma_select, and cma_select
453                     # expects int * instead of fd_set * (just like 9.X)
454                     selecttype='int *'
455
456                 elif [ -f /usr/lib/libpthread.sl ]; then
457                     # PTH package is installed
458                     libswanted="pthread $libswanted"
459                 else
460                     libswanted="no_threads_available"
461                     fi
462             else
463                 libswanted="no_threads_available"
464                 fi
465
466             if [ $libswanted = "no_threads_available" ]; then
467                 cat <<EOM >&4
468
469 In HP-UX 10.X for POSIX threads you need both of the files
470 /usr/include/pthread.h and either /usr/lib/libcma.sl or /usr/lib/libpthread.sl.
471 Either you must upgrade to HP-UX 11 or install a posix thread library:
472
473     DCE-CoreTools from HP-UX 10.20 Hardware Extensions 3.0 CD (B3920-13941)
474
475 or
476
477     PTH package from e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html
478
479 Cannot continue, aborting.
480 EOM
481                 exit 1
482                 fi
483         else
484             # 12 may want upping the _POSIX_C_SOURCE datestamp...
485             ccflags=" -D_POSIX_C_SOURCE=199506L -D_REENTRANT $ccflags"
486             set `echo X "$libswanted "| sed -e 's/ c / pthread c /'`
487             shift
488             libswanted="$*"
489             fi
490
491         usemymalloc='n'
492         ;;
493     esac
494 EOCBU
495
496 # fpclassify() is a macro, the library call is Fpclassify
497 d_fpclassify='define'