|
|
1.1 root 1: static char *sccsid = "@(#)main.c 4.11 (Berkeley) 88/09/13";
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: if (rddescf("makefile"))
168: rddescf("Makefile");
169: rddescf(".depend");
170: }
171:
172: if (doenvlast == YES)
173: readenv();
174:
175: if(prtrflag) printdesc(NO);
176:
177: if( srchname(".IGNORE") ) ++ignerr;
178: if( srchname(".SILENT") ) silflag = 1;
179: if(p=srchname(".SUFFIXES")) sufflist = p->linep;
180: if( !sufflist ) fprintf(stderr,"No suffix list.\n");
181:
182: #ifdef unix
183: sigivalue = (int) signal(SIGINT, SIG_IGN) & 01;
184: sigqvalue = (int) signal(SIGQUIT, SIG_IGN) & 01;
185: enbint(intrupt);
186: #endif
187:
188: nfargs = 0;
189:
190: for(i=1; i<argc; ++i)
191: if((s=argv[i]) != 0)
192: {
193: if((p=srchname(s)) == 0)
194: {
195: p = makename(s);
196: }
197: ++nfargs;
198: doname(p, 0, &tjunk);
199: if(dbgflag) printdesc(YES);
200: }
201:
202: /*
203: If no file arguments have been encountered, make the first
204: name encountered that doesn't start with a dot
205: */
206:
207: if(nfargs == 0)
208: if(mainname == 0)
209: fatal("No arguments or description file");
210: else {
211: doname(mainname, 0, &tjunk);
212: if(dbgflag) printdesc(YES);
213: }
214:
215: exit(0);
216: }
217:
218: #include <sys/stat.h>
219:
220: #ifdef unix
221: intrupt()
222: {
223: struct varblock *varptr();
224: char *p;
225: TIMETYPE exists();
226: struct stat sbuf;
227:
228: if(okdel && !noexflag && !touchflag &&
229: (p = varptr("@")->varval) &&
230: (stat(p, &sbuf) >= 0 && (sbuf.st_mode&S_IFMT) == S_IFREG) &&
231: !isprecious(p) )
232: {
233: fprintf(stderr, "\n*** %s removed.", p);
234: unlink(p);
235: }
236:
237: if(junkname[0])
238: unlink(junkname);
239: fprintf(stderr, "\n");
240: exit(2);
241: }
242:
243:
244:
245:
246: isprecious(p)
247: char *p;
248: {
249: register struct lineblock *lp;
250: register struct depblock *dp;
251: register struct nameblock *np;
252:
253: if(np = srchname(".PRECIOUS"))
254: for(lp = np->linep ; lp ; lp = lp->nxtlineblock)
255: for(dp = lp->depp ; dp ; dp = dp->nxtdepblock)
256: if(! unequal(p, dp->depname->namep))
257: return(YES);
258:
259: return(NO);
260: }
261:
262:
263: enbint(k)
264: int (*k)();
265: {
266: if(sigivalue == 0)
267: signal(SIGINT,k);
268: if(sigqvalue == 0)
269: signal(SIGQUIT,k);
270: }
271: #endif
272:
273: extern char *builtin[];
274:
275: char **linesptr = builtin;
276:
277: FILE * fin;
278: int firstrd = 0;
279:
280:
281: rddescf(descfile)
282: char *descfile;
283: {
284: FILE * k;
285:
286: /* read and parse description */
287:
288: if( !firstrd++ )
289: {
290: if( !noruleflag )
291: rdd1( (FILE *) NULL);
292:
293: if (doenvlast == NO)
294: readenv();
295:
296: #ifdef pwb
297: {
298: char *nlog, s[BUFSIZ];
299: nlog = logdir();
300: if ( (k=fopen( concat(nlog,"/makecomm",s), "r")) != NULL)
301: rdd1(k);
302: else if ( (k=fopen( concat(nlog,"/Makecomm",s), "r")) != NULL)
303: rdd1(k);
304:
305: if ( (k=fopen("makecomm", "r")) != NULL)
306: rdd1(k);
307: else if ( (k=fopen("Makecomm", "r")) != NULL)
308: rdd1(k);
309: }
310: #endif
311:
312: }
313: if(! unequal(descfile, "-"))
314: return( rdd1(stdin) );
315:
316: if( (k = fopen(descfile,"r")) != NULL)
317: return( rdd1(k) );
318:
319: return(1);
320: }
321:
322:
323:
324:
325: rdd1(k)
326: FILE * k;
327: {
328: extern int yylineno;
329: extern char *zznextc;
330:
331: fin = k;
332: yylineno = 0;
333: zznextc = 0;
334:
335: if( yyparse() )
336: fatal("Description file error");
337:
338: if(fin != NULL && fin != stdin)
339: fclose(fin);
340:
341: return(0);
342: }
343:
344: printdesc(prntflag)
345: int prntflag;
346: {
347: struct nameblock *p;
348: struct depblock *dp;
349: struct varblock *vp;
350: struct dirhdr *od;
351: struct shblock *sp;
352: struct lineblock *lp;
353:
354: #ifdef unix
355: if(prntflag)
356: {
357: printf("Open directories:\n");
358: for (od = firstod; od; od = od->nxtopendir)
359: printf("\t%d: %s\n", dirfd(od->dirfc), od->dirn);
360: }
361: #endif
362:
363: if(firstvar != 0) printf("Macros:\n");
364: for(vp = firstvar; vp ; vp = vp->nxtvarblock)
365: printf("\t%s = %s\n" , vp->varname , vp->varval);
366:
367: for(p = firstname; p; p = p->nxtnameblock)
368: {
369: printf("\n\n%s",p->namep);
370: if(p->linep != 0) printf(":");
371: if(prntflag) printf(" done=%d",p->done);
372: if(p==mainname) printf(" (MAIN NAME)");
373: for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
374: {
375: if( dp = lp->depp )
376: {
377: printf("\n depends on:");
378: for(; dp ; dp = dp->nxtdepblock)
379: if(dp->depname != 0)
380: printf(" %s ", dp->depname->namep);
381: }
382:
383: if(sp = lp->shp)
384: {
385: printf("\n commands:\n");
386: for( ; sp!=0 ; sp = sp->nxtshblock)
387: printf("\t%s\n", sp->shbp);
388: }
389: }
390: }
391: printf("\n");
392: fflush(stdout);
393: }
394:
395: readenv()
396: {
397: register char **ep, *p;
398: extern char **environ;
399:
400: for(ep = environ ; *ep ; ++ep) {
401: for (p = *ep; *p; p++) {
402: if (isalnum(*p))
403: continue;
404: if (*p == '=') {
405: eqsign(*ep);
406: }
407: break;
408: }
409: }
410: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.