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

1.1       root        1: /*      @(#)/usr/src/cmd/make/main.c    3.4     */
                      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: */
                     17: 
                     18: char makefile[] = "makefile";
                     19: char Nullstr[] = "";
                     20: char Makefile[] =       "Makefile";
                     21: char RELEASE[] = "RELEASE";
                     22: CHARSTAR badptr = (CHARSTAR)-1;
                     23: 
                     24: NAMEBLOCK mainname ;
                     25: NAMEBLOCK firstname;
                     26: LINEBLOCK sufflist;
                     27: VARBLOCK firstvar;
                     28: PATTERN firstpat ;
                     29: OPENDIR firstod;
                     30: 
                     31: 
                     32: #include <signal.h>
                     33: int sigivalue=0;
                     34: int sigqvalue=0;
                     35: int waitpid=0;
                     36: 
                     37: int Mflags=MH_DEP;
                     38: int ndocoms=0;
                     39: int okdel=YES;
                     40: 
                     41: CHARSTAR prompt="\t";   /* other systems -- pick what you want */
                     42: char junkname[20];
                     43: char funny[128];
                     44: 
                     45: 
                     46: 
                     47: 
                     48: char Makeflags[]="MAKEFLAGS";
                     49: 
                     50: main(argc,argv)
                     51: int argc;
                     52: CHARSTAR argv[];
                     53: {
                     54:         register NAMEBLOCK p;
                     55:         int i, j;
                     56:         int descset, nfargs;
                     57:         TIMETYPE tjunk;
                     58:         char c;
                     59:         CHARSTAR s, *e;
                     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:         for(s = "#|=^();&<>*?[]:$`'\"\\\n" ; *s ; ++s)
                     74:                 funny[*s] |= META;
                     75:         for(s = "\n\t :=;{}&>|" ; *s ; ++s)
                     76:                 funny[*s] |= TERMINAL;
                     77:         funny['\0'] |= TERMINAL;
                     78: 
                     79:         TURNON(INTRULE);                /* Default internal rules, turned on */
                     80: 
                     81: /*
                     82:  *      Set command line flags
                     83:  */
                     84: 
                     85:         getmflgs();                             /* Init $(MAKEFLAGS) variable */
                     86:         setflags(argc, argv);
                     87: 
                     88:         setvar("$","$");
                     89: 
                     90: 
                     91: /*
                     92:  *      Read command line "=" type args and make them readonly.
                     93:  */
                     94:         TURNON(INARGS|EXPORT);
                     95:         if(IS_ON(DBUG))printf("Reading \"=\" type args on command line.\n");
                     96:         for(i=1; i<argc; ++i)
                     97:                 if(argv[i]!=0 && argv[i][0]!=MINUS && (eqsign(argv[i]) == YES) )
                     98:                         argv[i] = 0;
                     99:         TURNOFF(INARGS|EXPORT);
                    100: 
                    101: /*
                    102:  *      Read internal definitions and rules.
                    103:  */
                    104: 
                    105:         if( IS_ON(INTRULE) )
                    106:         {
                    107:                 if(IS_ON(DBUG))printf("Reading internal rules.\n");
                    108:                 rdd1(NULL);
                    109:         }
                    110: 
                    111: /*
                    112:  *      Done with internal rules, now.
                    113:  */
                    114:         TURNOFF(INTRULE);
                    115: 
                    116: /*
                    117:  *      Read environment args.  Let file args which follow override.
                    118:  *      unless 'e' in MAKEFLAGS variable is set.
                    119:  */
                    120:         if( any( (varptr(Makeflags))->varval, 'e') )
                    121:                 TURNON(ENVOVER);
                    122:         if(IS_ON(DBUG))printf("Reading environment.\n");
                    123:         TURNON(EXPORT);
                    124:         readenv();
                    125:         TURNOFF(EXPORT|ENVOVER);
                    126: 
                    127: /*
                    128:  *      Read command line "-f" arguments.
                    129:  */
                    130: 
                    131:         rdmakecomm();
                    132: 
                    133:         for(i = 1; i < argc; i++)
                    134:                 if( argv[i] && argv[i][0] == MINUS && argv[i][1] == 'f' && argv[i][2] == CNULL)
                    135:                 {
                    136:                         argv[i] = 0;
                    137:                         if(i >= argc-1)
                    138:                                 fatal("No description argument after -f flag");
                    139:                         if( rddescf(argv[++i], YES) )
                    140:                                 fatal1("Cannot open %s", argv[i]);
                    141:                         argv[i] = 0;
                    142:                         ++descset;
                    143:                 }
                    144: 
                    145: 
                    146: /*
                    147:  *      If no command line "-f" args then look for some form of "makefile"
                    148:  */
                    149:         if( !descset )
                    150: #ifdef unix
                    151:                 if( rddescf(makefile, NO))
                    152:                 if( rddescf(Makefile, NO))
                    153:                 if( rddescf(makefile, YES))
                    154:                         rddescf(Makefile, YES);
                    155: 
                    156: #endif
                    157: #ifdef gcos
                    158:                 rddescf(makefile, NO);
                    159: #endif
                    160: 
                    161: 
                    162:         if(IS_ON(PRTR)) printdesc(NO);
                    163: 
                    164:         if( srchname(".IGNORE") ) TURNON(IGNERR);
                    165:         if( srchname(".SILENT") ) TURNON(SIL);
                    166:         if(p=srchname(".SUFFIXES")) sufflist = p->linep;
                    167:         if( !sufflist ) fprintf(stderr,"No suffix list.\n");
                    168: 
                    169: #ifdef unix
                    170:         sigivalue = (int)signal(SIGINT,1) & 01;
                    171:         sigqvalue = (int)signal(SIGQUIT,1) & 01;
                    172:         enbint(intrupt);
                    173: #endif
                    174: 
                    175:         nfargs = 0;
                    176: 
                    177:         for(i=1; i<argc; ++i)
                    178:                 if((s=argv[i]) != 0)
                    179:                 {
                    180:                         if((p=srchname(s)) == 0)
                    181:                         {
                    182:                                 p = makename(s);
                    183:                         }
                    184:                         ++nfargs;
                    185:                         doname(p, 0, &tjunk);
                    186:                         if(IS_ON(DBUG)) printdesc(YES);
                    187:                 }
                    188: 
                    189: /*
                    190:         If no file arguments have been encountered, make the first
                    191:         name encountered that doesn't start with a dot
                    192:         */
                    193: 
                    194:         if(nfargs == 0)
                    195:                 if(mainname == 0)
                    196:                         fatal("No arguments or description file");
                    197:                 else
                    198:                 {
                    199:                         doname(mainname, 0, &tjunk);
                    200:                         if(IS_ON(DBUG)) printdesc(YES);
                    201:                 }
                    202: 
                    203:         exit(0);
                    204: }
                    205: 
                    206: 
                    207: 
                    208: #ifdef unix
                    209: intrupt()
                    210: {
                    211:         CHARSTAR p;
                    212: 
                    213:         if(okdel && IS_OFF(NOEX) && IS_OFF(TOUCH) &&
                    214:                 (p = varptr("@")->varval) && exists(srchname(p))>0 &&
                    215:                 !isprecious(p) )
                    216:         {
                    217:                 if(isdir(p))
                    218:                         fprintf(stderr, "\n*** %s NOT REMOVED.",p);
                    219:                 else if(unlink(p) == 0)
                    220:                         fprintf(stderr, "\n***  %s removed.", p);
                    221:         }
                    222: 
                    223:         if(junkname[0])
                    224:                 unlink(junkname);
                    225:         fprintf(stderr, "\n");
                    226:         exit(2);
                    227: }
                    228: 
                    229: 
                    230: 
                    231: 
                    232: isprecious(p)
                    233: CHARSTAR p;
                    234: {
                    235:         register NAMEBLOCK np;
                    236:         register LINEBLOCK lp;
                    237:         register DEPBLOCK dp;
                    238: 
                    239:         if(np = srchname(".PRECIOUS"))
                    240:             for(lp = np->linep ; lp ; lp = lp->nextline)
                    241:                 for(dp = lp->depp ; dp; dp = dp->nextdep)
                    242:                         if(equal(p, dp->depname->namep))
                    243:                                 return(YES);
                    244: 
                    245:         return(NO);
                    246: }
                    247: 
                    248: 
                    249: enbint(k)
                    250: int (*k)();
                    251: {
                    252:         if(sigivalue == 0)
                    253:                 signal(SIGINT,k);
                    254:         if(sigqvalue == 0)
                    255:                 signal(SIGQUIT,k);
                    256: }
                    257: #endif
                    258: 
                    259: extern CHARSTAR builtin[];
                    260: 
                    261: CHARSTAR *linesptr=builtin;
                    262: 
                    263: FILE * fin;
                    264: int firstrd=0;
                    265: 
                    266: rdmakecomm()
                    267: {
                    268: /******GONE FOR EVER
                    269: #ifdef PWB
                    270:         register char *nlog;
                    271:         char s[128];
                    272:         CHARSTAR concat(), getenv();
                    273: 
                    274:         if(rddescf( concat((nlog=getenv("HOME")),"/makecomm",s), NO))
                    275:                 rddescf( concat(nlog,"/Makecomm",s), NO);
                    276: 
                    277:         if(rddescf("makecomm", NO))
                    278:                 rddescf("Makecomm", NO);
                    279: #endif
                    280: ************/
                    281: }
                    282: 
                    283: extern int yylineno;
                    284: extern CHARSTAR zznextc;
                    285: rddescf(descfile, flg)
                    286: CHARSTAR descfile;
                    287: int flg;                        /* if YES try s.descfile */
                    288: {
                    289:         FILE * k;
                    290: 
                    291: /* read and parse description */
                    292: 
                    293:         if(equal(descfile, "-"))
                    294:                 return( rdd1(stdin) );
                    295: 
                    296: retry:
                    297:         if( (k = fopen(descfile,"r")) != NULL)
                    298:         {
                    299:                 if(IS_ON(DBUG))printf("Reading %s\n", descfile);
                    300:                 return( rdd1(k) );
                    301:         }
                    302: 
                    303:         if(flg == NO)
                    304:                 return(1);
                    305:         if(get(descfile, CD, varptr(RELEASE)->varval) == NO)
                    306:                 return(1);
                    307:         flg = NO;
                    308:         goto retry;
                    309: 
                    310: }
                    311: 
                    312: 
                    313: 
                    314: 
                    315: rdd1(k)
                    316: FILE * k;
                    317: {
                    318:         fin = k;
                    319:         yylineno = 0;
                    320:         zznextc = 0;
                    321: 
                    322:         if( yyparse() )
                    323:                 fatal("Description file error");
                    324: 
                    325:         if(fin != NULL)
                    326:                 fclose(fin);
                    327: 
                    328:         return(0);
                    329: }
                    330: 
                    331: printdesc(prntflag)
                    332: int prntflag;
                    333: {
                    334:         NAMEBLOCK p;
                    335:         DEPBLOCK dp;
                    336:         VARBLOCK vp;
                    337:         OPENDIR od;
                    338:         SHBLOCK sp;
                    339:         LINEBLOCK lp;
                    340: 
                    341: #ifdef unix
                    342:         if(prntflag)
                    343:         {
                    344:                 fprintf(stderr,"Open directories:\n");
                    345:                 for(od=firstod; od!=0; od = od->nextopendir)
                    346:                         fprintf(stderr,"\t%d: %s\n", fileno(od->dirfc), od->dirn);
                    347:         }
                    348: #endif
                    349: 
                    350:         if(firstvar != 0) fprintf(stderr,"Macros:\n");
                    351:         for(vp=firstvar; vp!=0; vp=vp->nextvar)
                    352:                 if(vp->v_aflg == NO)
                    353:                         printf("\t%s = %s\n" , vp->varname , vp->varval);
                    354:                 else
                    355:                 {
                    356:                         CHAIN pch;
                    357: 
                    358:                         fprintf(stderr,"Lookup chain: %s\n\t", vp->varname);
                    359:                         for(pch = (CHAIN)vp->varval; pch; pch = pch->nextchain)
                    360:                                 fprintf(stderr," %s",
                    361:                                         ((NAMEBLOCK)pch->datap)->namep);
                    362:                         fprintf(stderr,"\n");
                    363:                 }
                    364: 
                    365:         for(p=firstname; p!=0; p = p->nextname)
                    366:                 prname(p, prntflag);
                    367:         printf("\n");
                    368:         fflush(stdout);
                    369: }
                    370: 
                    371: prname(p, prntflag)
                    372: register NAMEBLOCK p;
                    373: {
                    374:         register LINEBLOCK lp;
                    375:         register DEPBLOCK dp;
                    376:         register SHBLOCK sp;
                    377: 
                    378:         if(p->linep != 0)
                    379:                 printf("\n\n%s:",p->namep);
                    380:         else
                    381:                 fprintf(stderr, "\n\n%s", p->namep);
                    382:         if(prntflag)
                    383:         {
                    384:                 fprintf(stderr,"  done=%d",p->done);
                    385:         }
                    386:         if(p==mainname) fprintf(stderr,"  (MAIN NAME)");
                    387:         for(lp = p->linep ; lp!=0 ; lp = lp->nextline)
                    388:         {
                    389:                 if( dp = lp->depp )
                    390:                 {
                    391:                         fprintf(stderr,"\n depends on:");
                    392:                         for(; dp!=0 ; dp = dp->nextdep)
                    393:                                 if(dp->depname != 0)
                    394:                                 {
                    395:                                         printf(" %s", dp->depname->namep);
                    396:                                         printf(" ");
                    397:                                 }
                    398:                 }
                    399:                 if(sp = lp->shp)
                    400:                 {
                    401:                         printf("\n");
                    402:                         fprintf(stderr," commands:\n");
                    403:                         for( ; sp!=0 ; sp = sp->nextsh)
                    404:                                 printf("\t%s\n", sp->shbp);
                    405:                 }
                    406:         }
                    407: }
                    408: 
                    409: 
                    410: setflags(ac, av)
                    411: int ac;
                    412: CHARSTAR *av;
                    413: {
                    414:         register int i, j;
                    415:         register char c;
                    416:         int flflg=0;                    /* flag to note `-f' option. */
                    417: 
                    418:         for(i=1; i<ac; ++i)
                    419:         {
                    420:                 if(flflg)
                    421:                 {
                    422:                         flflg = 0;
                    423:                         continue;
                    424:                 }
                    425:                 if(av[i]!=0 && av[i][0]==MINUS)
                    426:                 {
                    427:                         if(any(av[i], 'f'))
                    428:                                 flflg++;
                    429:                         for(j=1 ; (c=av[i][j])!=CNULL ; ++j)
                    430:                                 optswitch(c);
                    431:                         if(flflg)
                    432:                                 av[i] = "-f";
                    433:                         else
                    434:                                 av[i] = 0;
                    435:                 }
                    436:         }
                    437: }
                    438: 
                    439: 
                    440: /*
                    441:  *      Handle a single char option.
                    442:  */
                    443: optswitch(c)
                    444: register char c;
                    445: {
                    446: 
                    447:         switch(c)
                    448:         {
                    449: 
                    450:         case 'e':       /* environment override flag */
                    451:                 setmflgs(c);
                    452:                 break;
                    453: 
                    454:         case 'd':       /* debug flag */
                    455:                 TURNON(DBUG);
                    456:                 setmflgs(c);
                    457:                 break;
                    458: 
                    459:         case 'p':       /* print description */
                    460:                 TURNON(PRTR);
                    461:                 break;
                    462: 
                    463:         case 's':       /* silent flag */
                    464:                 TURNON(SIL);
                    465:                 setmflgs(c);
                    466:                 break;
                    467: 
                    468:         case 'i':       /* ignore errors */
                    469:                 TURNON(IGNERR);
                    470:                 setmflgs(c);
                    471:                 break;
                    472: 
                    473:         case 'S':
                    474:                 TURNOFF(KEEPGO);
                    475:                 setmflgs(c);
                    476:                 break;
                    477: 
                    478:         case 'k':
                    479:                 TURNON(KEEPGO);
                    480:                 setmflgs(c);
                    481:                 break;
                    482: 
                    483:         case 'n':       /* do not exec any commands, just print */
                    484:                 TURNON(NOEX);
                    485:                 setmflgs(c);
                    486:                 break;
                    487: 
                    488:         case 'r':       /* turn off internal rules */
                    489:                 TURNOFF(INTRULE);
                    490:                 break;
                    491: 
                    492:         case 't':       /* touch flag */
                    493:                 TURNON(TOUCH);
                    494:                 setmflgs(c);
                    495:                 break;
                    496: 
                    497:         case 'q':       /* question flag */
                    498:                 TURNON(QUEST);
                    499:                 setmflgs(c);
                    500:                 break;
                    501: 
                    502:         case 'g':       /* turn default $(GET) of files not found */
                    503:                 TURNON(GET);
                    504:                 setmflgs(c);
                    505:                 break;
                    506: 
                    507:         case 'm':       /* print memory map */
                    508:                 TURNON(MEMMAP);
                    509:                 setmflgs(c);
                    510:                 break;
                    511: 
                    512:         case 'b':       /* use MH version of test for whether a cmd exists */
                    513:                 TURNON(MH_DEP);
                    514:                 setmflgs(c);
                    515:                 break;
                    516:         case 'B':       /* turn off -b flag */
                    517:                 TURNOFF(MH_DEP);
                    518:                 setmflgs(c);
                    519:                 break;
                    520: 
                    521:         case 'f':       /* Named makefile; already handled by setflags(). */
                    522:                 break;
                    523: 
                    524:         default:
                    525:                 fatal1("Unknown flag argument %c", c);
                    526:         }
                    527: }
                    528: 
                    529: /*
                    530:  *      getmflgs() set the cmd line flags into an EXPORTED variable
                    531:  *      for future invocations of make to read.
                    532:  */
                    533: 
                    534: 
                    535: getmflgs()
                    536: {
                    537:         register VARBLOCK vpr;
                    538:         register CHARSTAR *pe;
                    539:         register CHARSTAR p;
                    540: 
                    541:         vpr = varptr(Makeflags);
                    542:         setvar(Makeflags, "ZZZZZZZZZZZZZZZZ");
                    543:         vpr->varval[0] = CNULL;
                    544:         vpr->envflg = YES;
                    545:         vpr->noreset = YES;
                    546:         optswitch('b');
                    547:         for(pe = environ; *pe; pe++)
                    548:         {
                    549:                 if(sindex(*pe, "MAKEFLAGS=") == 0)
                    550:                 {
                    551:                         for(p = (*pe)+sizeof Makeflags; *p; p++)
                    552:                                 optswitch(*p);
                    553:                         return;
                    554:                 }
                    555:         }
                    556: }
                    557: 
                    558: /*
                    559:  *      setmflgs(c) sets up the cmd line input flags for EXPORT.
                    560:  */
                    561: 
                    562: setmflgs(c)
                    563: register char c;
                    564: {
                    565:         register VARBLOCK vpr;
                    566:         register CHARSTAR p;
                    567: 
                    568:         vpr = varptr(Makeflags);
                    569:         for(p = vpr->varval; *p; p++)
                    570:         {
                    571:                 if(*p == c)
                    572:                         return;
                    573:         }
                    574:         *p++ = c;
                    575:         *p = CNULL;
                    576: }

unix.superglobalmegacorp.com

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