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