Annotation of researchv10no/cmd/config/mkmakefile.c, revision 1.1.1.1

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 = "makefile";
                     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("makefile"));
                     76:        exit(1);
                     77:     }
                     78:     ofp = fopen(LOCAL("makefile"), "w");
                     79:     if (ofp == NULL) {
                     80:        perror(LOCAL("makefile"));
                     81:        exit(1);
                     82:     }
                     83:     fprintf(ofp, "IDENT=-D%s", raise(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:        hz = 60;
                     98:     }
                     99:     if (hadtz == 0)
                    100:        printf("timezone not specified; gmt assumed\n");
                    101:     if (maxusers == 0) {
                    102:        printf("maxusers not specified; 24 assumed\n");
                    103:        maxusers = 24;
                    104:     } else if (maxusers < 8) {
                    105:        printf("minimum of 8 maxusers assumed\n");
                    106:        maxusers = 8;
                    107:     } else if (maxusers > 128) {
                    108:        printf("maxusers truncated to 128\n");
                    109:        maxusers = 128;
                    110:     }
                    111:     fprintf(ofp, "PARAM=-DHZ=%d -DTIMEZONE=%d -DDST=%d -DMAXUSERS=%d\n",
                    112:        hz, timezone, dst, maxusers);
                    113:     while(fgets(line, BUFSIZ, ifp) != NULL)
                    114:     {
                    115:        if (*line != '%')
                    116:        {
                    117:            fprintf(ofp, "%s", line);
                    118:            continue;
                    119:        }
                    120:        else if (eq(line, "%OBJS\n"))
                    121:            do_objs(ofp);
                    122:        else if (eq(line, "%CFILES\n"))
                    123:            do_cfiles(ofp);
                    124:        else if (eq(line, "%RULES\n"))
                    125:            do_rules(ofp);
                    126:        else if (eq(line, "%LOAD\n"))
                    127:            do_load(ofp);
                    128:        else
                    129:            fprintf(stderr, "Unknown %% construct in generic makefile: %s", line);
                    130:     }
                    131:     fclose(ifp);
                    132:     fclose(ofp);
                    133: }
                    134: 
                    135: /*
                    136:  * files:
                    137:  *     Read in the "files" file.
                    138:  *     Store it in the ftab linked list
                    139:  */
                    140: 
                    141: read_files()
                    142: {
                    143: 
                    144:     ftab = NULL;
                    145:     read_files_file(GLOBAL("files"), TRUE);
                    146:     read_files_file(LOCAL("files"), FALSE);
                    147: }
                    148: 
                    149: read_files_file(filename, must_exist)
                    150:     char *filename;
                    151: {
                    152:     FILE *fp;
                    153:     register struct file_list *tp;
                    154:     register struct device *dp;
                    155:     register char *wd, *this;
                    156:     int type;
                    157: 
                    158:     fp = fopen(filename, "r");
                    159:     if (fp == NULL) {
                    160:        if (must_exist) {
                    161:            perror(filename);
                    162:            exit(1);
                    163:        } else
                    164:            return;
                    165:     }
                    166:     while((wd = get_word(fp)) != WEOF)
                    167:     {
                    168:        if (wd == NULL)
                    169:            continue;
                    170:        this = ns(wd);
                    171:        /*
                    172:         * Read standard/optional
                    173:         */
                    174:        next_word(fp, wd);
                    175:        if (wd == NULL)
                    176:        {
                    177:            fprintf(stderr, "Huh, no type for %s in files.\n", this);
                    178:            exit(10);
                    179:        }
                    180:        if ((tp = fl_lookup(wd)) == NULL)
                    181:            tp = new_fent();
                    182:        else
                    183:            free(tp->f_fn);
                    184:        tp->f_fn = this;
                    185:        type = 0;
                    186:        if (eq(wd, "optional"))
                    187:        {
                    188:            next_word(fp, wd);
                    189:            if (wd == NULL)
                    190:            {
                    191:                fprintf(stderr, "Needed a dev for optional(%s)\n", this);
                    192:                exit(11);
                    193:            }
                    194:            tp->f_needs = ns(wd);
                    195:            for (dp = dtab ; dp != NULL; dp = dp->d_next)
                    196:            {
                    197:                if (eq(dp->d_name, wd))
                    198:                    break;
                    199:            }
                    200:            if (dp == NULL)
                    201:                type = INVISIBLE;
                    202:        }
                    203:        next_word(fp, wd);
                    204:        if (type == 0 && wd != NULL)
                    205:            type = DEVICE;
                    206:        else if (type == 0)
                    207:            type = NORMAL;
                    208:        tp->f_type = type;
                    209:     }
                    210:     fclose(fp);
                    211: }
                    212: 
                    213: /*
                    214:  * do_objs
                    215:  *     Spew forth the OBJS definition
                    216:  */
                    217: 
                    218: do_objs(fp)
                    219: FILE *fp;
                    220: {
                    221:     register struct file_list *tp;
                    222:     register int lpos, len;
                    223:     register char *cp, och, *sp;
                    224:     char *tail();
                    225: 
                    226:     fprintf(fp, "OBJS=");
                    227:     lpos = 6;
                    228:     for (tp = ftab; tp != NULL; tp = tp->f_next)
                    229:     {
                    230:        if (tp->f_type == INVISIBLE)
                    231:            continue;
                    232:        sp = tail(tp->f_fn);
                    233:        cp = sp + (len = strlen(sp)) - 1;
                    234:        och = *cp;
                    235:        *cp = 'o';
                    236:        if (len + lpos > 72)
                    237:        {
                    238:            lpos = 8;
                    239:            fprintf(fp, "\\\n\t");
                    240:        }
                    241:        fprintf(fp, "%s ", sp);
                    242:        lpos += len + 1;
                    243:        *cp = och;
                    244:     }
                    245:     if (lpos != 8)
                    246:        putc('\n', fp);
                    247: }
                    248: 
                    249: /*
                    250:  * do_cfiles
                    251:  *     Spew forth the CFILES definition
                    252:  */
                    253: 
                    254: do_cfiles(fp)
                    255: FILE *fp;
                    256: {
                    257:     register struct file_list *tp;
                    258:     register int lpos, len;
                    259: 
                    260:     fprintf(fp, "CFILES=");
                    261:     lpos = 8;
                    262:     for (tp = ftab; tp != NULL; tp = tp->f_next)
                    263:     {
                    264:        if (tp->f_type == INVISIBLE)
                    265:            continue;
                    266:        if (tp->f_fn[strlen(tp->f_fn)-1] != 'c')
                    267:            continue;
                    268:        if ((len = 3 + strlen(tp->f_fn)) + lpos > 72)
                    269:        {
                    270:            lpos = 8;
                    271:            fprintf(fp, "\\\n\t");
                    272:        }
                    273:        fprintf(fp, "../%s ", tp->f_fn);
                    274:        lpos += len + 1;
                    275:     }
                    276:     if (lpos != 8)
                    277:        putc('\n', fp);
                    278: }
                    279: 
                    280: /*
                    281:  * tail:
                    282:  *     Return tail end of a filename
                    283:  */
                    284: 
                    285: char *tail(fn)
                    286: char *fn;
                    287: {
                    288:     register char *cp;
                    289:     char *strrchr();
                    290: 
                    291:     cp = strrchr(fn, '/');
                    292:     return cp+1;
                    293: }
                    294: 
                    295: /*
                    296:  * do_rules:
                    297:  *     Spit out the rules for making each file
                    298:  */
                    299: 
                    300: do_rules(f)
                    301: FILE *f;
                    302: {
                    303:     register char *cp, *np, och, *tp;
                    304:     register struct file_list *ftp;
                    305: 
                    306:     for (ftp = ftab; ftp != NULL; ftp = ftp->f_next)
                    307:     {
                    308:        if (ftp->f_type == INVISIBLE)
                    309:            continue;
                    310:        cp = (np = ftp->f_fn) + strlen(ftp->f_fn) - 1;
                    311:        och = *cp;
                    312:        *cp = '\0';
                    313:        fprintf(f, "%so: ../%s%c\n", tail(np), np, och);
                    314:        tp = tail(np);
                    315:        if (och == 's')
                    316:            fprintf(f, "\t${AS} -o %so ../%ss\n\n", tp, np);
                    317:        else if (ftp->f_type == NORMAL)
                    318:        {
                    319:            fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../%sc\n", np);
                    320:            fprintf(f, "\t${C2} %ss | sed -f ../sys/asm.sed | ${AS} -o %so\n",
                    321:                    tp, tp);
                    322:            fprintf(f, "\trm -f %ss\n\n", tp);
                    323:        }
                    324:        else if (ftp->f_type == DEVICE)
                    325:        {
                    326:            fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../%sc\n", np);
                    327:            fprintf(f,"\t${C2} -i %ss | sed -f ../sys/asm.sed | ${AS} -o %so\n",
                    328:                    tp, tp);
                    329:            fprintf(f, "\trm -f %ss\n\n", tp);
                    330:        }
                    331:        else
                    332:            fprintf(stderr, "Don't know rules for %s", np);
                    333:        *cp = och;
                    334:     }
                    335: }
                    336: 
                    337: /*
                    338:  * Create the load strings
                    339:  */
                    340: 
                    341: do_load(f)
                    342: register FILE *f;
                    343: {
                    344:     register struct file_list *fl;
                    345:     register bool first = TRUE;
                    346: 
                    347:     for (fl = conf_list; fl != NULL; fl = fl->f_next)
                    348:     {
                    349:        fprintf(f, "%s: makefile locore.o ${OBJS} ${EMULO} ioconf.o conf.o param.o swap%s.o\n",
                    350:                fl->f_needs, fl->f_fn);
                    351:        fprintf(f, "\t@echo loading %s\n\t@rm -f %s\n",
                    352:                fl->f_needs, fl->f_needs);
                    353:        if (first)
                    354:        {
                    355:                first = FALSE;
                    356:                fprintf(f, "\t@sh ../conf/newvers.sh\n");
                    357:                fprintf(f, "\t@cc $(CFLAGS) -c vers.c\n");
                    358:        }
                    359:        fprintf(f,
                    360:            "\t@ld -n -o %s -e start -x -T 80000000 locore.o ${OBJS} ${EMULO} vers.o ioconf.o conf.o param.o swap%s.o\n",
                    361:            fl->f_needs, fl->f_fn);
                    362:        fprintf(f, "\t@size %s\n", fl->f_needs);
                    363:        fprintf(f, "\t@chmod 755 %s\n\n", fl->f_needs);
                    364:     }
                    365:     for (fl = conf_list; fl != NULL; fl = fl->f_next)
                    366:     {
                    367:        fprintf(f, "swap%s.o: ../dev/swap%s.c\n", fl->f_fn, fl->f_fn);
                    368:        fprintf(f, "\t${CC} -I. -c -S ${COPTS} ../dev/swap%s.c\n", fl->f_fn);
                    369:        fprintf(f,
                    370:            "\t${C2} swap%s.s | sed -f ../sys/asm.sed | ${AS} -o swap%s.o\n",
                    371:            fl->f_fn, fl->f_fn);
                    372:        fprintf(f, "\trm -f swap%s.s\n\n", fl->f_fn);
                    373:     }
                    374:     fprintf(f, "all:");
                    375:     for (fl = conf_list; fl != NULL; fl = fl->f_next)
                    376:        fprintf(f, " %s", fl->f_needs);
                    377:     putc('\n', f);
                    378: }
                    379: 
                    380: char *
                    381: raise(str)
                    382: register char *str;
                    383: {
                    384:     register char *cp = str;
                    385: 
                    386:     while(*str)
                    387:     {
                    388:        if (islower(*str))
                    389:            *str = toupper(*str);
                    390:        str++;
                    391:     }
                    392:     return cp;
                    393: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.