Annotation of 43BSDTahoe/bin/make/main.c, revision 1.1.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.