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

unix.superglobalmegacorp.com

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