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

1.1       root        1: /*      %W%     */
                      2: /*      @(#)/usr/src/cmd/make/doname.c  3.5     */
                      3: 
                      4: #include "defs"
                      5: #define        ONE     0
                      6: 
                      7: 
                      8: char Makecall;                  /* flag which says whether to exec $(MAKE) */
                      9: extern char archmem[];
                     10: extern char archname[];
                     11: 
                     12: /*  BASIC PROCEDURE.  RECURSIVE.  */
                     13: 
                     14: /*
                     15: p->done = 0   don't know what to do yet
                     16: p->done = 1   file in process of being updated
                     17: p->done = 2   file already exists in current state
                     18: p->done = 3   file make failed
                     19: */
                     20: 
                     21: 
                     22: doname(p, reclevel, tval)
                     23: register NAMEBLOCK p;
                     24: int reclevel;
                     25: TIMETYPE *tval;
                     26: {
                     27:         register DEPBLOCK q;
                     28:         register LINEBLOCK lp;
                     29:         int errstat;
                     30:         int okdel1;
                     31:         int didwork;
                     32:         TIMETYPE td, td1, tdep, ptime, ptime1;
                     33:         DEPBLOCK qtemp, suffp, suffp1;
                     34:         NAMEBLOCK p1, p2;
                     35:         SHBLOCK implcom, explcom;
                     36:         LINEBLOCK lp1, lp2;
                     37:         char sourcename[100],prefix[100],temp[100],concsuff[20];
                     38:         CHARSTAR pnamep, p1namep;
                     39:         CHAIN qchain;
                     40:         int found, onetime;
                     41:         CHARSTAR savenamep;
                     42: 
                     43:         if(p == 0)
                     44:         {
                     45:                 *tval = 0;
                     46:                 return(0);
                     47:         }
                     48: 
                     49:         if(ONE)
                     50:         {
                     51:                 blprt(reclevel);
                     52:                 printf("doname(%s,%d)\n",p->namep,reclevel);
                     53:                 fflush(stdout);
                     54:         }
                     55: 
                     56:         if(p->done > 0)
                     57:         {
                     58:                 *tval = p->modtime;
                     59:                 return(p->done == 3);
                     60:         }
                     61: 
                     62:         errstat = 0;
                     63:         tdep = 0;
                     64:         implcom = 0;
                     65:         explcom = 0;
                     66:         ptime = exists(p);
                     67:         if(reclevel == 0 && ONE)
                     68:         {
                     69:                 blprt(reclevel);
                     70:                 printf("TIME(%s)=%ld\n", p->namep, ptime);
                     71:         }
                     72:         ptime1 = 0;
                     73:         didwork = NO;
                     74:         p->done = 1;    /* avoid infinite loops */
                     75: 
                     76:         qchain = NULL;
                     77: 
                     78: /*
                     79:  *      Perform runtime dependency translations.
                     80:  */
                     81:         if(p->rundep == 0)
                     82:         {
                     83:                 setvar("@", p->namep);
                     84:                 dynamicdep(p);
                     85:                 setvar("@", 0);
                     86:         }
                     87: 
                     88: /*
                     89:  *      Expand any names that have embedded metacharaters. Must be
                     90:  *      done after dynamic dependencies because the dyndep symbols
                     91:  *      ($(*D)) may contain shell meta characters.
                     92:  */
                     93:         expand(p);
                     94: 
                     95: 
                     96: 
                     97: /*
                     98:  *      FIRST SECTION -- GO THROUGH DEPENDENCIES
                     99:  */
                    100: 
                    101:         if(ONE)
                    102:         {
                    103:                 blprt(reclevel);
                    104:                 printf("look for explicit deps. %d \n", reclevel);
                    105:         }
                    106:         for(lp = p->linep ; lp!=0 ; lp = lp->nextline)
                    107:         {
                    108:                 td = 0;
                    109:                 for(q = lp->depp ; q!=0 ; q=q->nextdep)
                    110:                 {
                    111:                         q->depname->backname = p;
                    112:                         errstat += doname(q->depname, reclevel+1, &td1);
                    113:                         if(ONE)
                    114:                         {
                    115:                             blprt(reclevel);
                    116:                             printf("TIME(%s)=%ld\n", q->depname->namep, td1);
                    117:                         }
                    118:                         td = max(td1,td);
                    119:                         if(ptime < td1)
                    120:                                 appendq(&qchain, q->depname->namep);
                    121:                 }
                    122:                 if(p->septype == SOMEDEPS)
                    123:                 {
                    124:                         if(lp->shp!=0)
                    125:                                 if( ptime<td || (ptime==0 && td==0) || lp->depp==0)
                    126:                                 {
                    127:                                         okdel1 = okdel;
                    128:                                         okdel = NO;
                    129:                                         setvar("@", p->namep);
                    130:                                         if(savenamep)
                    131:                                                 setvar("%", archmem);
                    132:                                         setvar("?", mkqlist(qchain) );
                    133:                                         qchain = NULL;
                    134:                                         if( IS_OFF(QUEST) )
                    135:                                         {
                    136:                                                 ballbat(p, reclevel);
                    137:                                                 errstat += docom(lp->shp);
                    138:                                         }
                    139:                                         setvar("@", 0);
                    140:                                         setvar("%", 0);
                    141:                                         okdel = okdel1;
                    142:                                         if( (ptime1 = exists(p)) == 0)
                    143:                                                 ptime1 = prestime();
                    144:                                         didwork = YES;
                    145:                                 }
                    146:                 }
                    147: 
                    148:                 else
                    149:                 {
                    150:                         if(lp->shp != 0)
                    151:                         {
                    152:                                 if(explcom)
                    153:                                         fprintf(stderr, "Too many command lines for `%s'\n",
                    154:                                                 p->namep);
                    155:                                 else
                    156:                                         explcom = lp->shp;
                    157:                         }
                    158: 
                    159:                         tdep = max(tdep, td);
                    160:                 }
                    161:         }
                    162: 
                    163: /*
                    164:  *      SECOND SECTION -- LOOK FOR IMPLICIT DEPENDENTS
                    165:  */
                    166: 
                    167:         if(ONE)
                    168:         {
                    169:                 blprt(reclevel);
                    170:                 printf("look for implicit rules. %d \n", reclevel);
                    171:         }
                    172:         found = 0; onetime = 0;
                    173:         if(any(p->namep, LPAREN))
                    174:         {
                    175:                 savenamep = p->namep;
                    176:                 p->namep = copys(archmem);
                    177:                 if(ONE)
                    178:                 {
                    179:                         blprt(reclevel);
                    180:                         printf("archmem = %s\n", archmem);
                    181:                 }
                    182:                 if(ONE) 
                    183:                 {
                    184:                         blprt(reclevel);
                    185:                         printf("archname = %s\n", archname);
                    186:                 }
                    187:         }
                    188:         else
                    189:                 savenamep = 0;
                    190: 
                    191: 
                    192:         for(lp=sufflist ; lp!=0 ; lp = lp->nextline)
                    193:         for(suffp = lp->depp ; suffp!=0 ; suffp = suffp->nextdep)
                    194:         {
                    195:                 pnamep = suffp->depname->namep;
                    196:                 if(suffix(p->namep , pnamep , prefix))
                    197:                 {
                    198:                         if(ONE) 
                    199:                         {
                    200:                                 blprt(reclevel);
                    201:                                 printf("right match = %s\n",p->namep);
                    202:                         }
                    203:                         found = 1;
                    204:                         if(savenamep)
                    205:                                 pnamep = ".a";
                    206: searchdir:
                    207: 
                    208:                         copstr(temp, prefix);
                    209:                         addstars(temp);
                    210:                         srchdir( temp , NO, NULL);
                    211:                         for(lp1 = sufflist ; lp1!=0 ; lp1 = lp1->nextline)
                    212:                         for(suffp1=lp1->depp ; suffp1!=0 ; suffp1 = suffp1->nextdep)
                    213:                         {
                    214:                                 p1namep = suffp1->depname->namep;
                    215:                                 concat(p1namep, pnamep, concsuff);
                    216:                                 if( (p1=srchname(concsuff)) == 0)
                    217:                                         continue;
                    218:                                 if(p1->linep == 0)
                    219:                                         continue;
                    220:                                 concat(prefix, p1namep, sourcename);
                    221:                                 if(any(p1namep, WIGGLE))
                    222:                                 {
                    223:                                         sourcename[strlen(sourcename) - 1] = CNULL;
                    224:                                         if(is_sccs(sourcename) == NO)
                    225:                                                 trysccs(sourcename);
                    226:                                 }
                    227:                                 if( (p2=srchname(sourcename)) == 0)
                    228:                                         continue;
                    229:                                 if(equal(sourcename, p->namep))
                    230:                                         continue;
                    231: /*
                    232:  *      FOUND -- left and right match
                    233:  */
                    234: 
                    235:                                 found = 2;
                    236:                                 if(ONE)
                    237:                                 {
                    238:                                   blprt(reclevel);
                    239:                                   printf("%s ---%s--- %s\n",
                    240:                                         sourcename, concsuff, p->namep);
                    241:                                 }
                    242:                                 p2->backname = p;
                    243:                                 errstat += doname(p2, reclevel+1, &td);
                    244:                                 if(ptime < td)
                    245:                                         appendq(&qchain, p2->namep);
                    246:                                 if(ONE)
                    247:                                 {
                    248:                                         blprt(reclevel);
                    249:                                         printf("TIME(%s)=%ld\n",p2->namep,td);
                    250:                                 }
                    251:                                 tdep = max(tdep, td);
                    252:                                 setvar("*", prefix);
                    253:                                 setvar("<", sourcename);
                    254:                                 for(lp2=p1->linep ; lp2!=0 ; lp2 = lp2->nextline)
                    255:                                         if(implcom = lp2->shp) break;
                    256:                                 goto endloop;
                    257:                         }
                    258: /*
                    259:  *      quit search for single suffix rule.
                    260:  */
                    261:                         if(onetime == 1)
                    262:                                 goto endloop;
                    263:                 }
                    264:         }
                    265: 
                    266: endloop:
                    267: 
                    268: 
                    269: /*
                    270:  * look for a single suffix type rule.
                    271:  * only possible if no explicit dependents and no shell rules
                    272:  * are found, and nothing has been done so far. (previously, `make'
                    273:  * would exit with 'Don't know how to make ...' message.
                    274:  */
                    275:         if(found == 0)
                    276:         if(onetime == 0)
                    277:         if(       p->linep == 0 ||
                    278:                 ( p->linep->depp == 0 && p->linep->shp == 0))
                    279:         {
                    280:                 onetime = 1;
                    281:                 if(ONE)
                    282:                 {
                    283:                         blprt(reclevel);
                    284:                         printf("Looking for Single suffix rule.\n");
                    285:                 }
                    286:                 concat(p->namep, "", prefix);
                    287:                 pnamep = "";
                    288:                 goto searchdir;
                    289:         }
                    290: 
                    291: 
                    292: /*
                    293:  *      THIRD SECTION -- LOOK FOR DEFAULT CONDITION OR DO COMMAND
                    294:  */
                    295:         if(errstat==0 && (ptime<tdep || (ptime==0 && tdep==0) ) )
                    296:         {
                    297:                 if(savenamep)
                    298:                 {
                    299:                         setvar("@", archname);
                    300:                         setvar("%", archmem);
                    301:                 }
                    302:                 else
                    303:                 {
                    304:                         setvar("@", p->namep);
                    305:                 }
                    306:                 setvar("?", mkqlist(qchain) );
                    307:                 ballbat(p, reclevel);
                    308:                 if(explcom)
                    309:                         errstat += docom(explcom);
                    310:                 else if(implcom)
                    311:                         errstat += docom(implcom);
                    312:                 else if( (p->septype != SOMEDEPS && IS_OFF(MH_DEP)) ||
                    313:                          (p->septype == 0        && IS_ON(MH_DEP) )    )
                    314: /*
                    315:  *      OLD WAY OF DOING TEST is
                    316:  *              else if(p->septype == 0)
                    317:  *      notice above, a flag has been put in to get the murray hill version.
                    318:  *      the flag is "-b" (for botch).
                    319:  */
                    320:                         if(p1=srchname(".DEFAULT"))
                    321:                         {
                    322:                                 if(ONE)
                    323:                                 {
                    324:                                         blprt(reclevel);
                    325:                                         printf("look for DEFAULT rule. %d \n", reclevel);
                    326:                                 }
                    327:                                 setvar("<", p->namep);
                    328:                                 for(lp2=p1->linep ; lp2!=0 ; lp2 = lp2->nextline)
                    329:                                         if(implcom = lp2->shp)
                    330:                                         {
                    331:                                                 errstat += docom(implcom);
                    332:                                         }
                    333:                         }
                    334:                         else if(IS_OFF(GET) ||
                    335:                                   !get(p->namep, NOCD, 0) )
                    336:                         {
                    337:                                 fatal1(" Don't know how to make %s", p->namep);
                    338:                         }
                    339: 
                    340:                 setvar("@", 0);
                    341:                 setvar("%", 0);
                    342:                 if(IS_ON(NOEX) || (ptime = exists(p)) == 0)
                    343:                         ptime = prestime();
                    344:         }
                    345: 
                    346:         else if(errstat!=0 && reclevel==0)
                    347:                 printf("`%s' not remade because of errors\n", p->namep);
                    348: 
                    349:         else if(IS_OFF(QUEST) && reclevel==0  &&  didwork==NO)
                    350:                 printf("`%s' is up to date.\n", p->namep);
                    351: 
                    352:         if(IS_ON(QUEST) && reclevel==0)
                    353:                 exit(ndocoms>0 ? -1 : 0);
                    354: 
                    355:         p->done = (errstat ? 3 : 2);
                    356:         ptime = max(ptime1, ptime);
                    357:         p->modtime = ptime;
                    358:         *tval = ptime;
                    359:         setvar("<", 0);
                    360:         setvar("*", 0);
                    361:         return(errstat);
                    362: }
                    363: 
                    364: docom(q)
                    365: SHBLOCK q;
                    366: {
                    367:         CHARSTAR s;
                    368:         int status;
                    369:         int ign, nopr;
                    370:         char string[OUTMAX];
                    371: 
                    372:         ++ndocoms;
                    373:         if(IS_ON(QUEST))
                    374:                 return(0);
                    375: 
                    376:         if(IS_ON(TOUCH))
                    377:         {
                    378:                 s = varptr("@")->varval;
                    379:                 if(IS_OFF(SIL))
                    380:                         printf("touch(%s)\n", s);
                    381:                 if(IS_OFF(NOEX))
                    382:                         touch(1,s);
                    383:         }
                    384: 
                    385:         else for( status = 0; q!=0 ; q = q->nextsh )
                    386:         {
                    387: /*
                    388:  *      Allow recursive makes to execute only if the NOEX flag set
                    389:  */
                    390:                 if(sindex(q->shbp, "$(MAKE)") != -1 && IS_ON(NOEX))
                    391:                         Makecall = YES;
                    392:                 else
                    393:                         Makecall = NO;
                    394:                 subst(q->shbp,string);
                    395: 
                    396:                 ign = IS_ON(IGNERR) ? YES : NO;
                    397:                 nopr = NO;
                    398:                 for(s = string ; *s==MINUS || *s==AT ; ++s)
                    399:                         if(*s == MINUS)  ign = YES;
                    400:                         else nopr = YES;
                    401: 
                    402:                 if( docom1(s, ign, nopr) && !ign)
                    403:                         if(IS_ON(KEEPGO))
                    404:                                 return(1);
                    405:                         else    fatal(0);
                    406:         }
                    407:         return(0);
                    408: }
                    409: 
                    410: 
                    411: 
                    412: docom1(comstring, nohalt, noprint)
                    413: register CHARSTAR comstring;
                    414: int nohalt, noprint;
                    415: {
                    416:         register int status;
                    417: 
                    418:         if(comstring[0] == '\0') return(0);
                    419: 
                    420:         if(IS_OFF(SIL) && (!noprint || IS_ON(NOEX)) )
                    421:         {
                    422:                 CHARSTAR p1, ps;
                    423:                 CHARSTAR pmt = prompt;
                    424: 
                    425:                 ps = p1 = comstring;
                    426:                 while(1)
                    427:                 {
                    428:                         while(*p1 && *p1 != NEWLINE) p1++;
                    429:                         if(*p1)
                    430:                         {
                    431:                                 *p1 = 0;
                    432:                                 printf("%s%s\n", pmt, ps);
                    433:                                 *p1 = NEWLINE;
                    434:                                 ps = p1 + 1;
                    435:                                 p1 = ps;
                    436:                         }
                    437:                         else
                    438:                         {
                    439:                                 printf("%s%s\n", pmt, ps);
                    440:                                 break;
                    441:                         }
                    442:                 }
                    443: 
                    444:                 fflush(stdout);
                    445:         }
                    446: 
                    447:         if( status = dosys(comstring, nohalt) )
                    448:         {
                    449:                 if( status>>8 )
                    450:                         printf("*** Error code %d", status>>8 );
                    451:                 else    printf("*** Termination code %d", status );
                    452: 
                    453:                 if(nohalt) printf(" (ignored)\n");
                    454:                 else    printf("\n");
                    455:                 fflush(stdout);
                    456:         }
                    457: 
                    458:         return(status);
                    459: }
                    460: 
                    461: 
                    462: /*
                    463:  *      If there are any Shell meta characters in the name,
                    464:  *      search the directory, and if the search finds something
                    465:  *      replace the dependency in "p"'s dependency chain. srchdir
                    466:  *      produces a DEPBLOCK chain whose last member has a null
                    467:  *      nextdep pointer or the NULL pointer if it finds nothing.
                    468:  *      The loops below do the following: for each dep in each line
                    469:  *      if the dep->depname has a shell metacharacter in it and
                    470:  *      if srchdir succeeds, replace the dep with the new one
                    471:  *      created by srchdir. The Nextdep variable is to skip over
                    472:  *      the new stuff inserted into the chain.
                    473: */
                    474: 
                    475: expand(p)
                    476: NAMEBLOCK p;
                    477: {
                    478:         register DEPBLOCK db;
                    479:         register DEPBLOCK Nextdep;
                    480:         register CHARSTAR s;
                    481:         register DEPBLOCK srchdb;
                    482:         register LINEBLOCK lp;
                    483: 
                    484: 
                    485: 
                    486:         for(lp = p->linep ; lp!=0 ; lp = lp->nextline)
                    487:                 for(db=lp->depp ; db!=0 ; db=Nextdep )
                    488:                 {
                    489:                         Nextdep = db->nextdep;
                    490:                         if(any( (s=db->depname->namep), STAR) ||
                    491:                            any(s, QUESTN) || any(s, LSQUAR) )
                    492:                                 if( srchdb = srchdir(s , YES, NULL) )
                    493:                                         dbreplace(p, db, srchdb);
                    494:                 }
                    495: }
                    496: /*
                    497:  *      Replace the odb depblock in np's dependency list with the
                    498:  *      dependency chain defined by ndb. This is just a linked list insert
                    499:  *      problem. dbreplace assumes the last "nextdep" pointer in
                    500:  *      "ndb" is null.
                    501:  */
                    502: dbreplace(np, odb, ndb)
                    503: register NAMEBLOCK np;
                    504: register DEPBLOCK odb, ndb;
                    505: {
                    506:         register LINEBLOCK lp;
                    507:         register DEPBLOCK  db;
                    508:         register DEPBLOCK  enddb;
                    509: 
                    510:         for(enddb = ndb; enddb->nextdep; enddb = enddb->nextdep);
                    511: 
                    512:         for(lp = np->linep; lp; lp = lp->nextline)
                    513:                 if(lp->depp == odb)
                    514:                 {
                    515:                         enddb->nextdep  = lp->depp->nextdep;
                    516:                         lp->depp        = ndb;
                    517:                         return;
                    518:                 }
                    519:                 else
                    520:                 {
                    521:                         for(db = lp->depp; db; db = db->nextdep)
                    522:                                 if(db->nextdep == odb)
                    523:                                 {
                    524:                                         enddb->nextdep  = odb->nextdep;
                    525:                                         db->nextdep     = ndb;
                    526:                                         return;
                    527:                                 }
                    528:                 }
                    529: }
                    530: 
                    531: 
                    532: #define NPREDS 50
                    533: 
                    534: ballbat(np, reclevel)
                    535: NAMEBLOCK np;
                    536: {
                    537:         static char ballb[200];
                    538:         register CHARSTAR p;
                    539:         register NAMEBLOCK npp;
                    540:         register int i;
                    541:         VARBLOCK vp;
                    542:         int npreds=0;
                    543:         NAMEBLOCK circles[NPREDS];
                    544: 
                    545: 
                    546:         if( (vp=varptr("!"))->varval == 0)
                    547:                 vp->varval = ballb;
                    548:         p = ballb;
                    549:         p = copstr(p, varptr("<")->varval);
                    550:         p = copstr(p, " ");
                    551:         for(npp = np; npp; npp = npp->backname)
                    552:         {
                    553:                 for(i = 0; i < npreds; i++)
                    554:                 {
                    555:                         if(npp == circles[i])
                    556:                         {
                    557:                                 fprintf(stderr,"$! nulled, predecessor circle\n");
                    558:                                 ballb[0] = CNULL;
                    559:                                 return;
                    560:                         }
                    561:                 }
                    562:                 circles[npreds++] = npp;
                    563:                 if(npreds >= NPREDS)
                    564:                 {
                    565:                         fprintf(stderr, "$! nulled, too many predecessors\n");
                    566:                         ballb[0] = CNULL;
                    567:                         return;
                    568:                 }
                    569:                 p = copstr(p, npp->namep);
                    570:                 p = copstr(p, " ");
                    571:         }
                    572: }
                    573: 
                    574: /*
                    575:  *      PRINT n BLANKS WHERE n IS THE CURRENT RECURSION LEVEL.
                    576:  */
                    577: blprt(n)
                    578: register int n;
                    579: {
                    580:         while(n--)
                    581:                 printf("   ");
                    582: }

unix.superglobalmegacorp.com

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