|
|
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 ;
18: struct nameblock *firstname;
19: struct lineblock *sufflist;
20: struct varblock *firstvar;
21: struct pattern *firstpat ;
22: struct opendir *firstod;
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.