xref: /openbsd/gnu/usr.bin/perl/hints/hpux.sh (revision db3296cf)
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`;
8if [ "$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"`;
24else
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.
38if [ "$xxOsRevMajor" -le 10 ]; then
39    d_u32align=$define
40    fi
41
42echo "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.
46archname64=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.
55set `echo "X $libswanted " | sed -e 's/ ld / /' -e 's/ dbm / /' -e 's/ BSD / /' -e 's/ PW / /'`
56shift
57libswanted="$*"
58
59cc=${cc:-cc}
60ar=/usr/bin/ar	# Yes, truly override.  We do not want the GNU ar.
61full_ar=$ar	# I repeat, no GNU ar.  arrr.
62
63set `echo "X $ccflags " | sed -e 's/ -A[ea] / /' -e 's/ -D_HPUX_SOURCE / /'`
64shift
65	cc_cppflags="$* -D_HPUX_SOURCE"
66cppflags="-Aa -D__STDC_EXT__ $cc_cppflags"
67
68case "$prefix" in
69    "") prefix='/opt/perl5' ;;
70    esac
71
72    gnu_as=no
73    gnu_ld=no
74case `$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.
154toke_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
161case "$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
170EOM
171	    use64bitall=$define
172	    gcc_64native=yes
173	    fi
174	;;
175    esac
176
177case "$use64bitall" in
178    $define|true|[yY]*) use64bitint="$define" ;;
179    esac
180
181case "$usemorebits" in
182    $define|true|[yY]*) use64bitint="$define"; uselongdouble="$define" ;;
183    esac
184
185case "$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.
198EOM
199		exit 1 ;;
200	    esac
201	;;
202    esac
203
204case "$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.
213EOM
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.
232EOM
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"
297if [ "$gnu_ld" = "yes" ]; then
298    ccdlflags="-Wl,-E $ccdlflags"
299else
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
309cat >try.c <<EOF
310#include <sys/resource.h>
311
312int main ()
313{
314    struct rlimit rl;
315    int i = getrlimit (RLIMIT_DATA, &rl);
316    printf ("%d\n", rl.rlim_cur / (1024 * 1024));
317    } /* main */
318EOF
319$cc -o try $ccflags $ldflags try.c
320	maxdsiz=`try`
321rm -f try try.c core
322if [ $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
326Your kernel limits the data section of your programs to $maxdsiz Mb,
327which is (sadly) not enough to fully optimize some parts of the
328perl binary. I'll try to use a lower optimization level for
329those parts. If you are a sysadmin, and you *do* want full
330optimization, raise the 'maxdsiz' kernel configuration parameter
331to at least 0x08000000 (128 Mb) and rebuild your kernel.
332EOM
333regexec_cflags=''
334doop_cflags=''
335    fi
336
337case "$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
413cat >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.
416case "$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.)
420ccflags_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
437EOCBU
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.
443cat >UU/usethreads.cbu <<'EOCBU'
444case "$usethreads" in
445    $define|true|[yY]*)
446	if [ "$xxOsRevMajor" -lt 10 ]; then
447	    cat <<EOM >&4
448
449HP-UX $xxOsRevMajor cannot support POSIX threads.
450Consider upgrading to at least HP-UX 11.
451Cannot continue, aborting.
452EOM
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
467***************************************************************************
468
469Perl will support threading through /usr/lib/libcma.sl from
470the HP DCE package, but the version found is too old to be
471reliable.
472
473If you are not depending on this specific version of the library,
474consider to upgrade using patch PHSS_23672 (read README.hpux)
475
476***************************************************************************
477
478(sleeping for 10 seconds...)
479EOM
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.
499pthread_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
529In 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.
531Either 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
535or
536
537    PTH package from e.g. http://hpux.tn.tudelft.nl/hppd/hpux/alpha.html
538
539Cannot continue, aborting.
540EOM
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
553EOCBU
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
558usemymalloc='y'
559case "$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
576usemymalloc='n'
577case "$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.
583d_fpclassify='define'
584d_isnan='define'
585d_isinf='define'
586d_isfinite='define'
587d_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.
591case "$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
599