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