Annotation of 43BSDTahoe/bin/make/main.c, revision 1.1

1.1     ! root        1: static char *sccsid = "@(#)main.c      4.10 (Berkeley) 87/11/15";
        !             2: # include "defs"
        !             3: /*
        !             4: command make to update programs.
        !             5: Flags: 'd'  print out debugging comments
        !             6:        'p'  print out a version of the input graph
        !             7:        's'  silent mode--don't print out commands
        !             8:        'f'  the next argument is the name of the description file;
        !             9:             "makefile" is the default
        !            10:        'i'  ignore error codes from the shell
        !            11:        'S'  stop after any command fails (normally do parallel work)
        !            12:        'n'   don't issue, just print, commands
        !            13:        't'   touch (update time of) files but don't issue command
        !            14:        'q'   don't do anything, but check if object is up to date;
        !            15:              returns exit code 0 if up to date, -1 if not
        !            16:        'e'  environment variables have precedence over makefiles
        !            17: */
        !            18: 
        !            19: struct nameblock *mainname     = NULL;
        !            20: struct nameblock *firstname    = NULL;
        !            21: struct lineblock *sufflist     = NULL;
        !            22: struct varblock *firstvar      = NULL;
        !            23: struct pattern *firstpat       = NULL;
        !            24: struct dirhdr *firstod         = NULL;
        !            25: 
        !            26: #include <signal.h>
        !            27: int sigivalue  = 0;
        !            28: int sigqvalue  = 0;
        !            29: int waitpid    = 0;
        !            30: 
        !            31: int dbgflag    = NO;
        !            32: int prtrflag   = NO;
        !            33: int silflag    = NO;
        !            34: int noexflag   = NO;
        !            35: int keepgoing  = NO;
        !            36: int noruleflag = NO;
        !            37: int touchflag  = NO;
        !            38: int questflag  = NO;
        !            39: int ndocoms    = NO;
        !            40: int ignerr     = NO;    /* default is to stop on error */
        !            41: int okdel      = YES;
        !            42: int doenvlast  = NO;
        !            43: int inarglist;
        !            44: #ifdef pwb
        !            45: char *prompt   = ">";  /* other systems -- pick what you want */
        !            46: #else
        !            47: char *prompt   = "";   /* other systems -- pick what you want */
        !            48: #endif
        !            49: int nopdir     = 0;
        !            50: char junkname[20];
        !            51: char funny[128];
        !            52: char   options[26 + 1] = { '-' };
        !            53: 
        !            54: main(argc,argv)
        !            55: int argc;
        !            56: char *argv[];
        !            57: {
        !            58: register struct nameblock *p;
        !            59: int i, j;
        !            60: int descset, nfargs;
        !            61: TIMETYPE tjunk;
        !            62: char c, *s;
        !            63: static char onechar[2] = "X";
        !            64: #ifdef unix
        !            65: int intrupt();
        !            66: #endif
        !            67: char *op = options + 1;
        !            68: 
        !            69: 
        !            70: #ifdef METERFILE
        !            71: meter(METERFILE);
        !            72: #endif
        !            73: 
        !            74: descset = 0;
        !            75: 
        !            76: funny['\0'] = (META | TERMINAL);
        !            77: for(s = "=|^();&<>*?[]:$`'\"\\\n" ; *s ; ++s)
        !            78:        funny[*s] |= META;
        !            79: for(s = "\n\t :;&>|" ; *s ; ++s)
        !            80:        funny[*s] |= TERMINAL;
        !            81: 
        !            82: 
        !            83: inarglist = 1;
        !            84: for(i=1; i<argc; ++i)
        !            85:        if(argv[i]!=0 && argv[i][0]!='-' && eqsign(argv[i]))
        !            86:                argv[i] = 0;
        !            87: 
        !            88: setvar("$","$");
        !            89: inarglist = 0;
        !            90: 
        !            91: for (i=1; i<argc; ++i)
        !            92:        if (argv[i]!=0 && argv[i][0]=='-') {
        !            93:                for (j=1 ; (c=argv[i][j])!='\0' ; ++j) {
        !            94:                        *op++ = c;
        !            95:                        switch (c) {
        !            96: 
        !            97:                        case 'd':
        !            98:                                dbgflag = YES;
        !            99:                                break;
        !           100: 
        !           101:                        case 'p':
        !           102:                                prtrflag = YES;
        !           103:                                break;
        !           104: 
        !           105:                        case 's':
        !           106:                                silflag = YES;
        !           107:                                break;
        !           108: 
        !           109:                        case 'i':
        !           110:                                ignerr = YES;
        !           111:                                break;
        !           112: 
        !           113:                        case 'S':
        !           114:                                keepgoing = NO;
        !           115:                                break;
        !           116: 
        !           117:                        case 'k':
        !           118:                                keepgoing = YES;
        !           119:                                break;
        !           120: 
        !           121:                        case 'n':
        !           122:                                noexflag = YES;
        !           123:                                break;
        !           124: 
        !           125:                        case 'r':
        !           126:                                noruleflag = YES;
        !           127:                                break;
        !           128: 
        !           129:                        case 't':
        !           130:                                touchflag = YES;
        !           131:                                break;
        !           132: 
        !           133:                        case 'q':
        !           134:                                questflag = YES;
        !           135:                                break;
        !           136: 
        !           137:                        case 'f':
        !           138:                                op--;           /* don't pass this one */
        !           139:                                if(i >= argc-1)
        !           140:                                  fatal("No description argument after -f flag");
        !           141:                                if( rddescf(argv[i+1]) )
        !           142:                                fatal1("Cannot open %s", argv[i+1]);
        !           143:                                argv[i+1] = 0;
        !           144:                                ++descset;
        !           145:                                break;
        !           146: 
        !           147:                        case 'e':
        !           148:                                doenvlast = YES;
        !           149:                                break;
        !           150: 
        !           151:                        default:
        !           152:                                onechar[0] = c; /* to make lint happy */
        !           153:                                fatal1("Unknown flag argument %s", onechar);
        !           154:                        }
        !           155:                }
        !           156:                argv[i] = 0;
        !           157:        }
        !           158: 
        !           159: *op++ = '\0';
        !           160: if (strcmp(options, "-") == 0)
        !           161:        *options = '\0';
        !           162: setvar("MFLAGS", options);             /* MFLAGS=options to make */
        !           163: 
        !           164: setvar("MACHINE", MACHINE);
        !           165: 
        !           166: if( !descset )
        !           167: #ifdef unix
        !           168:        if( rddescf("makefile") )  rddescf("Makefile");
        !           169: #endif
        !           170: #ifdef gcos
        !           171:        rddescf("makefile");
        !           172: #endif
        !           173: 
        !           174: if (doenvlast == YES)
        !           175:        readenv();
        !           176: 
        !           177: if(prtrflag) printdesc(NO);
        !           178: 
        !           179: if( srchname(".IGNORE") ) ++ignerr;
        !           180: if( srchname(".SILENT") ) silflag = 1;
        !           181: if(p=srchname(".SUFFIXES")) sufflist = p->linep;
        !           182: if( !sufflist ) fprintf(stderr,"No suffix list.\n");
        !           183: 
        !           184: #ifdef unix
        !           185: sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
        !           186: sigqvalue = (int) signal(SIGQUIT, SIG_IGN) & 01;
        !           187: enbint(intrupt);
        !           188: #endif
        !           189: 
        !           190: nfargs = 0;
        !           191: 
        !           192: for(i=1; i<argc; ++i)
        !           193:        if((s=argv[i]) != 0)
        !           194:                {
        !           195:                if((p=srchname(s)) == 0)
        !           196:                        {
        !           197:                        p = makename(s);
        !           198:                        }
        !           199:                ++nfargs;
        !           200:                doname(p, 0, &tjunk);
        !           201:                if(dbgflag) printdesc(YES);
        !           202:                }
        !           203: 
        !           204: /*
        !           205: If no file arguments have been encountered, make the first
        !           206: name encountered that doesn't start with a dot
        !           207: */
        !           208: 
        !           209: if(nfargs == 0)
        !           210:        if(mainname == 0)
        !           211:                fatal("No arguments or description file");
        !           212:        else    {
        !           213:                doname(mainname, 0, &tjunk);
        !           214:                if(dbgflag) printdesc(YES);
        !           215:                }
        !           216: 
        !           217: exit(0);
        !           218: }
        !           219: 
        !           220: #include <sys/stat.h>
        !           221: 
        !           222: #ifdef unix
        !           223: intrupt()
        !           224: {
        !           225: struct varblock *varptr();
        !           226: char *p;
        !           227: TIMETYPE exists();
        !           228: struct stat sbuf;
        !           229: 
        !           230: if(okdel && !noexflag && !touchflag &&
        !           231:        (p = varptr("@")->varval) &&
        !           232:        (stat(p, &sbuf) >= 0 && (sbuf.st_mode&S_IFMT) == S_IFREG) &&
        !           233:        !isprecious(p) )
        !           234:                {
        !           235:                fprintf(stderr, "\n***  %s removed.", p);
        !           236:                unlink(p);
        !           237:                }
        !           238: 
        !           239: if(junkname[0])
        !           240:        unlink(junkname);
        !           241: fprintf(stderr, "\n");
        !           242: exit(2);
        !           243: }
        !           244: 
        !           245: 
        !           246: 
        !           247: 
        !           248: isprecious(p)
        !           249: char *p;
        !           250: {
        !           251: register struct lineblock *lp;
        !           252: register struct depblock *dp;
        !           253: register struct nameblock *np;
        !           254: 
        !           255: if(np = srchname(".PRECIOUS"))
        !           256:        for(lp = np->linep ; lp ; lp = lp->nxtlineblock)
        !           257:                for(dp = lp->depp ; dp ; dp = dp->nxtdepblock)
        !           258:                        if(! unequal(p, dp->depname->namep))
        !           259:                                return(YES);
        !           260: 
        !           261: return(NO);
        !           262: }
        !           263: 
        !           264: 
        !           265: enbint(k)
        !           266: int (*k)();
        !           267: {
        !           268: if(sigivalue == 0)
        !           269:        signal(SIGINT,k);
        !           270: if(sigqvalue == 0)
        !           271:        signal(SIGQUIT,k);
        !           272: }
        !           273: #endif
        !           274: 
        !           275: extern char *builtin[];
        !           276: 
        !           277: char **linesptr        = builtin;
        !           278: 
        !           279: FILE * fin;
        !           280: int firstrd    = 0;
        !           281: 
        !           282: 
        !           283: rddescf(descfile)
        !           284: char *descfile;
        !           285: {
        !           286: FILE * k;
        !           287: 
        !           288: /* read and parse description */
        !           289: 
        !           290: if( !firstrd++ )
        !           291:        {
        !           292:        if( !noruleflag )
        !           293:                rdd1( (FILE *) NULL);
        !           294: 
        !           295:        if (doenvlast == NO)
        !           296:                readenv();
        !           297: 
        !           298: #ifdef pwb
        !           299:                {
        !           300:                char *nlog, s[BUFSIZ];
        !           301:                nlog = logdir();
        !           302:                if ( (k=fopen( concat(nlog,"/makecomm",s), "r")) != NULL)
        !           303:                        rdd1(k);
        !           304:                else if ( (k=fopen( concat(nlog,"/Makecomm",s), "r")) != NULL)
        !           305:                        rdd1(k);
        !           306:        
        !           307:                if ( (k=fopen("makecomm", "r")) != NULL)
        !           308:                        rdd1(k);
        !           309:                else if ( (k=fopen("Makecomm", "r")) != NULL)
        !           310:                        rdd1(k);
        !           311:                }
        !           312: #endif
        !           313: 
        !           314:        }
        !           315: if(! unequal(descfile, "-"))
        !           316:        return( rdd1(stdin) );
        !           317: 
        !           318: if( (k = fopen(descfile,"r")) != NULL)
        !           319:        return( rdd1(k) );
        !           320: 
        !           321: return(1);
        !           322: }
        !           323: 
        !           324: 
        !           325: 
        !           326: 
        !           327: rdd1(k)
        !           328: FILE * k;
        !           329: {
        !           330: extern int yylineno;
        !           331: extern char *zznextc;
        !           332: 
        !           333: fin = k;
        !           334: yylineno = 0;
        !           335: zznextc = 0;
        !           336: 
        !           337: if( yyparse() )
        !           338:        fatal("Description file error");
        !           339: 
        !           340: if(fin != NULL && fin != stdin)
        !           341:        fclose(fin);
        !           342: 
        !           343: return(0);
        !           344: }
        !           345: 
        !           346: printdesc(prntflag)
        !           347: int prntflag;
        !           348: {
        !           349: struct nameblock *p;
        !           350: struct depblock *dp;
        !           351: struct varblock *vp;
        !           352: struct dirhdr *od;
        !           353: struct shblock *sp;
        !           354: struct lineblock *lp;
        !           355: 
        !           356: #ifdef unix
        !           357: if(prntflag)
        !           358:        {
        !           359:        printf("Open directories:\n");
        !           360:        for (od = firstod; od; od = od->nxtopendir)
        !           361:                printf("\t%d: %s\n", dirfd(od->dirfc), od->dirn);
        !           362:        }
        !           363: #endif
        !           364: 
        !           365: if(firstvar != 0) printf("Macros:\n");
        !           366: for(vp = firstvar; vp ; vp = vp->nxtvarblock)
        !           367:        printf("\t%s = %s\n" , vp->varname , vp->varval);
        !           368: 
        !           369: for(p = firstname; p; p = p->nxtnameblock)
        !           370:        {
        !           371:        printf("\n\n%s",p->namep);
        !           372:        if(p->linep != 0) printf(":");
        !           373:        if(prntflag) printf("  done=%d",p->done);
        !           374:        if(p==mainname) printf("  (MAIN NAME)");
        !           375:        for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
        !           376:                {
        !           377:                if( dp = lp->depp )
        !           378:                        {
        !           379:                        printf("\n depends on:");
        !           380:                        for(; dp ; dp = dp->nxtdepblock)
        !           381:                                if(dp->depname != 0)
        !           382:                                        printf(" %s ", dp->depname->namep);
        !           383:                        }
        !           384:        
        !           385:                if(sp = lp->shp)
        !           386:                        {
        !           387:                        printf("\n commands:\n");
        !           388:                        for( ; sp!=0 ; sp = sp->nxtshblock)
        !           389:                                printf("\t%s\n", sp->shbp);
        !           390:                        }
        !           391:                }
        !           392:        }
        !           393: printf("\n");
        !           394: fflush(stdout);
        !           395: }
        !           396: 
        !           397: readenv()
        !           398: {
        !           399:        register char **ep, *p;
        !           400:        extern char **environ;
        !           401: 
        !           402:        for(ep = environ ; *ep ; ++ep) {
        !           403:                for (p = *ep; *p; p++) {
        !           404:                        if (isalnum(*p))
        !           405:                                continue;
        !           406:                        if (*p == '=') {
        !           407:                                eqsign(*ep);
        !           408:                        }
        !           409:                        break;
        !           410:                }
        !           411:        }
        !           412: }

unix.superglobalmegacorp.com

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