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