This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
e3840a72f92584e2eafe31f16bfe8a6f29fa7014
[metaconfig.git] / U / modified / Cppsym.U
1 ?RCS: $Id: Cppsym.U,v 3.0.1.5 1995/05/12 11:59:11 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 Licence,
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 Licence; 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: Cppsym.U,v $
12 ?RCS: Revision 3.0.1.5  1995/05/12  11:59:11  ram
13 ?RCS: patch54: split awk command onto two lines for older awks (ADO)
14 ?RCS:
15 ?RCS: Revision 3.0.1.4  1995/01/11  14:55:57  ram
16 ?RCS: patch45: new cc vs. cpp symbol checking suggested by JHI
17 ?RCS: patch45: added more cpp symbols (JHI)
18 ?RCS:
19 ?RCS: Revision 3.0.1.3  1994/10/29  15:51:32  ram
20 ?RCS: patch36: added ?F: line for metalint file checking
21 ?RCS: patch36: new symbols ardent and titan (ADO)
22 ?RCS:
23 ?RCS: Revision 3.0.1.2  1994/06/20  06:53:32  ram
24 ?RCS: patch30: extended cpp symbol lookup list (JHI)
25 ?RCS: patch30: renamed attrlist symbol into al for brevity
26 ?RCS:
27 ?RCS: Revision 3.0.1.1  1993/12/15  08:14:14  ram
28 ?RCS: patch15: added new cpp symbols __bsdi__ and BSD_NET2
29 ?RCS:
30 ?RCS: Revision 3.0  1993/08/18  12:04:50  ram
31 ?RCS: Baseline for dist 3.0 netwide release.
32 ?RCS:
33 ?X: 
34 ?X: This unit produces a shell script called Cppsym, which can be used to
35 ?X: determine whether any in a list of symbols is defined by the C compilation
36 ?X: chain (C preprocessor symbols plus C compiler native ones).
37 ?X: It can determine the status of any symbol, though the symbols in $al
38 ?X: are more easily determined.  If you want to add to $al you can do
39 ?X: it in Myinit.U.
40 ?X: 
41 ?MAKE:Cppsym ccsymbols cppsymbols cppccsymbols: run \
42         eunicefix Guess awk cat tr sed sort rm startsh osname \
43         +cc +gccversion test comm uniq echo Options trnl \
44         optimize ccflags ldflags libs
45 ?MAKE:  -pick add $@ %<
46 ?T:also symbols i postprocess_cc_v
47 ?X:
48 ?X: The symbol list is in alpha order for ease of maintenance...
49 ?X:
50 ?X: Lots of new symbols (mostly rummaged from gcc), courtesy of
51 ?X: Jarkko Hietaniemi <jhi@snakemail.hut.fi> -- RAM, 06/06/94
52 ?X:
53 ?S:ccsymbols:
54 ?S:     The variable contains the symbols defined by the C compiler alone.
55 ?S:     The symbols defined by cpp or by cc when it calls cpp are not in
56 ?S:     this list, see cppsymbols and cppccsymbols.
57 ?S:     The list is a space-separated list of symbol=value tokens.
58 ?S:.
59 ?S:cppsymbols:
60 ?S:     The variable contains the symbols defined by the C preprocessor
61 ?S:     alone.  The symbols defined by cc or by cc when it calls cpp are
62 ?S:     not in this list, see ccsymbols and cppccsymbols.
63 ?S:     The list is a space-separated list of symbol=value tokens.
64 ?S:.
65 ?S:cppccsymbols:
66 ?S:     The variable contains the symbols defined by the C compiler
67 ?S:     when it calls cpp.  The symbols defined by the cc alone or cpp
68 ?S:     alone are not in this list, see ccsymbols and cppsymbols.
69 ?S:     The list is a space-separated list of symbol=value tokens.
70 ?S:.
71 ?F:./Cppsym
72 ?F:!Cppsym.true
73 ?F:!ccsym.com
74 ?F:!ccsym.cpp
75 ?F:!ccsym.own
76 ?X: fake LINT hints
77 ?LINT:change cc
78 ?LINT:change optimize
79 ?LINT:change ccflags
80 ?LINT:change ldflags
81 ?LINT:change libs
82 ?LINT:extern s
83 ?LINT:change s
84 ?LINT:extern s__
85 ?LINT:change s__
86 echo " "
87 $echo "Guessing which symbols your C compiler and preprocessor define..." >&4 
88 ?X: If your symbol is mixed case, just add it as-is.
89 ?X: All symbols will be transformed to both all-lower and all-upper.
90 ?X: Also drop any leading/trailing underscores, the scan will try all those.
91 $cat <<'EOSH' > Cppsym.know
92 a29k ABI64 aegis AES_SOURCE AIX AIX32 AIX370
93 AIX41 AIX42 AIX43 AIX_SOURCE aixpc ALL_SOURCE
94 alliant alpha am29000 AM29000 AMD64 amiga AMIGAOS AMIX
95 ansi ANSI_C_SOURCE apollo ardent ARM32 atarist att386 att3b
96 BeOS BIG_ENDIAN BIT_MSF bsd BSD bsd43 bsd4_2 bsd4_3 BSD4_3 bsd4_4
97 BSD_4_3 BSD_4_4 BSD_NET2 BSD_TIME BSD_TYPES BSDCOMPAT bsdi
98 bull c cadmus clipper CMU COFF COMPILER_VERSION
99 concurrent convex cpu cray CRAY CRAYMPP ctix CX_UX
100 CYGWIN DECC DGUX DGUX_SOURCE DJGPP dmert DOLPHIN DPX2 DSO
101 Dynix DynixPTX ELF encore EPI EXTENSIONS FAVOR_BSD
102 FILE_OFFSET_BITS FreeBSD GCC_NEW_VARARGS gcos gcx gimpel
103 GLIBC GLIBC_MINOR
104 GNU_SOURCE GNUC GNUC_MINOR GNU_LIBRARY GO32 gould GOULD_PN
105 H3050R H3050RX hbullx20 hcx host_mips
106 hp200 hp300 hp700 HP700 hp800 hp9000
107 hp9000s200 hp9000s300 hp9000s400 hp9000s500
108 hp9000s700 hp9000s800 hp9k8 hp_osf hppa hpux HPUX_SOURCE
109 i186 i286 i386 i486 i586 i686 i8086 i80960 i860 I960
110 IA64 iAPX286 ibm ibm032 ibmesa IBMR2 ibmrt ILP32 ILP64
111 INLINE_INTRINSICS INTRINSICS INT64 interdata is68k ksr1
112 LANGUAGE_C LARGE_FILE_API LARGEFILE64_SOURCE
113 LARGEFILE_SOURCE LFS64_LARGEFILE LFS_LARGEFILE
114 Linux LITTLE_ENDIAN LONG64 LONG_DOUBLE LONG_LONG
115 LONGDOUBLE LONGLONG LP64 luna luna88k Lynx
116 M68000 m68k m88100 m88k M88KBCS_TARGET M_COFF
117 M_I186 M_I286 M_I386 M_I8086 M_I86 M_I86SM M_SYS3
118 M_SYS5 M_SYSIII M_SYSV M_UNIX M_XENIX MACH machine MachTen
119 MATH_HAS_NO_SIDE_EFFECTS
120 mc300 mc500 mc68000 mc68010 mc68020 mc68030 mc68040
121 mc68060 mc68k mc68k32 mc700 mc88000 mc88100 merlin
122 mert MiNT mips MIPS_FPSET MIPS_ISA MIPS_SIM MIPS_SZINT
123 MIPS_SZLONG MIPS_SZPTR MIPSEB MIPSEL MODERN_C motorola
124 mpeix MSDOS MTXINU MULTIMAX mvs MVS n16 ncl_el ncl_mr
125 NetBSD news1500 news1700 news1800 news1900 news3700
126 news700 news800 news900 NeXT NLS nonstopux ns16000 ns32000
127 ns32016 ns32332 ns32k nsc32000
128 OCS88 OEMVS OpenBSD os OS2 OS390 osf OSF1 OSF_SOURCE
129 pa_risc PA_RISC1_1 PA_RISC2_0 PARAGON parisc
130 pc532 pdp11 PGC PIC plexus PORTAR posix
131 POSIX1B_SOURCE POSIX2_SOURCE POSIX4_SOURCE
132 POSIX_C_SOURCE POSIX_SOURCE POWER
133 PROTOTYPES PWB pyr QNX R3000 REENTRANT RES Rhapsody RISC6000
134 riscix riscos RT S390 SA110 scs SCO sequent sgi SGI_SOURCE SH3 sinix
135 SIZE_INT SIZE_LONG SIZE_PTR SOCKET_SOURCE SOCKETS_SOURCE
136 sony sony_news sonyrisc sparc sparclite spectrum
137 stardent stdc STDC_EXT stratos sun sun3 sun386
138 Sun386i svr3 svr4 SVR4_2 SVR4_SOURCE svr5
139 SX system SYSTYPE_BSD SYSTYPE_BSD43 SYSTYPE_BSD44
140 SYSTYPE_SVR4 SYSTYPE_SVR5 SYSTYPE_SYSV SYSV SYSV3 SYSV4 SYSV5
141 sysV68 sysV88 Tek4132 Tek4300 titan
142 TM3200 TM5400 TM5600
143 tower tower32 tower32_200 tower32_600 tower32_700
144 tower32_800 tower32_850 tss
145 u370 u3b u3b2 u3b20 u3b200 u3b20d u3b5
146 ultrix UMAXV UnicomPBB UnicomPBD UNICOS UNICOSMK
147 unix UNIX95 UNIX99 unixpc unos
148 USE_BSD USE_FILE_OFFSET64 USE_GNU USE_ISOC9X USE_LARGEFILE USE_LARGEFILE64
149 USE_MISC USE_POSIX USE_POSIX199309 USE_POSIX199506 USE_POSIX2
150 USE_REENTRANT USE_SVID USE_UNIX98 USE_XOPEN USE_XOPEN_EXTENDED
151 USGr4 USGr4_2
152 Utek UTek UTS UWIN uxpm uxps vax venix VMESA vms xenix Xenix286
153 XOPEN_SOURCE XOPEN_SOURCE_EXTENDED XPG2 XPG2_EXTENDED
154 XPG3 XPG3_EXTENDED XPG4 XPG4_EXTENDED
155 z8000
156 EOSH
157 # Maybe put other stuff here too.
158 cat <<EOSH >>Cppsym.know
159 $osname
160 EOSH
161 ./tr '[a-z]' '[A-Z]' < Cppsym.know > Cppsym.a
162 ./tr '[A-Z]' '[a-z]' < Cppsym.know > Cppsym.b
163 $cat Cppsym.know > Cppsym.c
164 $cat Cppsym.a Cppsym.b Cppsym.c | $tr ' ' $trnl | $sort | $uniq > Cppsym.know
165 $rm -f Cppsym.a Cppsym.b Cppsym.c
166 cat <<EOSH > Cppsym
167 $startsh
168 if $test \$# -gt 0; then
169     echo \$* | $tr " " "$trnl" | ./Cppsym.try > Cppsym.got
170     if $test -s Cppsym.got; then
171         $rm -f Cppsym.got
172         exit 0
173     fi
174     $rm -f Cppsym.got
175     exit 1
176 else
177     $tr " " "$trnl" | ./Cppsym.try
178     exit 0
179 fi
180 EOSH
181 chmod +x Cppsym
182 $eunicefix Cppsym
183 ?X: The below awk script will die a horrible death if
184 ?X: some of the tested symbols are not long ints.
185 ?X: Also, we do not make difference between just defined and defined zero.
186 cat <<EOSH > Cppsym.try
187 $startsh
188 cat <<'EOCP' > try.c
189 #include <stdio.h>
190 int main() {
191 EOCP
192 ?X: The length($1) command guards against possible empty entries.
193 ?X: The awk snippet is know to give heartburn to UNICOS/mk awk.
194 $awk \\
195 EOSH
196 cat <<'EOSH' >> Cppsym.try
197 'length($1) > 0 {
198     printf "#ifdef %s\n#if %s+0\nprintf(\"%s=%%ld\\n\", (long)%s);\n#else\nprintf(\"%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
199     printf "#ifdef _%s\n#if _%s+0\nprintf(\"_%s=%%ld\\n\", (long)_%s);\n#else\nprintf(\"_%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
200     printf "#ifdef __%s\n#if __%s+0\nprintf(\"__%s=%%ld\\n\", (long)__%s);\n#else\nprintf(\"__%s\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
201     printf "#ifdef __%s__\n#if __%s__+0\nprintf(\"__%s__=%%ld\\n\", (long)__%s__);\n#else\nprintf(\"__%s__\\n\");\n#endif\n#endif\n", $1, $1, $1, $1, $1
202 }'       >> try.c
203 echo 'return 0;}' >> try.c
204 EOSH
205 cat <<EOSH >> Cppsym.try
206 ccflags="$ccflags"
207 case "$osname-$gccversion" in
208 irix-) ccflags="\$ccflags -woff 1178" ;;
209 os2-*) ccflags="\$ccflags -Zlinker /PM:VIO" ;;
210 esac
211 $cc -o try $optimize \$ccflags $ldflags try.c $libs && $run ./try
212 EOSH
213 chmod +x Cppsym.try
214 $eunicefix Cppsym.try
215 ./Cppsym < Cppsym.know > Cppsym.true
216 : now check the C compiler for additional symbols
217 ?X: suggested by Jarkko Hietaniemi <jhi@snakemail.hut.fi>, thanks!
218 postprocess_cc_v=''
219 case "$osname" in
220 aix) postprocess_cc_v="|$tr , ' '" ;;
221 esac
222 $cat >ccsym <<EOS
223 $startsh
224 $cat >tmp.c <<EOF
225 extern int foo;
226 EOF
227 for i in \`$cc -v -c tmp.c 2>&1 $postprocess_cc_v\`
228 do
229         case "\$i" in
230         -D*) echo "\$i" | $sed 's/^-D//';;
231         -A*) $test "$gccversion" && echo "\$i" | $sed 's/^-A//' | $sed 's/\(.*\)(\(.*\))/\1=\2/';;
232         esac
233 done
234 $rm -f try.c
235 EOS
236 postprocess_cc_v=''
237 chmod +x ccsym
238 $eunicefix ccsym
239 ./ccsym > ccsym1.raw
240 ?X: AIX complains if $uniq is passed an empty file.  ($sort apparently
241 ?X: doesn't care.)  --AD  14 July 1998
242 if $test -s ccsym1.raw; then
243        $sort ccsym1.raw | $uniq >ccsym.raw
244 else
245        mv ccsym1.raw ccsym.raw
246 fi
247
248 ?X: canonicalize symbols for easier sort/uniq/comm usage: append =1 if no = sign
249 ?X: the awk script must be on two lines for older awk programs, sigh! -- ADO
250 $awk '/\=/ { print $0; next }
251         { print $0"=1" }' ccsym.raw >ccsym.list
252 $awk '/\=/ { print $0; next }
253         { print $0"=1" }' Cppsym.true >ccsym.true
254 $comm -13 ccsym.true ccsym.list >ccsym.own
255 $comm -12 ccsym.true ccsym.list >ccsym.com
256 $comm -23 ccsym.true ccsym.list >ccsym.cpp
257 also=''
258 if $test -z ccsym.raw; then
259         echo "Your C compiler doesn't seem to define any symbols!" >&4
260         echo " "
261         echo "However, your C preprocessor defines the following symbols:"
262         $cat Cppsym.true
263         ccsymbols=''
264         cppsymbols=`$cat Cppsym.true`
265         cppsymbols=`echo $cppsymbols`
266         cppccsymbols="$cppsymbols"
267 else
268         if $test -s ccsym.com; then
269                 echo "Your C compiler and pre-processor define these symbols:"
270                 $sed -e 's/\(..*\)=.*/\1/' ccsym.com
271                 also='also '
272                 symbols='ones'
273                 cppccsymbols=`$cat ccsym.com`
274                 cppccsymbols=`echo $cppccsymbols`
275                 $test "$silent" || sleep 1
276         fi
277         if $test -s ccsym.cpp; then
278                 $test "$also" && echo " "
279                 echo "Your C pre-processor ${also}defines the following symbols:"
280                 $sed -e 's/\(..*\)=.*/\1/' ccsym.cpp
281                 also='further '
282                 cppsymbols=`$cat ccsym.cpp`
283                 cppsymbols=`echo $cppsymbols`
284                 $test "$silent" || sleep 1
285         fi
286         if $test -s ccsym.own; then
287                 $test "$also" && echo " "
288                 echo "Your C compiler ${also}defines the following cpp symbols:"
289                 $sed -e 's/\(..*\)=1/\1/' ccsym.own
290                 $sed -e 's/\(..*\)=.*/\1/' ccsym.own | $uniq >>Cppsym.true
291                 ccsymbols=`$cat ccsym.own`
292                 ccsymbols=`echo $ccsymbols`
293                 $test "$silent" || sleep 1
294         fi
295 fi
296