|
|
1.1 root 1: static char *sccsid = "@(#)main.c 4.10 (Berkeley) 87/11/15";
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: 'e' environment variables have precedence over makefiles
17: */
18:
19: struct nameblock *mainname = NULL;
20: struct nameblock *firstname = NULL;
21: struct lineblock *sufflist = NULL;
22: struct varblock *firstvar = NULL;
23: struct pattern *firstpat = NULL;
24: struct dirhdr *firstod = NULL;
25:
26: #include <signal.h>
27: int sigivalue = 0;
28: int sigqvalue = 0;
29: int waitpid = 0;
30:
31: int dbgflag = NO;
32: int prtrflag = NO;
33: int silflag = NO;
34: int noexflag = NO;
35: int keepgoing = NO;
36: int noruleflag = NO;
37: int touchflag = NO;
38: int questflag = NO;
39: int ndocoms = NO;
40: int ignerr = NO; /* default is to stop on error */
41: int okdel = YES;
42: int doenvlast = NO;
43: int inarglist;
44: #ifdef pwb
45: char *prompt = ">"; /* other systems -- pick what you want */
46: #else
47: char *prompt = ""; /* other systems -- pick what you want */
48: #endif
49: int nopdir = 0;
50: char junkname[20];
51: char funny[128];
52: char options[26 + 1] = { '-' };
53:
54: main(argc,argv)
55: int argc;
56: char *argv[];
57: {
58: register struct nameblock *p;
59: int i, j;
60: int descset, nfargs;
61: TIMETYPE tjunk;
62: char c, *s;
63: static char onechar[2] = "X";
64: #ifdef unix
65: int intrupt();
66: #endif
67: char *op = options + 1;
68:
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: case 'e':
148: doenvlast = YES;
149: break;
150:
151: default:
152: onechar[0] = c; /* to make lint happy */
153: fatal1("Unknown flag argument %s", onechar);
154: }
155: }
156: argv[i] = 0;
157: }
158:
159: *op++ = '\0';
160: if (strcmp(options, "-") == 0)
161: *options = '\0';
162: setvar("MFLAGS", options); /* MFLAGS=options to make */
163:
164: setvar("MACHINE", MACHINE);
165:
166: if( !descset )
167: #ifdef unix
168: if( rddescf("makefile") ) rddescf("Makefile");
169: #endif
170: #ifdef gcos
171: rddescf("makefile");
172: #endif
173:
174: if (doenvlast == YES)
175: readenv();
176:
177: if(prtrflag) printdesc(NO);
178:
179: if( srchname(".IGNORE") ) ++ignerr;
180: if( srchname(".SILENT") ) silflag = 1;
181: if(p=srchname(".SUFFIXES")) sufflist = p->linep;
182: if( !sufflist ) fprintf(stderr,"No suffix list.\n");
183:
184: #ifdef unix
185: sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
186: sigqvalue = (int) signal(SIGQUIT, SIG_IGN) & 01;
187: enbint(intrupt);
188: #endif
189:
190: nfargs = 0;
191:
192: for(i=1; i<argc; ++i)
193: if((s=argv[i]) != 0)
194: {
195: if((p=srchname(s)) == 0)
196: {
197: p = makename(s);
198: }
199: ++nfargs;
200: doname(p, 0, &tjunk);
201: if(dbgflag) printdesc(YES);
202: }
203:
204: /*
205: If no file arguments have been encountered, make the first
206: name encountered that doesn't start with a dot
207: */
208:
209: if(nfargs == 0)
210: if(mainname == 0)
211: fatal("No arguments or description file");
212: else {
213: doname(mainname, 0, &tjunk);
214: if(dbgflag) printdesc(YES);
215: }
216:
217: exit(0);
218: }
219:
220: #include <sys/stat.h>
221:
222: #ifdef unix
223: intrupt()
224: {
225: struct varblock *varptr();
226: char *p;
227: TIMETYPE exists();
228: struct stat sbuf;
229:
230: if(okdel && !noexflag && !touchflag &&
231: (p = varptr("@")->varval) &&
232: (stat(p, &sbuf) >= 0 && (sbuf.st_mode&S_IFMT) == S_IFREG) &&
233: !isprecious(p) )
234: {
235: fprintf(stderr, "\n*** %s removed.", p);
236: unlink(p);
237: }
238:
239: if(junkname[0])
240: unlink(junkname);
241: fprintf(stderr, "\n");
242: exit(2);
243: }
244:
245:
246:
247:
248: isprecious(p)
249: char *p;
250: {
251: register struct lineblock *lp;
252: register struct depblock *dp;
253: register struct nameblock *np;
254:
255: if(np = srchname(".PRECIOUS"))
256: for(lp = np->linep ; lp ; lp = lp->nxtlineblock)
257: for(dp = lp->depp ; dp ; dp = dp->nxtdepblock)
258: if(! unequal(p, dp->depname->namep))
259: return(YES);
260:
261: return(NO);
262: }
263:
264:
265: enbint(k)
266: int (*k)();
267: {
268: if(sigivalue == 0)
269: signal(SIGINT,k);
270: if(sigqvalue == 0)
271: signal(SIGQUIT,k);
272: }
273: #endif
274:
275: extern char *builtin[];
276:
277: char **linesptr = builtin;
278:
279: FILE * fin;
280: int firstrd = 0;
281:
282:
283: rddescf(descfile)
284: char *descfile;
285: {
286: FILE * k;
287:
288: /* read and parse description */
289:
290: if( !firstrd++ )
291: {
292: if( !noruleflag )
293: rdd1( (FILE *) NULL);
294:
295: if (doenvlast == NO)
296: readenv();
297:
298: #ifdef pwb
299: {
300: char *nlog, s[BUFSIZ];
301: nlog = logdir();
302: if ( (k=fopen( concat(nlog,"/makecomm",s), "r")) != NULL)
303: rdd1(k);
304: else if ( (k=fopen( concat(nlog,"/Makecomm",s), "r")) != NULL)
305: rdd1(k);
306:
307: if ( (k=fopen("makecomm", "r")) != NULL)
308: rdd1(k);
309: else if ( (k=fopen("Makecomm", "r")) != NULL)
310: rdd1(k);
311: }
312: #endif
313:
314: }
315: if(! unequal(descfile, "-"))
316: return( rdd1(stdin) );
317:
318: if( (k = fopen(descfile,"r")) != NULL)
319: return( rdd1(k) );
320:
321: return(1);
322: }
323:
324:
325:
326:
327: rdd1(k)
328: FILE * k;
329: {
330: extern int yylineno;
331: extern char *zznextc;
332:
333: fin = k;
334: yylineno = 0;
335: zznextc = 0;
336:
337: if( yyparse() )
338: fatal("Description file error");
339:
340: if(fin != NULL && fin != stdin)
341: fclose(fin);
342:
343: return(0);
344: }
345:
346: printdesc(prntflag)
347: int prntflag;
348: {
349: struct nameblock *p;
350: struct depblock *dp;
351: struct varblock *vp;
352: struct dirhdr *od;
353: struct shblock *sp;
354: struct lineblock *lp;
355:
356: #ifdef unix
357: if(prntflag)
358: {
359: printf("Open directories:\n");
360: for (od = firstod; od; od = od->nxtopendir)
361: printf("\t%d: %s\n", dirfd(od->dirfc), od->dirn);
362: }
363: #endif
364:
365: if(firstvar != 0) printf("Macros:\n");
366: for(vp = firstvar; vp ; vp = vp->nxtvarblock)
367: printf("\t%s = %s\n" , vp->varname , vp->varval);
368:
369: for(p = firstname; p; p = p->nxtnameblock)
370: {
371: printf("\n\n%s",p->namep);
372: if(p->linep != 0) printf(":");
373: if(prntflag) printf(" done=%d",p->done);
374: if(p==mainname) printf(" (MAIN NAME)");
375: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
376: {
377: if( dp = lp->depp )
378: {
379: printf("\n depends on:");
380: for(; dp ; dp = dp->nxtdepblock)
381: if(dp->depname != 0)
382: printf(" %s ", dp->depname->namep);
383: }
384:
385: if(sp = lp->shp)
386: {
387: printf("\n commands:\n");
388: for( ; sp!=0 ; sp = sp->nxtshblock)
389: printf("\t%s\n", sp->shbp);
390: }
391: }
392: }
393: printf("\n");
394: fflush(stdout);
395: }
396:
397: readenv()
398: {
399: register char **ep, *p;
400: extern char **environ;
401:
402: for(ep = environ ; *ep ; ++ep) {
403: for (p = *ep; *p; p++) {
404: if (isalnum(*p))
405: continue;
406: if (*p == '=') {
407: eqsign(*ep);
408: }
409: break;
410: }
411: }
412: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.