Annotation of researchv10no/cmd/make/main.c, revision 1.1.1.1

1.1       root        1: static char *sccsid = "@(#)main.c      8th Edition (Bell Labs) 85/10/28";
                      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'  use environment macros after rather than before makefiles
                     17:        'o'  use old suffix rules instead of % patterns
                     18:        'Pn' set process limit to n
                     19:        'z'  always use shell, never issue commands directly
                     20: */
                     21: 
                     22: nameblkp mainname      = NULL;
                     23: nameblkp firstname     = NULL;
                     24: lineblkp sufflist      = NULL;
                     25: struct varblock *firstvar      = NULL;
                     26: struct pattern *firstpat       = NULL;
                     27: struct dirhd *firstod          = NULL;
                     28: wildp firstwild                        = NULL;
                     29: wildp lastwild                 = NULL;
                     30: nameblkp *hashtab;
                     31: int nhashed;
                     32: int hashsize;
                     33: int hashthresh;
                     34: 
                     35: int proclimit  = PROCLIMIT;
                     36: int nproc      = 0;
                     37: int proclive   = 0;
                     38: struct process procstack[MAXPROC];
                     39: 
                     40: #include <signal.h>
                     41: int sigivalue  = 0;
                     42: int sigqvalue  = 0;
                     43: 
                     44: int dbgflag    = NO;
                     45: int prtrflag   = NO;
                     46: int silflag    = NO;
                     47: int noexflag   = NO;
                     48: int keepgoing  = NO;
                     49: int noruleflag = NO;
                     50: int touchflag  = NO;
                     51: int questflag  = NO;
                     52: int oldflag    = NO;
                     53: int ndocoms    = NO;
                     54: int ignerr     = NO;    /* default is to stop on error */
                     55: int forceshell = NO;
                     56: int okdel      = YES;
                     57: int envlast    = NO;
                     58: int inarglist  = NO;
                     59: char **envpp   = NULL;
                     60: 
                     61: extern char *dfltmacro[];
                     62: extern char *dfltpat[];
                     63: extern char *dfltsuff[];
                     64: extern char **environ;
                     65: char **linesptr;
                     66: 
                     67: #ifdef pwb
                     68: char *prompt   = ">";  /* other systems -- pick what you want */
                     69: #else
                     70: char *prompt   = "";   /* other systems -- pick what you want */
                     71: #endif
                     72: int nopdir     = 0;
                     73: char funny[128];
                     74: 
                     75: main(argc,argv,envp)
                     76: int argc;
                     77: char *argv[];
                     78: char *envp[];
                     79: {
                     80: register nameblkp p;
                     81: int i, j;
                     82: int descset, nfargs;
                     83: int nowait = NO;
                     84: TIMETYPE tjunk;
                     85: char c, *s, *mkflagp;
                     86: static char makeflags[30] = "-";
                     87: static char onechar[2] = "X";
                     88: 
                     89: #ifdef unix
                     90:        int intrupt();
                     91: #endif
                     92: 
                     93: #ifdef METERFILE
                     94:        meter(METERFILE);
                     95: #endif
                     96: 
                     97: descset = 0;
                     98: mkflagp = makeflags+1;
                     99: 
                    100: funny['\0'] = (META | TERMINAL);
                    101: for(s = "=|^();&<>*?[]:$`'\"\\\n" ; *s ; ++s)
                    102:        funny[*s] |= META;
                    103: for(s = "\n\t :;&>|" ; *s ; ++s)
                    104:        funny[*s] |= TERMINAL;
                    105: 
                    106: 
                    107: newhash(HASHSIZE);
                    108: 
                    109: inarglist = YES;
                    110: for(i=1; i<argc; ++i)
                    111:        if(argv[i]!=0 && argv[i][0]!='-' && eqsign(argv[i]))
                    112:                argv[i] = 0;
                    113: 
                    114: setvar("$", "$", NO);
                    115: inarglist = NO;
                    116: 
                    117: for(i=1; i<argc; ++i)
                    118:     if(argv[i]!=0 && argv[i][0]=='-')
                    119:        {
                    120:        for(j=1 ; (c=argv[i][j])!='\0' ; ++j)  switch(c)
                    121:                {
                    122:                case 'd':
                    123:                        ++dbgflag;
                    124:                        *mkflagp++ = 'd';
                    125:                        break;
                    126: 
                    127:                case 'p':
                    128:                        prtrflag = YES;
                    129:                        break;
                    130: 
                    131:                case 's':
                    132:                        silflag = YES;
                    133:                        *mkflagp++ = 's';
                    134:                        break;
                    135: 
                    136:                case 'i':
                    137:                        ignerr = YES;
                    138:                        *mkflagp++ = 'i';
                    139:                        break;
                    140: 
                    141:                case 'S':
                    142:                        keepgoing = NO;
                    143:                        *mkflagp++ = 'S';
                    144:                        break;
                    145: 
                    146:                case 'k':
                    147:                        keepgoing = YES;
                    148:                        *mkflagp++ = 'k';
                    149:                        break;
                    150: 
                    151:                case 'n':
                    152:                        noexflag = YES;
                    153:                        *mkflagp++ = 'n';
                    154:                        break;
                    155: 
                    156:                case 'r':
                    157:                        noruleflag = YES;
                    158:                        break;
                    159: 
                    160:                case 't':
                    161:                        touchflag = YES;
                    162:                        *mkflagp++ = 't';
                    163:                        break;
                    164: 
                    165:                case 'q':
                    166:                        questflag = YES;
                    167:                        *mkflagp++ = 'q';
                    168:                        break;
                    169: 
                    170:                case 'e':
                    171:                        envlast = YES;
                    172:                        *mkflagp++ = 'e';
                    173:                        break;
                    174: 
                    175:                case 'o':
                    176:                        oldflag = YES;
                    177:                        *mkflagp++ = 'o';
                    178:                        break;
                    179:        
                    180:                case 'z':
                    181:                        forceshell = YES;
                    182:                        *mkflagp++ = 'z';
                    183:                        break;
                    184: 
                    185:                case 'P':
                    186:                        if(isdigit(argv[i][j+1]))
                    187:                                {
                    188:                                proclimit = argv[i][++j] - '0';
                    189:                                if(proclimit < 1)
                    190:                                        proclimit = 1;
                    191:                                }
                    192:                        else
                    193:                                fatal("illegal proclimit parameter");
                    194:                        *mkflagp++ = 'P';
                    195:                        *mkflagp++ = argv[i][j];
                    196:                        break;
                    197: 
                    198:                case 'f':
                    199:                        if(i >= argc-1)
                    200:                          fatal("No description argument after -f flag");
                    201:                        if( ! rddescf(argv[i+1]) )
                    202:                                fatal1("Cannot open %s", argv[i+1]);
                    203:                        argv[i+1] = 0;
                    204:                        ++descset;
                    205:                        break;
                    206: 
                    207:                default:
                    208:                        onechar[0] = c; /* to make lint happy */
                    209:                        fatal1("Unknown flag argument %s", onechar);
                    210:                }
                    211: 
                    212:        argv[i] = NULL;
                    213:        }
                    214: 
                    215: if(mkflagp > makeflags+1)
                    216:        setvar("MAKEFLAGS", makeflags, NO);
                    217: 
                    218: if( !descset )
                    219: if(    !rddescf("makefile") &&
                    220:        !rddescf("Makefile") &&
                    221:        (exists(s = "s.makefile") || exists(s = "s.Makefile")) )
                    222:                {
                    223:                char junk[20];
                    224:                concat("get ", s, junk);
                    225:                (void) dosys(junk, NO, NO, junk);
                    226:                rddescf(s+2);
                    227:                unlink(s+2);
                    228:                }
                    229: 
                    230: 
                    231: if(envlast)
                    232:        loadenv();
                    233: if(!noruleflag && !oldflag)
                    234:        rdarray(dfltpat);
                    235: 
                    236: if(prtrflag) printdesc(NO);
                    237: 
                    238: if( srchname(".IGNORE") )
                    239:        ignerr = YES;
                    240: if( srchname(".SILENT") )
                    241:        silflag = YES;
                    242: if( srchname(".OLDFLAG") )
                    243:        oldflag = YES;
                    244: if( p=srchname(".SUFFIXES") )
                    245:        sufflist = p->linep;
                    246: if( !sufflist && !firstwild)
                    247:        fprintf(stderr,"No suffix or %% pattern list.\n");
                    248: /*
                    249: if(sufflist && !oldflag)
                    250:        fprintf(stderr, "Suffix lists are old-fashioned. Use %% patterns\n);
                    251: */
                    252: 
                    253: #ifdef unix
                    254:        sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
                    255:        sigqvalue = (int) signal(SIGQUIT, SIG_IGN) & 01;
                    256:        enbint(intrupt);
                    257: #endif
                    258: 
                    259: nfargs = 0;
                    260: 
                    261: for(i=1; i<argc; ++i)
                    262:        if(s = argv[i])
                    263:                {
                    264:                if((p=srchname(s)) == NULL)
                    265:                        p = makename(s);
                    266:                ++nfargs;
                    267:                if(i+1<argc && equal(argv[i+1], "&") )
                    268:                        {
                    269:                        ++i;
                    270:                        nowait = YES;
                    271:                        }
                    272:                else
                    273:                        nowait = NO;
                    274:                doname(p, 0, &tjunk, nowait);
                    275:                if(dbgflag) printdesc(YES);
                    276:                }
                    277: 
                    278: /*
                    279: If no file arguments have been encountered, make the first
                    280: name encountered that doesn't start with a dot
                    281: */
                    282: 
                    283: if(nfargs == 0)
                    284:        if(mainname == 0)
                    285:                fatal("No arguments or description file");
                    286:        else    {
                    287:                doname(mainname, 0, &tjunk, NO);
                    288:                if(dbgflag) printdesc(YES);
                    289:                }
                    290: 
                    291: if(!nowait)
                    292:        waitstack(0);
                    293: exit(0);
                    294: }
                    295: 
                    296: 
                    297: 
                    298: #ifdef unix
                    299: intrupt()
                    300: {
                    301: struct varblock *varptr();
                    302: char *p;
                    303: TIMETYPE exists();
                    304: 
                    305: if(okdel && !noexflag && !touchflag &&
                    306:        (p = varptr("@")->varval) && exists(p)>0 && !isprecious(p) )
                    307:                {
                    308:                fprintf(stderr, "\n***  %s removed.", p);
                    309:                unlink(p);
                    310:                }
                    311: 
                    312: fprintf(stderr, "\n");
                    313: exit(2);
                    314: }
                    315: 
                    316: 
                    317: 
                    318: 
                    319: isprecious(p)
                    320: char *p;
                    321: {
                    322: register lineblkp lp;
                    323: register depblkp dp;
                    324: register nameblkp np;
                    325: 
                    326: if(np = srchname(".PRECIOUS"))
                    327:        for(lp = np->linep ; lp ; lp = lp->nxtlineblock)
                    328:                for(dp = lp->depp ; dp ; dp = dp->nxtdepblock)
                    329:                        if(equal(p, dp->depname->namep))
                    330:                                return YES;
                    331: 
                    332: return NO;
                    333: }
                    334: 
                    335: 
                    336: enbint(k)
                    337: int (*k)();
                    338: {
                    339: if(sigivalue == 0)
                    340:        signal(SIGINT,k);
                    341: if(sigqvalue == 0)
                    342:        signal(SIGQUIT,k);
                    343: }
                    344: #endif
                    345: 
                    346: rddescf(descfile)
                    347: char *descfile;
                    348: {
                    349: static int firstrd = YES;
                    350: 
                    351: /* read and parse description */
                    352: 
                    353: if(firstrd)
                    354:        {
                    355:        firstrd = NO;
                    356:        if( !noruleflag )
                    357:                {
                    358:                rdarray(dfltmacro);
                    359:                if(oldflag)
                    360:                        rdarray(dfltsuff);
                    361:                }
                    362:        if(!envlast)
                    363:                loadenv();
                    364: 
                    365: #ifdef pwb
                    366:                {
                    367:                char *nlog, s[100];
                    368:                nlog = logdir();
                    369:                if( ! parse( concat(nlog,"/makecomm",s) ) )
                    370:                        parse( concat(nlog,"/Makecomm",s) );
                    371:        
                    372:                if( !parse("makecomm") )
                    373:                        parse("Makecomm");
                    374:                }
                    375: #endif
                    376:        }
                    377: 
                    378: return  parse(descfile);
                    379: }
                    380: 
                    381: 
                    382: rdarray(s)
                    383: char **s;
                    384: {
                    385: linesptr = s;
                    386: parse(CHNULL);
                    387: }
                    388: 
                    389: 
                    390: loadenv()
                    391: {
                    392: for(envpp = environ ; *envpp ; ++envpp)
                    393:        eqsign(*envpp);
                    394: envpp = NULL;
                    395: }
                    396: 
                    397: printdesc(prntflag)
                    398: int prntflag;
                    399: {
                    400: nameblkp p;
                    401: depblkp dp;
                    402: struct varblock *vp;
                    403: struct dirhd *od;
                    404: struct shblock *sp;
                    405: lineblkp lp;
                    406: 
                    407: #ifdef unix
                    408: if(prntflag)
                    409:        {
                    410:        printf("Open directories:\n");
                    411:        for (od = firstod; od; od = od->nxtdirhd)
                    412:                printf("\t%s\n", od->dirn);
                    413:        }
                    414: #endif
                    415: 
                    416: if(firstvar != 0) printf("Macros:\n");
                    417: for(vp = firstvar; vp ; vp = vp->nxtvarblock)
                    418:        printf("\t%s = %s\n" , vp->varname , vp->varval);
                    419: 
                    420: for(p = firstname; p; p = p->nxtnameblock)
                    421:        {
                    422:        printf("\n\n%s",p->namep);
                    423:        if(p->linep != 0) printf(":");
                    424:        if(prntflag) printf("  done=%d",p->done);
                    425:        if(p==mainname) printf("  (MAIN NAME)");
                    426:        for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
                    427:                {
                    428:                if( dp = lp->depp )
                    429:                        {
                    430:                        printf("\n depends on:");
                    431:                        for(; dp ; dp = dp->nxtdepblock)
                    432:                                if(dp->depname != 0)
                    433:                                        printf(" %s ", dp->depname->namep);
                    434:                        }
                    435:        
                    436:                if(sp = lp->shp)
                    437:                        {
                    438:                        printf("\n commands:\n");
                    439:                        for( ; sp ; sp = sp->nxtshblock)
                    440:                                printf("\t%s\n", sp->shbp);
                    441:                        }
                    442:                }
                    443:        }
                    444: printf("\n");
                    445: fflush(stdout);
                    446: }

unix.superglobalmegacorp.com

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