Annotation of 40BSD/cmd/make/main.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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