# 2.11BSD#431 - /usr/src/bin/make/main.c

##### Functions

    enbint            X
    intrupt           X
    isprecious        X
    main              X
    printdesc         X
    rdd1              X
    rddescf           X
    readenv           X
    setmachine        X

##### Variables

    dbgflag           X
    doenvlast         X
    firstname         X
    firstod           X
    firstpat          X
    firstrd           X
    firstvar          X
    funny             X
    ignerr            X
    inarglist         X
    junkname          X
    keepgoing         X
    linesptr          X
    mainname          X
    ndocoms           X
    noexflag          X
    nopdir            X
    noruleflag        X
    okdel             X
    options           X
    prompt            X
    prtrflag          X
    questflag         X
    sigivalue         X
    sigqvalue         X
    silflag           X
    sufflist          X
    touchflag         X
    waitpid           X

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

#### Defined functions

enbint defined in line 267; used 6 times

- in line 189
- in /usr/src/bin/make/dosys.c line 41, 67-72(2), 126-128(2)

intrupt defined in line 225; used 5 times

- in line 67, 189
- in /usr/src/bin/make/dosys.c line 60, 72, 128

isprecious defined in line 250; used 1 times

- in line 235

main defined in line 56; never used
printdesc defined in line 348; used 3 times

- in line 179, 203, 216

rdd1 defined in line 329; used 7 times

- in line 295, 305-312(4), 318-321(2)

rddescf defined in line 285; used 4 times

- in line 143, 170-173(3)

readenv defined in line 399; used 2 times

- in line 177, 298

setmachine defined in line 422; used 1 times

- in line 166

#### Defined variables

dbgflag defined in line 33; used 9 times

- in line 100, 203, 216
- in /usr/src/bin/make/doname.c line 72, 112, 177
- in /usr/src/bin/make/main.c line 100, 203, 216

doenvlast defined in line 44; used 3 times

- in line 150, 176, 297

firstname defined in line 22; used 4 times

- in line 371
- in /usr/src/bin/make/main.c line 371
- in /usr/src/bin/make/misc.c line 53, 60

firstod defined in line 26; used 6 times

- in line 362
- in /usr/src/bin/make/dosys.c line 83
- in /usr/src/bin/make/files.c line 265, 282-283(2)
- in /usr/src/bin/make/main.c line 362

firstpat defined in line 25; used 6 times

- in /usr/src/bin/make/files.c line 212-217(3)
- in /usr/src/bin/make/gcos.c line 203-208(3)

firstrd defined in line 282; used 1 times

- in line 292

firstvar defined in line 24; used 7 times

- in line 367-368(2)
- in /usr/src/bin/make/main.c line 367-368(2)
- in /usr/src/bin/make/misc.c line 240-246(3)

funny defined in line 53; used 8 times

- in line 78-82(3)
- in /usr/src/bin/make/dosys.c line 25
- in /usr/src/bin/make/gram.y line 161
- in /usr/src/bin/make/main.c line 78-82(3)

ignerr defined in line 42; used 5 times

- in line 112, 181
- in /usr/src/bin/make/doname.c line 276
- in /usr/src/bin/make/main.c line 112, 181

inarglist defined in line 45; used 5 times

- in line 85, 91
- in /usr/src/bin/make/main.c line 85, 91
- in /usr/src/bin/make/misc.c line 204

junkname defined in line 52; used 4 times

- in line 241-242(2)
- in /usr/src/bin/make/main.c line 241-242(2)

keepgoing defined in line 37; used 6 times

- in line 116-120(2)
- in /usr/src/bin/make/doname.c line 220, 283
- in /usr/src/bin/make/main.c line 116-120(2)

linesptr defined in line 279; never used
mainname defined in line 21; used 8 times

- in line 212-215(2), 376
- in /usr/src/bin/make/main.c line 212-215(2), 376
- in /usr/src/bin/make/misc.c line 61-63(2)

ndocoms defined in line 41; used 2 times

- in /usr/src/bin/make/doname.c line 240, 258

noexflag defined in line 36; used 9 times

- in line 124, 232
- in /usr/src/bin/make/doname.c line 229, 267, 300-306(3)
- in /usr/src/bin/make/main.c line 124, 232

nopdir defined in line 51; used 2 times

- in /usr/src/bin/make/files.c line 277-280(2)

noruleflag defined in line 38; used 4 times

- in line 128, 294
- in /usr/src/bin/make/main.c line 128, 294

okdel defined in line 43; used 5 times

- in line 232
- in /usr/src/bin/make/doname.c line 123-124(2), 131
- in /usr/src/bin/make/main.c line 232

options defined in line 54; used 4 times

- in line 69, 162-164(3)

prompt defined in line 49; used 1 times

- in /usr/src/bin/make/doname.c line 302

prtrflag defined in line 34; used 4 times

- in line 104, 179
- in /usr/src/bin/make/main.c line 104, 179

questflag defined in line 40; used 6 times

- in line 136
- in /usr/src/bin/make/doname.c line 128, 236-239(2), 259
- in /usr/src/bin/make/main.c line 136

sigivalue defined in line 29; used 4 times

- in line 187, 270
- in /usr/src/bin/make/main.c line 187, 270

sigqvalue defined in line 30; used 4 times

- in line 188, 272
- in /usr/src/bin/make/main.c line 188, 272

silflag defined in line 35; used 6 times

- in line 108, 182
- in /usr/src/bin/make/doname.c line 265, 300
- in /usr/src/bin/make/main.c line 108, 182

sufflist defined in line 23; used 6 times

- in line 183-184(2)
- in /usr/src/bin/make/doname.c line 157, 167
- in /usr/src/bin/make/main.c line 183-184(2)

touchflag defined in line 39; used 5 times

- in line 132, 232
- in /usr/src/bin/make/doname.c line 262
- in /usr/src/bin/make/main.c line 132, 232

waitpid defined in line 31; used 4 times

- in /usr/src/bin/make/dosys.c line 39, 68-71(2), 124

Last modified: 1998-09-16 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1868 |