Annotation of researchv10no/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: 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.