This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Needs to be conditional on SunOS 4.
[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
126news700 news800 news900 NeXT NLS ns16000 ns32000
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
YST
158$cat Cppsym.know > Cppsym.c
159$cat Cppsym.a Cppsym.b Cppsym.c | $tr ' ' $trnl | sort | uniq > Cppsym.know
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