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