|
|
1.1 root 1: /*
2: * mkmakefile.c 1.10 81/05/18
3: * Functions in this file build the makefile from the files list
4: * and the information in the config table
5: */
6:
7: #include <stdio.h>
8: #include <ctype.h>
9: #include "y.tab.h"
10: #include "config.h"
11:
12: char *mkfile = "mkfile";
13:
14: #define next_word(fp, wd)\
15: { register char *word = get_word(fp);\
16: if (word == WEOF) return EOF; \
17: else wd = word; }
18:
19: static struct file_list *fcur;
20:
21: /*
22: * fl_lookup
23: * look up a file name
24: */
25:
26: struct file_list *fl_lookup(file)
27: register char *file;
28: {
29: register struct file_list *fp;
30:
31: for (fp = ftab ; fp != NULL; fp = fp->f_next)
32: {
33: if (eq(fp->f_fn, file))
34: return fp;
35: }
36: return NULL;
37: }
38:
39: /*
40: * new_fent
41: * Make a new file list entry
42: */
43:
44: struct file_list *new_fent()
45: {
46: register struct file_list *fp;
47:
48: fp = (struct file_list *) malloc(sizeof *fp);
49: fp->f_needs = NULL;
50: fp->f_next = NULL;
51: if (fcur == NULL)
52: fcur = ftab = fp;
53: else
54: fcur->f_next = fp;
55: fcur = fp;
56: return fp;
57: }
58:
59: /*
60: * makefile:
61: * Build the makefile from the skeleton
62: */
63:
64: makefile()
65: {
66: FILE *ifp, *ofp;
67: char line[BUFSIZ];
68: struct cputype *cp;
69: struct opt *op;
70: char *raise();
71:
72: read_files(); /* Read in the "files" file */
73: ifp = fopen(GLOBAL(mkfile), "r");
74: if (ifp == NULL) {
75: perror(GLOBAL(mkfile));
76: exit(1);
77: }
78: ofp = fopen(LOCAL(mkfile), "w");
79: if (ofp == NULL) {
80: perror(LOCAL(mkfile));
81: exit(1);
82: }
83: fprintf(ofp, "IDENT=");
84: if (cputype == NULL) {
85: printf("cpu type must be specified\n");
86: exit(1);
87: }
88: for (cp = cputype; cp; cp = cp->cpu_next)
89: fprintf(ofp, " -D%s", cp->cpu_name);
90: for (op = opt; op; op = op->op_next)
91: fprintf(ofp, " -D%s", op->op_name);
92: fprintf(ofp, "\n");
93: if (hz == 0) {
94: #ifdef notdef
95: printf("hz not specified; 50hz assumed\n");
96: #endif
97: #ifdef vax
98: hz = 60;
99: #endif
100: #ifdef sun
101: hz = 50;
102: #endif
103: }
104: if (hadtz == 0)
105: printf("timezone not specified; gmt assumed\n");
106: if (maxusers == 0) {
107: printf("maxusers not specified; 24 assumed\n");
108: maxusers = 24;
109: } else if (maxusers < 8) {
110: printf("minimum of 8 maxusers assumed\n");
111: maxusers = 8;
112: } else if (maxusers > 128) {
113: printf("maxusers truncated to 128\n");
114: maxusers = 128;
115: }
116: fprintf(ofp, "PARAM= -DHZ=%d -DTIMEZONE=%d -DDST=%d -DMAXUSERS=%d\n",
117: hz, timezone, dst, maxusers);
118: while(fgets(line, BUFSIZ, ifp) != NULL)
119: {
120: if (*line != '%')
121: {
122: fprintf(ofp, "%s", line);
123: continue;
124: }
125: else if (eq(line, "%OBJS\n"))
126: do_objs(ofp);
127: else if (eq(line, "%CFILES\n"))
128: do_cfiles(ofp);
129: else if (eq(line, "%SFILES\n"))
130: do_sfiles(ofp);
131: else if (eq(line, "%RULES\n"))
132: do_rules(ofp);
133: else if (eq(line, "%LOAD\n"))
134: do_load(ofp);
135: else
136: fprintf(stderr, "Unknown %% construct in generic %s: %s", mkfile, line);
137: }
138: fclose(ifp);
139: fclose(ofp);
140: }
141:
142: /*
143: * files:
144: * Read in the "files" file.
145: * Store it in the ftab linked list
146: */
147:
148: read_files()
149: {
150:
151: ftab = NULL;
152: read_files_file(GLOBAL("files"), TRUE);
153: read_files_file(LOCAL("files"), FALSE);
154: }
155:
156: read_files_file(filename, must_exist)
157: char *filename;
158: {
159: FILE *fp;
160: register struct file_list *tp;
161: register struct device *dp;
162: register char *wd, *this;
163: int type;
164:
165: fp = fopen(filename, "r");
166: if (fp == NULL) {
167: if (must_exist) {
168: perror(filename);
169: exit(1);
170: } else
171: return;
172: }
173: while((wd = get_word(fp)) != WEOF)
174: {
175: if (wd == NULL)
176: continue;
177: this = ns(wd);
178: /*
179: * Read standard/optional
180: */
181: next_word(fp, wd);
182: if (wd == NULL)
183: {
184: fprintf(stderr, "Huh, no type for %s in files.\n", this);
185: exit(10);
186: }
187: if ((tp = fl_lookup(wd)) == NULL)
188: tp = new_fent();
189: else
190: free(tp->f_fn);
191: tp->f_fn = this;
192: type = 0;
193: if (eq(wd, "optional"))
194: {
195: next_word(fp, wd);
196: if (wd == NULL)
197: {
198: fprintf(stderr, "Needed a dev for optional(%s)\n", this);
199: exit(11);
200: }
201: tp->f_needs = ns(wd);
202: for (dp = dtab ; dp != NULL; dp = dp->d_next)
203: {
204: if (eq(dp->d_name, wd))
205: break;
206: }
207: if (dp == NULL)
208: type = INVISIBLE;
209: }
210: next_word(fp, wd);
211: if (type == 0 && wd != NULL)
212: type = DEVICE;
213: else if (type == 0)
214: type = NORMAL;
215: tp->f_type = type;
216: }
217: fclose(fp);
218: }
219:
220: /*
221: * do_objs
222: * Spew forth the OBJS definition
223: */
224:
225: do_objs(fp)
226: FILE *fp;
227: {
228: register struct file_list *tp;
229: register int lpos, len;
230: register char *cp, och, *sp;
231: char *tail();
232:
233: fprintf(fp, "OBJS=");
234: lpos = 6;
235: for (tp = ftab; tp != NULL; tp = tp->f_next)
236: {
237: if (tp->f_type == INVISIBLE)
238: continue;
239: sp = tail(tp->f_fn);
240: cp = sp + (len = strlen(sp)) - 1;
241: och = *cp;
242: *cp = 'o';
243: if (len + lpos > 72)
244: {
245: lpos = 8;
246: fprintf(fp, "\\\n\t");
247: }
248: fprintf(fp, "%s ", sp);
249: lpos += len + 1;
250: *cp = och;
251: }
252: if (lpos != 8)
253: putc('\n', fp);
254: }
255:
256: /*
257: * do_cfiles
258: * Spew forth the CFILES definition
259: */
260:
261: do_cfiles(fp)
262: FILE *fp;
263: {
264: register struct file_list *tp;
265: register int lpos, len;
266:
267: fprintf(fp, "CFILES=");
268: lpos = 8;
269: for (tp = ftab; tp != NULL; tp = tp->f_next)
270: {
271: if (tp->f_type == INVISIBLE)
272: continue;
273: if (tp->f_fn[strlen(tp->f_fn)-1] != 'c')
274: continue;
275: if ((len = 3 + strlen(tp->f_fn)) + lpos > 72)
276: {
277: lpos = 8;
278: fprintf(fp, "\\\n\t");
279: }
280: fprintf(fp, "../%s ", tp->f_fn);
281: lpos += len + 1;
282: }
283: if (lpos != 8)
284: putc('\n', fp);
285: }
286:
287: /*
288: * do_sfiles
289: * Spew forth the SFILES definition
290: */
291:
292: do_sfiles(fp)
293: FILE *fp;
294: {
295: register struct file_list *tp;
296: register int lpos, len;
297:
298: fprintf(fp, "SFILES=");
299: lpos = 8;
300: for (tp = ftab; tp != NULL; tp = tp->f_next)
301: {
302: if (tp->f_type == INVISIBLE)
303: continue;
304: if (tp->f_fn[strlen(tp->f_fn)-1] != 's')
305: continue;
306: if ((len = 3 + strlen(tp->f_fn)) + lpos > 72)
307: {
308: lpos = 8;
309: fprintf(fp, "\\\n\t");
310: }
311: fprintf(fp, "../%s ", tp->f_fn);
312: lpos += len + 1;
313: }
314: if (lpos != 8)
315: putc('\n', fp);
316: }
317:
318: /*
319: * tail:
320: * Return tail end of a filename
321: */
322:
323: char *tail(fn)
324: char *fn;
325: {
326: register char *cp;
327: char *strrchr();
328:
329: cp = strrchr(fn, '/');
330: return cp+1;
331: }
332:
333: /*
334: * do_rules:
335: * Spit out the rules for making each file
336: */
337:
338: do_rules(f)
339: FILE *f;
340: {
341: register char *cp, *np, och, *tp;
342: register struct file_list *ftp;
343:
344: for (ftp = ftab; ftp != NULL; ftp = ftp->f_next)
345: {
346: if (ftp->f_type == INVISIBLE)
347: continue;
348: cp = (np = ftp->f_fn) + strlen(ftp->f_fn) - 1;
349: och = *cp;
350: *cp = '\0';
351: fprintf(f, "%so: ../%s%c\n", tail(np), np, och);
352: tp = tail(np);
353: if (och == 's')
354: {
355: #ifdef vax
356: fprintf(f, "\t${AS} -o %so ../%ss\n\n", tp, np);
357: #endif
358: #ifdef sun
359: fprintf(f, "\t/lib/cpp -E -I. %s ../%ss >%si\n",
360: "-DLOCORE ${IDENT} -DKERNEL", np, tp);
361: fprintf(f, "\t${AS} -o %so %si\n", tp, tp);
362: fprintf(f, "\trm -f %si\n\n", tp);
363: #endif
364: }
365: else if (ftp->f_type == NORMAL)
366: {
367: #ifdef vax
368: fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../%sc\n", np);
369: fprintf(f, "\t${C2} %ss | sed -f ../sys/asm.sed | ${AS} -o %so\n",
370: tp, tp);
371: fprintf(f, "\trm -f %ss\n\n", tp);
372: #endif
373: #ifdef sun
374: fprintf(f, "\t${CC} -I. -c ${CFLAGS} ../%sc\n\n", np);
375: #endif
376: }
377: else if (ftp->f_type == DEVICE)
378: {
379: #ifdef vax
380: fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../%sc\n", np);
381: fprintf(f,"\t${C2} -i %ss | sed -f ../sys/asm.sed | ${AS} -o %so\n",
382: tp, tp);
383: fprintf(f, "\trm -f %ss\n\n", tp);
384: #endif
385: #ifdef sun
386: fprintf(f, "\t${CC} -I. -c ${CFLAGS} ../%sc\n\n", np);
387: #endif
388: }
389: else
390: fprintf(stderr, "Don't know rules for %s", np);
391: *cp = och;
392: }
393: }
394:
395: /*
396: * Create the load strings
397: */
398:
399: do_load(f)
400: register FILE *f;
401: {
402: register struct file_list *fl;
403: register bool first = TRUE;
404:
405: for (fl = conf_list; fl != NULL; fl = fl->f_next)
406: {
407: #ifdef vax
408: fprintf(f, "%s:Q: %s locore.o ${OBJS} ${EMULO} ioconf.o conf.o param.o swap%s.o\n",
409: #endif
410: #ifdef sun
411: fprintf(f, "%s:Q: %s ${OBJS} ${FOBJS} ubglue.o ioconf.o conf.o param.o swap%s.o stab.o\n",
412: #endif
413: fl->f_needs, mkfile, fl->f_fn);
414: fprintf(f, "\techo loading %s\n\trm -f %s\n",
415: fl->f_needs, fl->f_needs);
416: if (first)
417: {
418: first = FALSE;
419: fprintf(f, "\tsh ../conf/newvers.sh\n");
420: fprintf(f, "\tcc ${CFLAGS} -c vers.c\n");
421: }
422: #ifdef vax
423: fprintf(f,
424: "\tld -n -o %s -e start -x -T 80000000 locore.o ${OBJS} ${EMULO} vers.o ioconf.o conf.o param.o swap%s.o\n",
425: fl->f_needs, fl->f_fn);
426: #endif
427: #ifdef sun
428: fprintf(f,
429: "\t${LD} -o %s -e _start -N -X -T 0F004000 ${OBJS} ${FOBJS} ubglue.o vers.o ioconf.o conf.o param.o swap%s.o stab.o\n",
430: fl->f_needs, fl->f_fn);
431: #endif
432: fprintf(f, "\tsize %s\n", fl->f_needs);
433: fprintf(f, "\tchmod 755 %s\n\n", fl->f_needs);
434: }
435: for (fl = conf_list; fl != NULL; fl = fl->f_next)
436: {
437: fprintf(f, "swap%s.o: ../dev/swap%s.c\n", fl->f_fn, fl->f_fn);
438: #ifdef vax
439: fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../dev/swap%s.c\n", fl->f_fn);
440: fprintf(f,
441: "\t${C2} swap%s.s | sed -f ../sys/asm.sed | ${AS} -o swap%s.o\n",
442: fl->f_fn, fl->f_fn);
443: fprintf(f, "\trm -f swap%s.s\n\n", fl->f_fn);
444: #endif
445: #ifdef sun
446: fprintf(f, "\t${CC} -I. -c ${CFLAGS} ../dev/swap%s.c\n\n", fl->f_fn);
447: #endif
448: }
449: fprintf(f, "all:");
450: for (fl = conf_list; fl != NULL; fl = fl->f_next)
451: fprintf(f, " %s", fl->f_needs);
452: putc('\n', f);
453: }
454:
455: char *
456: raise(str)
457: register char *str;
458: {
459: register char *cp = str;
460:
461: while(*str)
462: {
463: if (islower(*str))
464: *str = toupper(*str);
465: str++;
466: }
467: return cp;
468: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.