|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)mkmakefile.c 1.30 (Berkeley) 8/11/83";
3: #endif
4:
5: /*
6: * Build the makefile for the system, from
7: * the information in the files files and the
8: * additional files for the machine being compiled to.
9: */
10:
11: #include <stdio.h>
12: #include <ctype.h>
13: #include "y.tab.h"
14: #include "config.h"
15:
16: #define next_word(fp, wd) \
17: { register char *word = get_word(fp); \
18: if (word == (char *)EOF) \
19: return; \
20: else \
21: wd = word; \
22: }
23:
24: static struct file_list *fcur;
25: char *tail();
26:
27: /*
28: * Lookup a file, by make.
29: */
30: struct file_list *
31: fl_lookup(file)
32: register char *file;
33: {
34: register struct file_list *fp;
35:
36: for (fp = ftab ; fp != 0; fp = fp->f_next) {
37: if (eq(fp->f_fn, file))
38: return (fp);
39: }
40: return (0);
41: }
42:
43: /*
44: * Lookup a file, by final component name.
45: */
46: struct file_list *
47: fltail_lookup(file)
48: register char *file;
49: {
50: register struct file_list *fp;
51:
52: for (fp = ftab ; fp != 0; fp = fp->f_next) {
53: if (eq(tail(fp->f_fn), tail(file)))
54: return (fp);
55: }
56: return (0);
57: }
58:
59: /*
60: * Make a new file list entry
61: */
62: struct file_list *
63: new_fent()
64: {
65: register struct file_list *fp;
66:
67: fp = (struct file_list *) malloc(sizeof *fp);
68: fp->f_needs = 0;
69: fp->f_next = 0;
70: fp->f_flags = 0;
71: fp->f_type = 0;
72: if (fcur == 0)
73: fcur = ftab = fp;
74: else
75: fcur->f_next = fp;
76: fcur = fp;
77: return (fp);
78: }
79:
80: char *COPTS;
81:
82: /*
83: * Build the makefile from the skeleton
84: */
85: makefile()
86: {
87: FILE *ifp, *ofp;
88: char line[BUFSIZ];
89: struct opt *op;
90:
91: read_files();
92: strcpy(line, "../conf/makefile.");
93: (void) strcat(line, machinename);
94: ifp = fopen(line, "r");
95: if (ifp == 0) {
96: perror(line);
97: exit(1);
98: }
99: ofp = fopen(path("makefile"), "w");
100: if (ofp == 0) {
101: perror(path("makefile"));
102: exit(1);
103: }
104: fprintf(ofp, "IDENT=-D%s", raise(ident));
105: if (profiling)
106: fprintf(ofp, " -DGPROF");
107: if (cputype == 0) {
108: printf("cpu type must be specified\n");
109: exit(1);
110: }
111: { struct cputype *cp;
112: for (cp = cputype; cp; cp = cp->cpu_next)
113: fprintf(ofp, " -D%s", cp->cpu_name);
114: }
115: for (op = opt; op; op = op->op_next)
116: if (op->op_value)
117: fprintf(ofp, " -D%s=\"%s\"", op->op_name, op->op_value);
118: else
119: fprintf(ofp, " -D%s", op->op_name);
120: fprintf(ofp, "\n");
121: if (hadtz == 0)
122: printf("timezone not specified; gmt assumed\n");
123: #ifdef vax
124: if (maxusers == 0) {
125: printf("maxusers not specified; 24 assumed\n");
126: maxusers = 24;
127: } else if (maxusers < 8) {
128: printf("minimum of 8 maxusers assumed\n");
129: maxusers = 8;
130: } else if (maxusers > 128) {
131: printf("maxusers truncated to 128\n");
132: maxusers = 128;
133: }
134: #endif
135: #ifdef sun
136: if (maxusers == 0) {
137: printf("maxusers not specified; 8 assumed\n");
138: maxusers = 8;
139: } else if (maxusers < 2) {
140: printf("minimum of 2 maxusers assumed\n");
141: maxusers = 2;
142: } else if (maxusers > 32) {
143: printf("maxusers truncated to 32\n");
144: maxusers = 32;
145: }
146: #endif
147: fprintf(ofp, "PARAM=-DTIMEZONE=%d -DDST=%d -DMAXUSERS=%d\n",
148: timezone, dst, maxusers);
149: while (fgets(line, BUFSIZ, ifp) != 0) {
150: if (*line == '%')
151: goto percent;
152: if (profiling && strncmp(line, "COPTS=", 6) == 0) {
153: register char *cp;
154:
155: fprintf(ofp,
156: "GPROF.EX=/usr/src/lib/libc/%s/csu/gmon.ex\n",
157: machinename);
158: cp = index(line, '\n');
159: if (cp)
160: *cp = 0;
161: cp = line + 6;
162: while (*cp && (*cp == ' ' || *cp == '\t'))
163: cp++;
164: COPTS = malloc((unsigned)(strlen(cp) + 1));
165: if (COPTS == 0) {
166: printf("config: out of memory\n");
167: exit(1);
168: }
169: strcpy(COPTS, cp);
170: fprintf(ofp, "%s -pg\n", line);
171: continue;
172: }
173: fprintf(ofp, "%s", line);
174: continue;
175: percent:
176: if (eq(line, "%OBJS\n"))
177: do_objs(ofp);
178: else if (eq(line, "%CFILES\n"))
179: do_cfiles(ofp);
180: else if (eq(line, "%RULES\n"))
181: do_rules(ofp);
182: else if (eq(line, "%LOAD\n"))
183: do_load(ofp);
184: else
185: fprintf(stderr,
186: "Unknown %% construct in generic makefile: %s",
187: line);
188: }
189: (void) fclose(ifp);
190: (void) fclose(ofp);
191: }
192:
193: /*
194: * Read in the information about files used in making the system.
195: * Store it in the ftab linked list.
196: */
197: read_files()
198: {
199: FILE *fp;
200: register struct file_list *tp;
201: register struct device *dp;
202: char *wd, *this, *needs, *devorprof;
203: char fname[32];
204: int nreqs, first = 1, configdep;
205:
206: ftab = 0;
207: (void) strcpy(fname, "files");
208: openit:
209: fp = fopen(fname, "r");
210: if (fp == 0) {
211: perror(fname);
212: exit(1);
213: }
214: next:
215: /*
216: * filename [ standard | optional ] [ config-dependent ]
217: * [ dev* | profiling-routine ] [ device-driver]
218: */
219: wd = get_word(fp);
220: if (wd == (char *)EOF) {
221: (void) fclose(fp);
222: if (first == 1) {
223: (void) sprintf(fname, "files.%s", machinename);
224: first++;
225: goto openit;
226: }
227: if (first == 2) {
228: (void) sprintf(fname, "files.%s", raise(ident));
229: first++;
230: fp = fopen(fname, "r");
231: if (fp != 0)
232: goto next;
233: }
234: return;
235: }
236: if (wd == 0)
237: goto next;
238: this = ns(wd);
239: next_word(fp, wd);
240: if (wd == 0) {
241: printf("%s: No type for %s.\n",
242: fname, this);
243: exit(1);
244: }
245: if (fl_lookup(this)) {
246: printf("%s: Duplicate file %s.\n",
247: fname, this);
248: exit(1);
249: }
250: tp = 0;
251: if (first == 3 && (tp = fltail_lookup(this)) != 0)
252: printf("%s: Local file %s overrides %s.\n",
253: fname, this, tp->f_fn);
254: nreqs = 0;
255: devorprof = "";
256: configdep = 0;
257: needs = 0;
258: if (eq(wd, "standard"))
259: goto checkdev;
260: if (!eq(wd, "optional")) {
261: printf("%s: %s must be optional or standard\n", fname, this);
262: exit(1);
263: }
264: nextopt:
265: next_word(fp, wd);
266: if (wd == 0)
267: goto doneopt;
268: if (eq(wd, "config-dependent")) {
269: configdep++;
270: goto nextopt;
271: }
272: devorprof = wd;
273: if (eq(wd, "device-driver") || eq(wd, "profiling-routine")) {
274: next_word(fp, wd);
275: goto save;
276: }
277: nreqs++;
278: if (needs == 0)
279: needs = ns(wd);
280: for (dp = dtab; dp != 0; dp = dp->d_next)
281: if (eq(dp->d_name, wd))
282: goto nextopt;
283: while ((wd = get_word(fp)) != 0)
284: ;
285: if (tp == 0)
286: tp = new_fent();
287: tp->f_fn = this;
288: tp->f_type = INVISIBLE;
289: tp->f_needs = needs;
290: goto next;
291:
292: doneopt:
293: if (nreqs == 0) {
294: printf("%s: what is %s optional on?\n",
295: fname, this);
296: exit(1);
297: }
298:
299: checkdev:
300: if (wd) {
301: next_word(fp, wd);
302: if (wd) {
303: if (eq(wd, "config-dependent")) {
304: configdep++;
305: goto checkdev;
306: }
307: devorprof = wd;
308: next_word(fp, wd);
309: }
310: }
311:
312: save:
313: if (wd) {
314: printf("%s: syntax error describing %s\n",
315: fname, this);
316: exit(1);
317: }
318: if (eq(devorprof, "profiling-routine") && profiling == 0)
319: goto next;
320: if (tp == 0)
321: tp = new_fent();
322: tp->f_fn = this;
323: if (eq(devorprof, "device-driver"))
324: tp->f_type = DRIVER;
325: else if (eq(devorprof, "profiling-routine"))
326: tp->f_type = PROFILING;
327: else
328: tp->f_type = NORMAL;
329: tp->f_flags = 0;
330: if (configdep)
331: tp->f_flags |= CONFIGDEP;
332: tp->f_needs = needs;
333: goto next;
334: }
335:
336: do_objs(fp)
337: FILE *fp;
338: {
339: register struct file_list *tp, *fl;
340: register int lpos, len;
341: register char *cp, och, *sp;
342: char swapname[32];
343:
344: fprintf(fp, "OBJS=");
345: lpos = 6;
346: for (tp = ftab; tp != 0; tp = tp->f_next) {
347: if (tp->f_type == INVISIBLE)
348: continue;
349: sp = tail(tp->f_fn);
350: for (fl = conf_list; fl; fl = fl->f_next) {
351: if (fl->f_type != SWAPSPEC)
352: continue;
353: sprintf(swapname, "swap%s.c", fl->f_fn);
354: if (eq(sp, swapname))
355: goto cont;
356: }
357: cp = sp + (len = strlen(sp)) - 1;
358: och = *cp;
359: *cp = 'o';
360: if (len + lpos > 72) {
361: lpos = 8;
362: fprintf(fp, "\\\n\t");
363: }
364: fprintf(fp, "%s ", sp);
365: lpos += len + 1;
366: *cp = och;
367: cont:
368: ;
369: }
370: if (lpos != 8)
371: putc('\n', fp);
372: }
373:
374: do_cfiles(fp)
375: FILE *fp;
376: {
377: register struct file_list *tp;
378: register int lpos, len;
379:
380: fprintf(fp, "CFILES=");
381: lpos = 8;
382: for (tp = ftab; tp != 0; tp = tp->f_next) {
383: if (tp->f_type == INVISIBLE)
384: continue;
385: if (tp->f_fn[strlen(tp->f_fn)-1] != 'c')
386: continue;
387: if ((len = 3 + strlen(tp->f_fn)) + lpos > 72) {
388: lpos = 8;
389: fprintf(fp, "\\\n\t");
390: }
391: fprintf(fp, "../%s ", tp->f_fn);
392: lpos += len + 1;
393: }
394: if (lpos != 8)
395: putc('\n', fp);
396: }
397:
398: char *
399: tail(fn)
400: char *fn;
401: {
402: register char *cp;
403:
404: cp = rindex(fn, '/');
405: if (cp == 0)
406: return (fn);
407: return (cp+1);
408: }
409:
410: /*
411: * Create the makerules for each file
412: * which is part of the system.
413: * Devices are processed with the special c2 option -i
414: * which avoids any problem areas with i/o addressing
415: * (e.g. for the VAX); assembler files are processed by as.
416: */
417: do_rules(f)
418: FILE *f;
419: {
420: register char *cp, *np, och, *tp;
421: register struct file_list *ftp;
422: char *extras;
423:
424: for (ftp = ftab; ftp != 0; ftp = ftp->f_next) {
425: if (ftp->f_type == INVISIBLE)
426: continue;
427: cp = (np = ftp->f_fn) + strlen(ftp->f_fn) - 1;
428: och = *cp;
429: *cp = '\0';
430: fprintf(f, "%so: ../%s%c\n", tail(np), np, och);
431: tp = tail(np);
432: if (och == 's') {
433: fprintf(f, "\t${AS} -o %so ../%ss\n\n", tp, np);
434: continue;
435: }
436: if (ftp->f_flags & CONFIGDEP)
437: extras = "${PARAM} ";
438: else
439: extras = "";
440: switch (ftp->f_type) {
441:
442: case NORMAL:
443: switch (machine) {
444:
445: case MACHINE_VAX:
446: fprintf(f, "\t${CC} -I. -c -S ${COPTS} %s../%sc\n",
447: extras, np);
448: fprintf(f, "\t${C2} %ss | sed -f ../%s/asm.sed |",
449: tp, machinename);
450: fprintf(f, " ${AS} -o %so\n", tp);
451: fprintf(f, "\trm -f %ss\n\n", tp);
452: break;
453:
454: case MACHINE_SUN:
455: fprintf(f, "\t${CC} -I. -c -O ${COPTS} %s../%sc\n\n",
456: extras, np);
457: break;
458: }
459: break;
460:
461: case DRIVER:
462: switch (machine) {
463:
464: case MACHINE_VAX:
465: fprintf(f, "\t${CC} -I. -c -S ${COPTS} %s../%sc\n",
466: extras, np);
467: fprintf(f,"\t${C2} -i %ss | sed -f ../%s/asm.sed |",
468: tp, machinename);
469: fprintf(f, " ${AS} -o %so\n", tp);
470: fprintf(f, "\trm -f %ss\n\n", tp);
471: break;
472:
473: case MACHINE_SUN:
474: fprintf(f, "\t${CC} -I. -c -O ${COPTS} %s../%sc\n\n",
475: extras, np);
476: }
477: break;
478:
479: case PROFILING:
480: if (!profiling)
481: continue;
482: if (COPTS == 0) {
483: fprintf(stderr,
484: "config: COPTS undefined in generic makefile");
485: COPTS = "";
486: }
487: switch (machine) {
488:
489: case MACHINE_VAX:
490: fprintf(f, "\t${CC} -I. -c -S %s %s../%sc\n",
491: COPTS, extras, np);
492: fprintf(f, "\tex - %ss < ${GPROF.EX}\n", tp);
493: fprintf(f,
494: "\tsed -f ../vax/asm.sed %ss | ${AS} -o %so\n",
495: tp, tp);
496: fprintf(f, "\trm -f %ss\n\n", tp);
497: break;
498:
499: case MACHINE_SUN:
500: fprintf(stderr,
501: "config: don't know how to profile kernel on sun\n");
502: break;
503: }
504: break;
505:
506: default:
507: printf("Don't know rules for %s\n", np);
508: break;
509: }
510: *cp = och;
511: }
512: }
513:
514: /*
515: * Create the load strings
516: */
517: do_load(f)
518: register FILE *f;
519: {
520: register struct file_list *fl;
521: int first = 1;
522: struct file_list *do_systemspec();
523:
524: fl = conf_list;
525: while (fl) {
526: if (fl->f_type != SYSTEMSPEC) {
527: fl = fl->f_next;
528: continue;
529: }
530: fl = do_systemspec(f, fl, first);
531: if (first)
532: first = 0;
533: }
534: fprintf(f, "all:");
535: for (fl = conf_list; fl != 0; fl = fl->f_next)
536: if (fl->f_type == SYSTEMSPEC)
537: fprintf(f, " %s", fl->f_needs);
538: fprintf(f, "\n");
539: }
540:
541: struct file_list *
542: do_systemspec(f, fl, first)
543: FILE *f;
544: register struct file_list *fl;
545: int first;
546: {
547:
548: fprintf(f, "%s: makefile locore.o ${OBJS} param.o", fl->f_needs);
549: fprintf(f, " ioconf.o swap%s.o\n", fl->f_fn);
550: fprintf(f, "\t@echo loading %s\n\t@rm -f %s\n",
551: fl->f_needs, fl->f_needs);
552: if (first) {
553: fprintf(f, "\t@sh ../conf/newvers.sh\n");
554: fprintf(f, "\t@${CC} $(CFLAGS) -c vers.c\n");
555: }
556: switch (machine) {
557:
558: case MACHINE_VAX:
559: fprintf(f, "\t@${LD} -n -o %s -e start -x -T 80000000 ",
560: fl->f_needs);
561: break;
562:
563: case MACHINE_SUN:
564: fprintf(f, "\t@${LD} -o %s -e start -x -T 4000 ",
565: fl->f_needs);
566: break;
567: }
568: fprintf(f, "locore.o ${OBJS} vers.o ioconf.o param.o ");
569: fprintf(f, "swap%s.o\n", fl->f_fn);
570: fprintf(f, "\t@echo rearranging symbols\n");
571: fprintf(f, "\t@-symorder ../%s/symbols.sort %s\n",
572: machinename, fl->f_needs);
573: fprintf(f, "\t@size %s\n", fl->f_needs);
574: fprintf(f, "\t@chmod 755 %s\n\n", fl->f_needs);
575: do_swapspec(f, fl->f_fn);
576: for (fl = fl->f_next; fl->f_type == SWAPSPEC; fl = fl->f_next)
577: ;
578: return (fl);
579: }
580:
581: do_swapspec(f, name)
582: FILE *f;
583: register char *name;
584: {
585:
586: if (!eq(name, "generic")) {
587: fprintf(f, "swap%s.o: swap%s.c\n", name, name);
588: fprintf(f, "\t${CC} -I. -c -O ${COPTS} swap%s.c\n\n", name);
589: return;
590: }
591: fprintf(f, "swapgeneric.o: ../%s/swapgeneric.c\n", machinename);
592: switch (machine) {
593:
594: case MACHINE_VAX:
595: fprintf(f, "\t${CC} -I. -c -S ${COPTS} ");
596: fprintf(f, "../%s/swapgeneric.c\n", machinename);
597: fprintf(f, "\t${C2} swapgeneric.s | sed -f ../%s/asm.sed",
598: machinename);
599: fprintf(f, " | ${AS} -o swapgeneric.o\n");
600: fprintf(f, "\trm -f swapgeneric.s\n\n");
601: break;
602:
603: case MACHINE_SUN:
604: fprintf(f, "\t${CC} -I. -c -O ${COPTS} ");
605: fprintf(f, "../%s/swapgeneric.c\n\n", machinename);
606: break;
607: }
608: }
609:
610: char *
611: raise(str)
612: register char *str;
613: {
614: register char *cp = str;
615:
616: while (*str) {
617: if (islower(*str))
618: *str = toupper(*str);
619: str++;
620: }
621: return (cp);
622: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.