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