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