1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1980, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <sys/file.h>
21 #include <stdio.h>
22 #include <ctype.h>
23 #include "y.tab.h"
24 #include "config.h"
25
26 static char *PREFIX;
27
28 /*
29 * Config builds a set of files for building a UNIX
30 * system given a description of the desired system.
31 */
main(argc,argv)32 main(argc, argv)
33 int argc;
34 char **argv;
35 {
36
37 extern char *optarg;
38 extern int optind;
39 struct stat buf;
40 int ch;
41 char *p;
42
43 while ((ch = getopt(argc, argv, "gp")) != EOF)
44 switch (ch) {
45 case 'g':
46 debugging++;
47 break;
48 case 'p':
49 profiling++;
50 break;
51 case '?':
52 default:
53 goto usage;
54 }
55 argc -= optind;
56 argv += optind;
57
58 if (argc != 1) {
59 usage: fputs("usage: config [-gp] sysname\n", stderr);
60 exit(1);
61 }
62
63 if (freopen(PREFIX = *argv, "r", stdin) == NULL) {
64 perror(PREFIX);
65 exit(2);
66 }
67 if (stat(p = path((char *)NULL), &buf)) {
68 if (mkdir(p, 0777)) {
69 perror(p);
70 exit(2);
71 }
72 }
73 else if ((buf.st_mode & S_IFMT) != S_IFDIR) {
74 fprintf(stderr, "config: %s isn't a directory.\n", p);
75 exit(2);
76 }
77
78 dtab = NULL;
79 confp = &conf_list;
80 compp = &comp_list;
81 if (yyparse())
82 exit(3);
83 switch (machine) {
84
85 case MACHINE_VAX:
86 vax_ioconf(); /* Print ioconf.c */
87 ubglue(); /* Create ubglue.s */
88 break;
89
90 case MACHINE_TAHOE:
91 tahoe_ioconf();
92 vbglue();
93 break;
94
95 case MACHINE_HP300:
96 case MACHINE_LUNA68K:
97 hp300_ioconf();
98 hpglue();
99 break;
100
101 case MACHINE_I386:
102 i386_ioconf(); /* Print ioconf.c */
103 vector(); /* Create vector.s */
104 break;
105
106 case MACHINE_MIPS:
107 case MACHINE_PMAX:
108 pmax_ioconf();
109 break;
110
111 case MACHINE_NEWS3400:
112 news_ioconf();
113 break;
114
115 default:
116 printf("Specify machine type, e.g. ``machine vax''\n");
117 exit(1);
118 }
119 /*
120 * make symbolic links in compilation directory
121 * for "sys" (to make genassym.c work along with #include <sys/xxx>)
122 * and similarly for "machine".
123 */
124 {
125 char xxx[80];
126
127 (void) sprintf(xxx, "../../%s/include", machinename);
128 (void) symlink(xxx, path("machine"));
129 }
130 makefile(); /* build Makefile */
131 headers(); /* make a lot of .h files */
132 swapconf(); /* swap config files */
133 printf("Don't forget to run \"make depend\"\n");
134 exit(0);
135 }
136
137 /*
138 * get_word
139 * returns EOF on end of file
140 * NULL on end of line
141 * pointer to the word otherwise
142 */
143 char *
get_word(fp)144 get_word(fp)
145 register FILE *fp;
146 {
147 static char line[80];
148 register int ch;
149 register char *cp;
150
151 while ((ch = getc(fp)) != EOF)
152 if (ch != ' ' && ch != '\t')
153 break;
154 if (ch == EOF)
155 return ((char *)EOF);
156 if (ch == '\n')
157 return (NULL);
158 cp = line;
159 *cp++ = ch;
160 while ((ch = getc(fp)) != EOF) {
161 if (isspace(ch))
162 break;
163 *cp++ = ch;
164 }
165 *cp = 0;
166 if (ch == EOF)
167 return ((char *)EOF);
168 (void) ungetc(ch, fp);
169 return (line);
170 }
171
172 /*
173 * get_quoted_word
174 * like get_word but will accept something in double or single quotes
175 * (to allow embedded spaces).
176 */
177 char *
get_quoted_word(fp)178 get_quoted_word(fp)
179 register FILE *fp;
180 {
181 static char line[256];
182 register int ch;
183 register char *cp;
184
185 while ((ch = getc(fp)) != EOF)
186 if (ch != ' ' && ch != '\t')
187 break;
188 if (ch == EOF)
189 return ((char *)EOF);
190 if (ch == '\n')
191 return (NULL);
192 cp = line;
193 if (ch == '"' || ch == '\'') {
194 register int quote = ch;
195
196 while ((ch = getc(fp)) != EOF) {
197 if (ch == quote)
198 break;
199 if (ch == '\n') {
200 *cp = 0;
201 printf("config: missing quote reading `%s'\n",
202 line);
203 exit(2);
204 }
205 *cp++ = ch;
206 }
207 } else {
208 *cp++ = ch;
209 while ((ch = getc(fp)) != EOF) {
210 if (isspace(ch))
211 break;
212 *cp++ = ch;
213 }
214 if (ch != EOF)
215 (void) ungetc(ch, fp);
216 }
217 *cp = 0;
218 if (ch == EOF)
219 return ((char *)EOF);
220 return (line);
221 }
222
223 /*
224 * prepend the path to a filename
225 */
226 char *
path(file)227 path(file)
228 char *file;
229 {
230 register char *cp;
231
232 #define CDIR "../../compile/"
233 cp = malloc((unsigned int)(sizeof(CDIR) + strlen(PREFIX) +
234 (file ? strlen(file) : 0) + 2));
235 (void) strcpy(cp, CDIR);
236 (void) strcat(cp, PREFIX);
237 if (file) {
238 (void) strcat(cp, "/");
239 (void) strcat(cp, file);
240 }
241 return (cp);
242 }
243