This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
restore missed change
[metaconfig.git] / U / compline / byteorder.U
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
4 ?RCS:
5 ?RCS: You may redistribute only under the terms of the Artistic License,
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
8 ?RCS: that same Artistic License; a copy of which may be found at the root
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:
21 ?MAKE:byteorder: cat Myread Oldconfig Loc Compile rm_try run \
22         multiarch uvtype uvsize i_stdlib
23 ?MAKE:  -pick add $@ %<
24 ?S:byteorder:
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 !
29 ?S:.
30 ?C:BYTEORDER:
31 ?C:     This symbol holds the hexadecimal constant defined in byteorder,
32 ?C:     in a UV, i.e. 0x1234 or 0x4321 or 0x12345678, etc...
33 ?C:     If the compiler supports cross-compiling or multiple-architecture
34 ?C:     binaries (e.g. on NeXT systems), use compiler-defined macros to
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
39 ?C:     for perl, where the config.h can be generated and installed on
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,
43 ?C:     so the default case (for NeXT) is big endian to catch them.
44 ?C:     This might matter for NeXT 3.0.
45 ?C:.
46 ?H:?%<:#if defined(MULTIARCH)
47 ?H:?%<:#  ifdef __LITTLE_ENDIAN__
48 ?H:?%<:#    if LONGSIZE == 4
49 ?H:?%<:#      define BYTEORDER 0x1234
50 ?H:?%<:#    else
51 ?H:?%<:#      if LONGSIZE == 8
52 ?H:?%<:#        define BYTEORDER 0x12345678
53 ?H:?%<:#      endif
54 ?H:?%<:#    endif
55 ?H:?%<:#  else
56 ?H:?%<:#    ifdef __BIG_ENDIAN__
57 ?H:?%<:#      if LONGSIZE == 4
58 ?H:?%<:#        define BYTEORDER 0x4321
59 ?H:?%<:#      else
60 ?H:?%<:#        if LONGSIZE == 8
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 */
72 ?H:.
73 ?T:xxx_prompt
74 ?F:!try
75 : check for ordering of bytes in a UV
76 echo " "
77 case "$multiarch" in
78 *$define*)
79         $cat <<EOM
80 You seem to be doing a multiarchitecture build,
81 skipping the byteorder check.
82
83 EOM
84         byteorder='ffff'
85         ;;
86 *)
87         case "$byteorder" in
88         '')
89                 $cat <<'EOM'
90 In the following, larger digits indicate more significance.  A big-endian
91 machine like a Pyramid or a Motorola 680?0 chip will come out to 4321. A
92 little-endian machine like a Vax or an Intel 80?86 chip would be 1234. Other
93 machines may have weird orders like 3412.  A Cray will report 87654321,
94 an Alpha will report 12345678. If the test program works the default is
95 probably right.
96 I'm now running the test program...
97 EOM
98                 $cat >try.c <<EOCP
99 #include <stdio.h>
100 #$i_stdlib I_STDLIB
101 #ifdef I_STDLIB
102 #include <stdlib.h>
103 #endif
104 #include <sys/types.h>
105 typedef $uvtype UV;
106 int main()
107 {
108         int i;
109         union {
110                 UV l;
111                 char c[$uvsize];
112         } u;
113
114         if ($uvsize > 4)
115                 u.l = (((UV)0x08070605) << 32) | (UV)0x04030201;
116         else
117                 u.l = (UV)0x04030201;
118         for (i = 0; i < $uvsize; i++)
119                 printf("%c", u.c[i]+'0');
120         printf("\n");
121         exit(0);
122 }
123 EOCP
124                 xxx_prompt=y
125                 set try
126                 if eval $compile && $run ./try > /dev/null; then
127                         dflt=`$run ./try`
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...)
141 EOM
142                 fi
143                 case "$xxx_prompt" in
144                 y)
145                         rp="What is the order of bytes in $uvtype?"
146                         . ./myread
147                         byteorder="$ans"
148                         ;;
149                 *)      byteorder=$dflt
150                         ;;
151                 esac
152                 ;;
153         esac
154         $rm_try
155         ;;
156 esac
157