Annotation of researchv8dc/cmd/config/mkmakefile.c, revision 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.