Annotation of researchv10no/cmd/usgmake/main.c, revision 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.