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