|
|
1.1 root 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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.