3 command make to update programs.
5 'e' use environment macros after rather than before makefiles
6 'f' the next argument is the name of the description file;
7 "makefile" is the default
8 'i' ignore error codes from the shell
9 'k' continue to update other targets that don't depend
10 on target if error occurs making a target
11 'n' don't issue, just print, commands
12 'p' print out a version of the input graph
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 'r' clear the builtin suffix list and don't use built-in rules
16 's' silent mode--don't print out commands
17 'S' stop after any command fails (default; opposite of -k)
18 't' touch (update time of) files but don't issue command
21 'd' print out debugging comments
22 'N' use % patterns instead of old suffix rules
23 'Pn' set process limit to n
24 'z' always use shell, never issue commands directly
28 nameblkp mainname = NULL;
29 nameblkp firstname = NULL;
30 lineblkp sufflist = NULL;
31 struct varblock *firstvar = NULL;
32 struct pattern *firstpat = NULL;
33 struct dirhd *firstod = NULL;
34 wildp firstwild = NULL;
35 wildp lastwild = NULL;
41 int proclimit = PROCLIMIT;
44 struct process procstack[MAXPROC];
59 int ignerr = NO; /* default is to stop on error */
66 extern char *dfltmacro[];
67 extern char *dfltpat[];
68 extern char *dfltsuff[];
69 extern char **environ;
76 static void loadenv(void);
77 static int isprecious(char *);
78 static int rddescf(char *);
79 static void rdarray(char **);
80 static void printdesc(int);
83 main(int argc, char **argv)
91 static char makeflags[30] = "-";
92 static char onechar[2] = "X";
95 mkflagp = makeflags+1;
97 funny['\0'] = (META | TERMINAL);
98 for(s = "=|^();&<>*?[]:$`'\"\\\n" ; *s ; ++s)
100 for(s = "\n\t :;&>|" ; *s ; ++s)
101 funny[*s] |= TERMINAL;
107 for(i=1; i<argc; ++i)
108 if(argv[i]!=0 && argv[i][0]!='-' && eqsign(argv[i]))
111 setvar("$", "$", NO);
114 for(i=1; i<argc; ++i)
115 if(argv[i]!=0 && argv[i][0]=='-')
117 for(j=1 ; (c=argv[i][j])!='\0' ; ++j) switch(c)
131 fatal("No description argument after -f flag");
132 if( ! rddescf(argv[i+1]) )
133 fatal1("Cannot open %s", argv[i+1]);
163 if(isdigit(argv[i][j+1]))
165 proclimit = argv[i][++j] - '0';
170 fatal("illegal proclimit parameter");
172 *mkflagp++ = argv[i][j];
206 onechar[0] = c; /* to make lint happy */
207 fatal1("Unknown flag argument %s", onechar);
213 if(mkflagp > makeflags+1)
214 setvar("MAKEFLAGS", makeflags, NO);
217 if( !rddescf("makefile") &&
218 !rddescf("Makefile") &&
219 (exists(s = "s.makefile") || exists(s = "s.Makefile")) )
222 concat("get ", s, junk);
223 (void) dosys(junk, NO, NO, junk);
231 if(!noruleflag && !oldflag)
234 if(prtrflag) printdesc(NO);
236 if( srchname(".IGNORE") )
238 if( srchname(".SILENT") )
240 if( srchname(".OLDFLAG") )
242 if( p=srchname(".SUFFIXES") )
244 if( !sufflist && !firstwild)
245 fprintf(stderr,"No suffix or %% pattern list.\n");
247 if(sufflist && !oldflag)
248 fprintf(stderr, "Suffix lists are old-fashioned. Use %% patterns\n);
251 sigivalue = (int) signal(SIGINT, SIG_IGN);
252 sigqvalue = (int) signal(SIGQUIT, SIG_IGN);
257 for(i=1; i<argc; ++i)
260 if((p=srchname(s)) == NULL)
263 if(i+1<argc && argv[i+1] != 0 && equal(argv[i+1], "&") )
270 doname(p, 0, &tjunk, nowait);
271 if(dbgflag) printdesc(YES);
275 If no file arguments have been encountered, make the first
276 name encountered that doesn't start with a dot
281 fatal("No arguments or description file");
283 doname(mainname, 0, &tjunk, NO);
284 if(dbgflag) printdesc(YES);
298 if(okdel && !noexflag && !touchflag &&
299 (p = varptr("@")->varval) && exists(p)>0 && !isprecious(p) )
301 fprintf(stderr, "\n*** %s removed.", p);
305 fprintf(stderr, "\n");
318 if(np = srchname(".PRECIOUS"))
319 for(lp = np->linep ; lp ; lp = lp->nxtlineblock)
320 for(dp = lp->depp ; dp ; dp = dp->nxtdepblock)
321 if(equal(p, dp->depname->namep))
329 enbint(void (*k)(int))
338 rddescf(char *descfile)
340 static int firstrd = YES;
342 /* read and parse description */
358 return parse(descfile);
371 for(envpp = environ ; *envpp ; ++envpp)
377 printdesc(int prntflag)
388 printf("Open directories:\n");
389 for (od = firstod; od; od = od->nxtdirhd)
390 printf("\t%s\n", od->dirn);
393 if(firstvar != 0) printf("Macros:\n");
394 for(vp = firstvar; vp ; vp = vp->nxtvarblock)
395 printf("\t%s = %s\n" , vp->varname , vp->varval ? vp->varval : "(null)");
397 for(p = firstname; p; p = p->nxtnameblock)
399 printf("\n\n%s",p->namep);
400 if(p->linep != 0) printf(":");
401 if(prntflag) printf(" done=%d",p->done);
402 if(p==mainname) printf(" (MAIN NAME)");
403 for(lp = p->linep ; lp ; lp = lp->nxtlineblock)
407 printf("\n depends on:");
408 for(; dp ; dp = dp->nxtdepblock)
410 printf(" %s ", dp->depname->namep);
415 printf("\n commands:\n");
416 for( ; sp ; sp = sp->nxtshblock)
417 printf("\t%s\n", sp->shbp);