|
|
1.1 ! root 1: static char *sccsid = "@(#)main.c 4.8 (Berkeley) 86/01/09"; ! 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: struct nameblock *mainname = NULL; ! 19: struct nameblock *firstname = NULL; ! 20: struct lineblock *sufflist = NULL; ! 21: struct varblock *firstvar = NULL; ! 22: struct pattern *firstpat = NULL; ! 23: struct dirhdr *firstod = NULL; ! 24: ! 25: #include <signal.h> ! 26: int sigivalue = 0; ! 27: int sigqvalue = 0; ! 28: int waitpid = 0; ! 29: ! 30: int dbgflag = NO; ! 31: int prtrflag = NO; ! 32: int silflag = NO; ! 33: int noexflag = NO; ! 34: int keepgoing = NO; ! 35: int noruleflag = NO; ! 36: int touchflag = NO; ! 37: int questflag = NO; ! 38: int ndocoms = NO; ! 39: int ignerr = NO; /* default is to stop on error */ ! 40: int okdel = YES; ! 41: int inarglist; ! 42: #ifdef pwb ! 43: char *prompt = ">"; /* other systems -- pick what you want */ ! 44: #else ! 45: char *prompt = ""; /* other systems -- pick what you want */ ! 46: #endif ! 47: int nopdir = 0; ! 48: char junkname[20]; ! 49: char funny[128]; ! 50: char options[26 + 1] = { '-' }; ! 51: ! 52: main(argc,argv) ! 53: int argc; ! 54: char *argv[]; ! 55: { ! 56: register struct nameblock *p; ! 57: int i, j; ! 58: int descset, nfargs; ! 59: TIMETYPE tjunk; ! 60: char c, *s; ! 61: static char onechar[2] = "X"; ! 62: #ifdef unix ! 63: int intrupt(); ! 64: #endif ! 65: char *op = options + 1; ! 66: ! 67: ! 68: #ifdef METERFILE ! 69: meter(METERFILE); ! 70: #endif ! 71: ! 72: descset = 0; ! 73: ! 74: funny['\0'] = (META | TERMINAL); ! 75: for(s = "=|^();&<>*?[]:$`'\"\\\n" ; *s ; ++s) ! 76: funny[*s] |= META; ! 77: for(s = "\n\t :;&>|" ; *s ; ++s) ! 78: funny[*s] |= TERMINAL; ! 79: ! 80: ! 81: inarglist = 1; ! 82: for(i=1; i<argc; ++i) ! 83: if(argv[i]!=0 && argv[i][0]!='-' && eqsign(argv[i])) ! 84: argv[i] = 0; ! 85: ! 86: setvar("$","$"); ! 87: inarglist = 0; ! 88: ! 89: for (i=1; i<argc; ++i) ! 90: if (argv[i]!=0 && argv[i][0]=='-') { ! 91: for (j=1 ; (c=argv[i][j])!='\0' ; ++j) { ! 92: *op++ = c; ! 93: switch (c) { ! 94: ! 95: case 'd': ! 96: dbgflag = YES; ! 97: break; ! 98: ! 99: case 'p': ! 100: prtrflag = YES; ! 101: break; ! 102: ! 103: case 's': ! 104: silflag = YES; ! 105: break; ! 106: ! 107: case 'i': ! 108: ignerr = YES; ! 109: break; ! 110: ! 111: case 'S': ! 112: keepgoing = NO; ! 113: break; ! 114: ! 115: case 'k': ! 116: keepgoing = YES; ! 117: break; ! 118: ! 119: case 'n': ! 120: noexflag = YES; ! 121: break; ! 122: ! 123: case 'r': ! 124: noruleflag = YES; ! 125: break; ! 126: ! 127: case 't': ! 128: touchflag = YES; ! 129: break; ! 130: ! 131: case 'q': ! 132: questflag = YES; ! 133: break; ! 134: ! 135: case 'f': ! 136: op--; /* don't pass this one */ ! 137: if(i >= argc-1) ! 138: fatal("No description argument after -f flag"); ! 139: if( rddescf(argv[i+1]) ) ! 140: fatal1("Cannot open %s", argv[i+1]); ! 141: argv[i+1] = 0; ! 142: ++descset; ! 143: break; ! 144: ! 145: default: ! 146: onechar[0] = c; /* to make lint happy */ ! 147: fatal1("Unknown flag argument %s", onechar); ! 148: } ! 149: } ! 150: argv[i] = 0; ! 151: } ! 152: ! 153: *op++ = '\0'; ! 154: if (strcmp(options, "-") == 0) ! 155: *options = '\0'; ! 156: setvar("MFLAGS", options); /* MFLAGS=options to make */ ! 157: ! 158: if( !descset ) ! 159: #ifdef unix ! 160: if( rddescf("makefile") ) rddescf("Makefile"); ! 161: #endif ! 162: #ifdef gcos ! 163: rddescf("makefile"); ! 164: #endif ! 165: ! 166: if(prtrflag) printdesc(NO); ! 167: ! 168: if( srchname(".IGNORE") ) ++ignerr; ! 169: if( srchname(".SILENT") ) silflag = 1; ! 170: if(p=srchname(".SUFFIXES")) sufflist = p->linep; ! 171: if( !sufflist ) fprintf(stderr,"No suffix list.\n"); ! 172: ! 173: #ifdef unix ! 174: sigivalue = (int) signal(SIGINT, SIG_IGN) & 01; ! 175: sigqvalue = (int) signal(SIGQUIT, SIG_IGN) & 01; ! 176: enbint(intrupt); ! 177: #endif ! 178: ! 179: nfargs = 0; ! 180: ! 181: for(i=1; i<argc; ++i) ! 182: if((s=argv[i]) != 0) ! 183: { ! 184: if((p=srchname(s)) == 0) ! 185: { ! 186: p = makename(s); ! 187: } ! 188: ++nfargs; ! 189: doname(p, 0, &tjunk); ! 190: if(dbgflag) printdesc(YES); ! 191: } ! 192: ! 193: /* ! 194: If no file arguments have been encountered, make the first ! 195: name encountered that doesn't start with a dot ! 196: */ ! 197: ! 198: if(nfargs == 0) ! 199: if(mainname == 0) ! 200: fatal("No arguments or description file"); ! 201: else { ! 202: doname(mainname, 0, &tjunk); ! 203: if(dbgflag) printdesc(YES); ! 204: } ! 205: ! 206: exit(0); ! 207: } ! 208: ! 209: #include <sys/stat.h> ! 210: ! 211: #ifdef unix ! 212: intrupt() ! 213: { ! 214: struct varblock *varptr(); ! 215: char *p; ! 216: TIMETYPE exists(); ! 217: struct stat sbuf; ! 218: ! 219: if(okdel && !noexflag && !touchflag && ! 220: (p = varptr("@")->varval) && ! 221: (stat(p, &sbuf) >= 0 && (sbuf.st_mode&S_IFMT) == S_IFREG) && ! 222: !isprecious(p) ) ! 223: { ! 224: fprintf(stderr, "\n*** %s removed.", p); ! 225: unlink(p); ! 226: } ! 227: ! 228: if(junkname[0]) ! 229: unlink(junkname); ! 230: fprintf(stderr, "\n"); ! 231: exit(2); ! 232: } ! 233: ! 234: ! 235: ! 236: ! 237: isprecious(p) ! 238: char *p; ! 239: { ! 240: register struct lineblock *lp; ! 241: register struct depblock *dp; ! 242: register struct nameblock *np; ! 243: ! 244: if(np = srchname(".PRECIOUS")) ! 245: for(lp = np->linep ; lp ; lp = lp->nxtlineblock) ! 246: for(dp = lp->depp ; dp ; dp = dp->nxtdepblock) ! 247: if(! unequal(p, dp->depname->namep)) ! 248: return(YES); ! 249: ! 250: return(NO); ! 251: } ! 252: ! 253: ! 254: enbint(k) ! 255: int (*k)(); ! 256: { ! 257: if(sigivalue == 0) ! 258: signal(SIGINT,k); ! 259: if(sigqvalue == 0) ! 260: signal(SIGQUIT,k); ! 261: } ! 262: #endif ! 263: ! 264: extern char *builtin[]; ! 265: ! 266: char **linesptr = builtin; ! 267: ! 268: FILE * fin; ! 269: int firstrd = 0; ! 270: ! 271: ! 272: rddescf(descfile) ! 273: char *descfile; ! 274: { ! 275: FILE * k; ! 276: ! 277: /* read and parse description */ ! 278: ! 279: if( !firstrd++ ) ! 280: { ! 281: if( !noruleflag ) ! 282: rdd1( (FILE *) NULL); ! 283: ! 284: #ifdef pwb ! 285: { ! 286: char *nlog, s[BUFSIZ]; ! 287: nlog = logdir(); ! 288: if ( (k=fopen( concat(nlog,"/makecomm",s), "r")) != NULL) ! 289: rdd1(k); ! 290: else if ( (k=fopen( concat(nlog,"/Makecomm",s), "r")) != NULL) ! 291: rdd1(k); ! 292: ! 293: if ( (k=fopen("makecomm", "r")) != NULL) ! 294: rdd1(k); ! 295: else if ( (k=fopen("Makecomm", "r")) != NULL) ! 296: rdd1(k); ! 297: } ! 298: #endif ! 299: ! 300: } ! 301: if(! unequal(descfile, "-")) ! 302: return( rdd1(stdin) ); ! 303: ! 304: if( (k = fopen(descfile,"r")) != NULL) ! 305: return( rdd1(k) ); ! 306: ! 307: return(1); ! 308: } ! 309: ! 310: ! 311: ! 312: ! 313: rdd1(k) ! 314: FILE * k; ! 315: { ! 316: extern int yylineno; ! 317: extern char *zznextc; ! 318: ! 319: fin = k; ! 320: yylineno = 0; ! 321: zznextc = 0; ! 322: ! 323: if( yyparse() ) ! 324: fatal("Description file error"); ! 325: ! 326: if(fin != NULL && fin != stdin) ! 327: fclose(fin); ! 328: ! 329: return(0); ! 330: } ! 331: ! 332: printdesc(prntflag) ! 333: int prntflag; ! 334: { ! 335: struct nameblock *p; ! 336: struct depblock *dp; ! 337: struct varblock *vp; ! 338: struct dirhdr *od; ! 339: struct shblock *sp; ! 340: struct lineblock *lp; ! 341: ! 342: #ifdef unix ! 343: if(prntflag) ! 344: { ! 345: printf("Open directories:\n"); ! 346: for (od = firstod; od; od = od->nxtopendir) ! 347: printf("\t%d: %s\n", od->dirfc->dd_fd, od->dirn); ! 348: } ! 349: #endif ! 350: ! 351: if(firstvar != 0) printf("Macros:\n"); ! 352: for(vp = firstvar; vp ; vp = vp->nxtvarblock) ! 353: printf("\t%s = %s\n" , vp->varname , vp->varval); ! 354: ! 355: for(p = firstname; p; p = p->nxtnameblock) ! 356: { ! 357: printf("\n\n%s",p->namep); ! 358: if(p->linep != 0) printf(":"); ! 359: if(prntflag) printf(" done=%d",p->done); ! 360: if(p==mainname) printf(" (MAIN NAME)"); ! 361: for(lp = p->linep ; lp ; lp = lp->nxtlineblock) ! 362: { ! 363: if( dp = lp->depp ) ! 364: { ! 365: printf("\n depends on:"); ! 366: for(; dp ; dp = dp->nxtdepblock) ! 367: if(dp->depname != 0) ! 368: printf(" %s ", dp->depname->namep); ! 369: } ! 370: ! 371: if(sp = lp->shp) ! 372: { ! 373: printf("\n commands:\n"); ! 374: for( ; sp!=0 ; sp = sp->nxtshblock) ! 375: printf("\t%s\n", sp->shbp); ! 376: } ! 377: } ! 378: } ! 379: printf("\n"); ! 380: fflush(stdout); ! 381: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.