| 1 | #!/bin/csh -f |
| 2 | # |
| 3 | # This script should be executed to configure the Tcl source directory |
| 4 | # for a particular system. It probes the system for various header |
| 5 | # files and library object files. Where things needed by Tcl are missing, |
| 6 | # substitute versions are included from the "compat" subdirectory. |
| 7 | # |
| 8 | # $Header: /user6/ouster/tcl/RCS/config,v 1.30 92/05/13 09:27:18 ouster Exp $ SPRITE (Berkeley) |
| 9 | # |
| 10 | # Copyright 1991, 1992 Regents of the University of California |
| 11 | # Permission to use, copy, modify, and distribute this |
| 12 | # software and its documentation for any purpose and without |
| 13 | # fee is hereby granted, provided that this copyright |
| 14 | # notice appears in all copies. The University of California |
| 15 | # makes no representations about the suitability of this |
| 16 | # software for any purpose. It is provided "as is" without |
| 17 | # express or implied warranty. |
| 18 | |
| 19 | #-------------------------------------------------------------- |
| 20 | # The variable definitions below configure this script: they |
| 21 | # tell where system-defined things are kept (so this program |
| 22 | # can tell whether the system contains certain features needed |
| 23 | # by Tcl), and they indicate which Tcl files to modify to |
| 24 | # reflect the configuration. |
| 25 | |
| 26 | # Directory containing system include files: |
| 27 | |
| 28 | set includeDir="/usr/include" |
| 29 | |
| 30 | # Archive file containing object code for standard C library: |
| 31 | |
| 32 | set libc="/usr/lib/libc.a" |
| 33 | |
| 34 | # Makefile to modify: |
| 35 | |
| 36 | set makefile="makefile" |
| 37 | |
| 38 | # Header file to modify to hold #defines about system configuration: |
| 39 | |
| 40 | set config="tclunix.h" |
| 41 | #-------------------------------------------------------------- |
| 42 | |
| 43 | set changes=0 |
| 44 | unset time |
| 45 | |
| 46 | # First make sure that the configuration variables have been |
| 47 | # set in a reasonable fashion. |
| 48 | |
| 49 | if ( ! -r $includeDir/stdio.h ) then |
| 50 | echo "- ERROR\!\! $includeDir doesn't seem to contain standard system" |
| 51 | echo " include files. Please edit config to set the includeDir" |
| 52 | echo " variable." |
| 53 | exit(1) |
| 54 | endif |
| 55 | if ( ! -r $libc ) then |
| 56 | echo "- ERROR\!\! C library $libc doesn\'t exist. Please edit config" |
| 57 | echo " to set the libc variable." |
| 58 | exit(1) |
| 59 | endif |
| 60 | nm -p $libc > tmp.libc |
| 61 | if ( $status != 0 ) then |
| 62 | echo "- ERROR\!\! Nm failed to extract names of system-supplied library" |
| 63 | echo " procedures from $libc. You'll have to modify config by hand to" |
| 64 | echo " fix the problem (whatever it is)." |
| 65 | exit(1) |
| 66 | endif |
| 67 | |
| 68 | # Since nm produces different output on different machines, the code |
| 69 | # below attempts to guess what pattern to grep for in the nm output. |
| 70 | |
| 71 | set pattern="[ADIT]" |
| 72 | set x=`grep printf tmp.libc | grep -c CODE` |
| 73 | if ( $x ) then |
| 74 | set pattern=CODE |
| 75 | endif |
| 76 | set x=`grep printf tmp.libc | grep -c extern` |
| 77 | if ( $x ) then |
| 78 | set pattern="|extern|" |
| 79 | endif |
| 80 | |
| 81 | # Check in the C library for particular library procedures and |
| 82 | # variables needed by Tcl. |
| 83 | |
| 84 | set gettod=`grep gettimeofday tmp.libc | grep -c "$pattern"` |
| 85 | if ( $gettod > 1 ) set gettod=1 |
| 86 | set getwd=`grep getwd tmp.libc | grep -c "$pattern"` |
| 87 | if ( $getwd > 1 ) set getwd=1 |
| 88 | set opendir=`grep opendir tmp.libc | grep -c "$pattern"` |
| 89 | if ( $opendir > 1 ) set opendir=1 |
| 90 | set strerror=`grep strerror tmp.libc | grep -c "$pattern"` |
| 91 | if ( $strerror > 1 ) set strerror=1 |
| 92 | set strstr=`grep strstr tmp.libc | grep -c "$pattern"` |
| 93 | if ( $strstr > 1 ) set strstr=1 |
| 94 | set strtod=`grep strtod tmp.libc | grep -c "$pattern"` |
| 95 | if ( $strtod > 1 ) set strtod=1 |
| 96 | set strtol=`grep strtol tmp.libc | grep -c "$pattern"` |
| 97 | if ( $strtol > 1 ) set strtol=1 |
| 98 | set strtoul=`grep strtoul tmp.libc | grep -c "$pattern"` |
| 99 | if ( $strtoul > 1 ) set strtoul=1 |
| 100 | set sys_errlist=`grep sys_errlist tmp.libc | grep -c "$pattern"` |
| 101 | if ( $sys_errlist > 1 ) set sys_errlist=1 |
| 102 | \rm tmp.libc |
| 103 | |
| 104 | # Next, install header files that aren't present in /usr/include. |
| 105 | |
| 106 | set extraHdrs="" |
| 107 | foreach i (dirent.h limits.h) |
| 108 | \rm -f $i |
| 109 | if ( ! -r $includeDir/$i ) then |
| 110 | cp compat/$i . |
| 111 | set extraHdrs="$extraHdrs $i" |
| 112 | endif |
| 113 | end |
| 114 | set stdlibOK=0 |
| 115 | \rm -f stdlib.h |
| 116 | if ( -r $includeDir/stdlib.h ) then |
| 117 | # The check below is needed because SunOS has a stdlib that |
| 118 | # doesn't declare strtod and other procedures, so we have to |
| 119 | # use ours instead. |
| 120 | |
| 121 | set chk1=`grep -c strtol $includeDir/stdlib.h` |
| 122 | set chk2=`grep -c strtoul $includeDir/stdlib.h` |
| 123 | set chk3=`grep -c strtod $includeDir/stdlib.h` |
| 124 | if ( $chk1 > 0 && $chk2 > 0 && $chk3 > 0 ) then |
| 125 | set stdlibOK=1 |
| 126 | endif |
| 127 | endif |
| 128 | # XXX: Un-Kludge around sun acc, which doesn't need this... |
| 129 | set stdlibOK=1 |
| 130 | if ( ! $stdlibOK ) then |
| 131 | cp compat/stdlib.h . |
| 132 | set extraHdrs="$extraHdrs stdlib.h" |
| 133 | endif |
| 134 | |
| 135 | # Even if string.h exists it's not complete on all systems. If |
| 136 | # some of the procedures we need are missing from the library, then |
| 137 | # also install a Tcl-specific string.h. |
| 138 | |
| 139 | \rm -f string.h |
| 140 | if ( ! $strstr || ! $strtoul || ! -r $includeDir/string.h ) then |
| 141 | cp compat/string.h . |
| 142 | set extraHdrs="$extraHdrs string.h" |
| 143 | endif |
| 144 | if ( "$extraHdrs" != "" ) then |
| 145 | echo "- Substitutes will be used for the following header files," |
| 146 | echo " which aren't in ${includeDir} or aren't complete:" |
| 147 | echo " $extraHdrs" |
| 148 | set changes=1 |
| 149 | endif |
| 150 | |
| 151 | # Even if strtoul exists, it is bogus on some AIX systems. Detect |
| 152 | # this and pretend the system version doesn't exist if it's bogus. |
| 153 | |
| 154 | if ( $strtoul ) then |
| 155 | cp compat/teststrtoul.c test.c |
| 156 | make configtest >& /dev/null |
| 157 | if ( $status == 0 ) then |
| 158 | ./a.out |
| 159 | if ( $status != 0 ) then |
| 160 | set strtoul=0 |
| 161 | endif |
| 162 | endif |
| 163 | \rm -f a.out test.c |
| 164 | endif |
| 165 | |
| 166 | # Next, install C procedures for missing library functions. |
| 167 | |
| 168 | set extraLibs="" |
| 169 | \rm -f strerror.c |
| 170 | if ( ! $strerror ) then |
| 171 | set extraLibs="$extraLibs strerror" |
| 172 | cp compat/strerror.c . |
| 173 | endif |
| 174 | \rm -f opendir.c |
| 175 | if ( ! $opendir ) then |
| 176 | set extraLibs="$extraLibs opendir" |
| 177 | cp compat/opendir.c . |
| 178 | \rm -f dirent.h |
| 179 | cp compat/dirent2.h dirent.h |
| 180 | echo "- No opendir/readdir/closedir library exists in this system," |
| 181 | echo " so substitutes will be provided. This system better have" |
| 182 | echo " V7-style directories\!" |
| 183 | endif |
| 184 | \rm -f strstr.c |
| 185 | if ( ! $strstr ) then |
| 186 | set extraLibs="$extraLibs strstr" |
| 187 | cp compat/strstr.c . |
| 188 | endif |
| 189 | \rm -f strtod.c |
| 190 | if ( ! $strtod ) then |
| 191 | set extraLibs="$extraLibs strtod" |
| 192 | cp compat/strtod.c . |
| 193 | endif |
| 194 | \rm -f strtol.c |
| 195 | if ( ! $strtol ) then |
| 196 | set extraLibs="$extraLibs strtol" |
| 197 | cp compat/strtol.c . |
| 198 | endif |
| 199 | \rm -f strtoul.c |
| 200 | if ( ! $strtoul ) then |
| 201 | set extraLibs="$extraLibs strtoul" |
| 202 | cp compat/strtoul.c . |
| 203 | endif |
| 204 | if ( "$extraLibs" != "" ) then |
| 205 | echo "- Substitutes will be used for the following library procedures," |
| 206 | echo " which aren't in ${libc} or don't work correctly:" |
| 207 | echo " $extraLibs" |
| 208 | set changes=1 |
| 209 | endif |
| 210 | |
| 211 | # The following statements determine whether ranlib should be used |
| 212 | # in the Makefile. On System-V systems it shouldn't. The only way |
| 213 | # to figure this out is to run ranlib and see if it complains (ranlib |
| 214 | # actually exists on some Sys-V systems, but it returns an error if |
| 215 | # you run it). |
| 216 | |
| 217 | set ranlibOK=0 |
| 218 | cat > ranlibtest.c << EOF |
| 219 | #include <stdio.h> |
| 220 | main (argc, argv) |
| 221 | int argc; |
| 222 | char **argv; |
| 223 | { |
| 224 | printf ("Hello, world.\n"); |
| 225 | } |
| 226 | EOF |
| 227 | cc -c ranlibtest.c |
| 228 | ar cru ranlibtest.a ranlibtest.o |
| 229 | ranlib ranlibtest.a >& /dev/null |
| 230 | if ( $status == 0 ) then |
| 231 | set ranlibOK=1 |
| 232 | else |
| 233 | echo "- This system appears to be a System V one where ranlib isn't" |
| 234 | echo " used. The ranlib commands will be removed from Makefile." |
| 235 | set changes=1 |
| 236 | endif |
| 237 | \rm -f ranlibtest.* |
| 238 | |
| 239 | # Modify the Makefile to include supplemental library sources, if needed. |
| 240 | |
| 241 | set compatObjs="" |
| 242 | foreach i ($extraLibs) |
| 243 | set compatObjs="$compatObjs $i.o" |
| 244 | end |
| 245 | #if ( ! -e $makefile.bak ) mv $makefile $makefile.bak |
| 246 | mv $makefile $makefile.bak |
| 247 | if ( $ranlibOK ) then |
| 248 | sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" $makefile.bak > $makefile |
| 249 | else |
| 250 | sed -e "s/COMPAT_OBJS =/COMPAT_OBJS =$compatObjs/" \ |
| 251 | -e "/ranlib/d" $makefile.bak > $makefile |
| 252 | endif |
| 253 | |
| 254 | # Set the #defines in tclUnix.h to provide various pieces of system |
| 255 | # configuration information at compile time (existence of header files, |
| 256 | # variables, type definitions, etc.) |
| 257 | |
| 258 | if ( ! $gettod ) then |
| 259 | echo "- There's no gettimeofday in ${libc} so Tcl will use" |
| 260 | echo ' times for the "time" command.' |
| 261 | set changes=1 |
| 262 | endif |
| 263 | if ( ! $getwd ) then |
| 264 | echo "- There's no getwd in ${libc} so Tcl will use" |
| 265 | echo ' getcwd for the "pwd" command.' |
| 266 | set changes=1 |
| 267 | endif |
| 268 | set errlist=1 |
| 269 | if ( ! $sys_errlist && ! $strerror ) then |
| 270 | echo "- Neither strerror nor sys_errlist is defined in ${libc} so" |
| 271 | echo " Tcl will make a guess about errno-related messages." |
| 272 | set errlist=0 |
| 273 | set changes=1 |
| 274 | endif |
| 275 | set sysTime=0 |
| 276 | if ( -r $includeDir/sys/time.h ) then |
| 277 | set sysTime=1 |
| 278 | endif |
| 279 | set sysWait=0 |
| 280 | set unionWait=0 |
| 281 | if ( -r $includeDir/sys/wait.h ) then |
| 282 | set sysWait=1 |
| 283 | cp compat/testwait.c test.c |
| 284 | make configtest >& /dev/null |
| 285 | if ( $status == 0 ) then |
| 286 | set unionWait=1 |
| 287 | endif |
| 288 | \rm -f a.out test.c |
| 289 | endif |
| 290 | set pid_t=1 |
| 291 | cp compat/testpid.c test.c |
| 292 | make configtest >& /dev/null |
| 293 | if ( $status != 0 ) then |
| 294 | set pid_t=0 |
| 295 | echo "- The type pid_t isn't defined in <sys/types.h> so Tcl will" |
| 296 | echo ' use "int" instead.' |
| 297 | endif |
| 298 | \rm -f a.out test.c |
| 299 | set uid_t=1 |
| 300 | cp compat/testuid.c test.c |
| 301 | make configtest >& /dev/null |
| 302 | if ( $status != 0 ) then |
| 303 | set uid_t=0 |
| 304 | echo "- The type uid_t isn't defined in <sys/types.h> so Tcl will" |
| 305 | echo ' use "int" instead.' |
| 306 | endif |
| 307 | \rm -f a.out test.c |
| 308 | if ( ! -e $config.bak ) mv $config $config.bak |
| 309 | set x=\.\*\$ |
| 310 | sed -e "s/define TCL_GETTOD 1/define TCL_GETTOD $gettod/" \ |
| 311 | -e "s/define TCL_GETWD 1/define TCL_GETWD $getwd/" \ |
| 312 | -e "s/define TCL_SYS_ERRLIST 1/define TCL_SYS_ERRLIST $errlist/" \ |
| 313 | -e "s/define TCL_SYS_TIME_H 1/define TCL_SYS_TIME_H $sysTime/" \ |
| 314 | -e "s/define TCL_SYS_WAIT_H 1/define TCL_SYS_WAIT_H $sysWait/" \ |
| 315 | -e "s/define TCL_UNION_WAIT 1/define TCL_UNION_WAIT $unionWait/" \ |
| 316 | -e "s/define TCL_PID_T 1/define TCL_PID_T $pid_t/" \ |
| 317 | -e "s/define TCL_UID_T 1/define TCL_UID_T $uid_t/" \ |
| 318 | $config.bak > $config |
| 319 | |
| 320 | if ( ! $changes ) then |
| 321 | echo "- No special modifications were needed for this system." |
| 322 | endif |