This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
no need to declare setting less twice
[metaconfig.git] / U / compline / byteorder.U
CommitLineData
959f3c4c
JH
1?RCS: $Id: byteorder.U,v 3.0.1.2 1997/02/28 15:24:55 ram Exp $
2?RCS:
3?RCS: Copyright (c) 1991-1993, Raphael Manfredi
0065f4af 4?RCS:
65a32477 5?RCS: You may redistribute only under the terms of the Artistic License,
959f3c4c
JH
6?RCS: as specified in the README file that comes with the distribution.
7?RCS: You may reuse parts of this distribution only within the terms of
65a32477 8?RCS: that same Artistic License; a copy of which may be found at the root
959f3c4c
JH
9?RCS: of the source tree for dist 3.0.
10?RCS:
11?RCS: $Log: byteorder.U,v $
12?RCS: Revision 3.0.1.2 1997/02/28 15:24:55 ram
13?RCS: patch61: no longer ask the user if the test runs ok
14?RCS:
15?RCS: Revision 3.0.1.1 1994/10/29 16:02:58 ram
16?RCS: patch36: added ?F: line for metalint file checking
17?RCS:
18?RCS: Revision 3.0 1993/08/18 12:05:28 ram
19?RCS: Baseline for dist 3.0 netwide release.
20?RCS:
2cb64bf6 21?MAKE:byteorder: cat Myread Oldconfig Loc Compile rm_try run \
1273bb5e 22 usecrosscompile multiarch uvtype uvsize i_stdlib
959f3c4c
JH
23?MAKE: -pick add $@ %<
24?S:byteorder:
a1780b95
JH
25?S: This variable holds the byte order in a UV. In the following,
26?S: larger digits indicate more significance. The variable byteorder
27?S: is either 4321 on a big-endian machine, or 1234 on a little-endian,
28?S: or 87654321 on a Cray ... or 3412 with weird order !
959f3c4c
JH
29?S:.
30?C:BYTEORDER:
31?C: This symbol holds the hexadecimal constant defined in byteorder,
a1780b95 32?C: in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
959f3c4c 33?C: If the compiler supports cross-compiling or multiple-architecture
3cfe0f67 34?C: binaries (e.g. on NeXT systems), use compiler-defined macros to
959f3c4c
JH
35?C: determine the byte order.
36?C: On NeXT 3.2 (and greater), you can build "Fat" Multiple Architecture
37?C: Binaries (MAB) on either big endian or little endian machines.
38?C: The endian-ness is available at compile-time. This only matters
2cb64bf6 39?C: for perl, where the config.h can be generated and installed on
959f3c4c
JH
40?C: one system, and used by a different architecture to build an
41?C: extension. Older versions of NeXT that might not have
42?C: defined either *_ENDIAN__ were all on Motorola 680x0 series,
2cb64bf6 43?C: so the default case (for NeXT) is big endian to catch them.
959f3c4c
JH
44?C: This might matter for NeXT 3.0.
45?C:.
0f00356b 46?H:?%<:#if defined(USE_CROSS_COMPILE) || defined(MULTIARCH)
26327fd3 47?H:?%<:# ifdef __LITTLE_ENDIAN__
6b4048d7 48?H:?%<:# if LONGSIZE == 4
26327fd3
JH
49?H:?%<:# define BYTEORDER 0x1234
50?H:?%<:# else
6b4048d7 51?H:?%<:# if LONGSIZE == 8
26327fd3
JH
52?H:?%<:# define BYTEORDER 0x12345678
53?H:?%<:# endif
54?H:?%<:# endif
55?H:?%<:# else
56?H:?%<:# ifdef __BIG_ENDIAN__
6b4048d7 57?H:?%<:# if LONGSIZE == 4
26327fd3
JH
58?H:?%<:# define BYTEORDER 0x4321
59?H:?%<:# else
6b4048d7 60?H:?%<:# if LONGSIZE == 8
26327fd3
JH
61?H:?%<:# define BYTEORDER 0x87654321
62?H:?%<:# endif
63?H:?%<:# endif
64?H:?%<:# endif
65?H:?%<:# endif
66?H:?%<:# if !defined(BYTEORDER) && (defined(NeXT) || defined(__NeXT__))
67?H:?%<:# define BYTEORDER 0x4321
68?H:?%<:# endif
69?H:?%<:#else
70?H:?%<:#define BYTEORDER 0x$byteorder /* large digits for MSB */
71?H:?%<:#endif /* NeXT */
959f3c4c 72?H:.
959f3c4c 73?T:xxx_prompt
0065f4af 74?F:!try
a1780b95 75: check for ordering of bytes in a UV
959f3c4c 76echo " "
0f00356b 77case "$usecrosscompile$multiarch" in
959f3c4c
JH
78*$define*)
79 $cat <<EOM
80You seem to be either cross-compiling or doing a multiarchitecture build,
81skipping the byteorder check.
82
83EOM
0f00356b 84 byteorder='ffff'
959f3c4c
JH
85 ;;
86*)
87 case "$byteorder" in
88 '')
89 $cat <<'EOM'
90In the following, larger digits indicate more significance. A big-endian
91machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A
92little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other
9a9edc35
JH
93machines may have weird orders like 3412. A Cray will report 87654321,
94an Alpha will report 12345678. If the test program works the default is
95probably right.
959f3c4c
JH
96I'm now running the test program...
97EOM
a1780b95 98 $cat >try.c <<EOCP
959f3c4c 99#include <stdio.h>
1273bb5e
JH
100#$i_stdlib I_STDLIB
101#ifdef I_STDLIB
102#include <stdlib.h>
103#endif
a1780b95
JH
104#include <sys/types.h>
105typedef $uvtype UV;
959f3c4c
JH
106int main()
107{
108 int i;
109 union {
a1780b95
JH
110 UV l;
111 char c[$uvsize];
959f3c4c
JH
112 } u;
113
a1780b95 114 if ($uvsize > 4)
992b29ec 115 u.l = (((UV)0x08070605) << 32) | (UV)0x04030201;
959f3c4c 116 else
992b29ec 117 u.l = (UV)0x04030201;
a1780b95 118 for (i = 0; i < $uvsize; i++)
959f3c4c
JH
119 printf("%c", u.c[i]+'0');
120 printf("\n");
121 exit(0);
122}
123EOCP
124 xxx_prompt=y
125 set try
914abcdc 126 if eval $compile && $run ./try > /dev/null; then
0f00356b 127 dflt=`$run ./try`
959f3c4c
JH
128 case "$dflt" in
129 [1-4][1-4][1-4][1-4]|12345678|87654321)
130 echo "(The test program ran ok.)"
131 echo "byteorder=$dflt"
132 xxx_prompt=n
133 ;;
134 ????|????????) echo "(The test program ran ok.)" ;;
135 *) echo "(The test program didn't run right for some reason.)" ;;
136 esac
137 else
138 dflt='4321'
139 cat <<'EOM'
140(I can't seem to compile the test program. Guessing big-endian...)
141EOM
142 fi
143 case "$xxx_prompt" in
144 y)
a1780b95 145 rp="What is the order of bytes in $uvtype?"
959f3c4c
JH
146 . ./myread
147 byteorder="$ans"
148 ;;
149 *) byteorder=$dflt
150 ;;
151 esac
152 ;;
153 esac
2cb64bf6 154 $rm_try
959f3c4c
JH
155 ;;
156esac
157