main main.c
  1# include "defs"
  2#include <unistd.h>
  3/*
  4command make to update programs.
  5Flags:	'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	'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
 17struct nameblock *mainname ;
 18struct nameblock *firstname;
 19struct lineblock *sufflist;
 20struct varblock *firstvar;
 21struct pattern *firstpat ;
 22struct opendir *firstod;
 23
 24int sigivalue = 0;
 25int sigqvalue = 0;
 26int dbgflag = 0;
 27int prtrflag = 0;
 28int silflag = 0;
 29int noexflag = 0;
 30int noruleflag = 0;
 31int touchflag = 0;
 32int questflag = 0;
 33int ndocoms = 0;
 34int ignerr = 0;    /* default is to stop on error */
 35int okdel = 1;
 36int inarglist;
 37char *prompt = ">";	/* other systems -- pick what you want */
 38
 39main(argc,argv)
 40int argc;
 41char **argv;
 42{
 43struct nameblock *p, *makename(), *srchname();
 44int i, j;
 45int descset, nfargs;
 46char c, *s;
 47#ifdef unix
 48void intrupt(int);
 49#endif
 50
 51pexinit();
 52descset = 0;
 53
 54inarglist = 1;
 55for(i=1; i<argc; ++i)
 56	if(argv[i]!=0 && argv[i][0]!='-' && eqsign(argv[i]))
 57		argv[i] = 0;
 58
 59setvar("$","$");
 60inarglist = 0;
 61
 62for(i=1; i<argc; ++i)
 63    if(argv[i]!=0 && argv[i][0]=='-')
 64	{
 65	for(j=1 ; (c=argv[i][j])!='\0' ; ++j)  switch(c)
 66		{
 67		case 'd':
 68			dbgflag = 1;
 69			break;
 70
 71		case 'p':
 72			prtrflag = 1;
 73			break;
 74
 75		case 's':
 76			silflag = 1;
 77			break;
 78
 79		case 'i':
 80			ignerr = 1;
 81			break;
 82
 83		case 'n':
 84			noexflag = 1;
 85			break;
 86
 87		case 'r':
 88			noruleflag = 1;
 89			break;
 90
 91		case 't':
 92			touchflag = 1;
 93			break;
 94
 95		case 'q':
 96			questflag = 1;
 97			break;
 98
 99		case 'f':
100			if(i >= argc-1)
101			  fatal("No description argument after -f flag");
102			if( rddescf(argv[i+1]) )
103				{
104				fprintf(stderr,"Cannot open %s",argv[i+1]);
105				fatal("");
106				}
107			argv[i+1] = 0;
108			++descset;
109			break;
110
111		default:
112			fprintf(stderr,"Unknown flag argument %c", c);
113			fatal("");
114		}
115
116	argv[i] = 0;
117	}
118
119if( !descset )
120#ifdef unix
121	if( rddescf("makefile") )  rddescf("Makefile");
122#endif
123#ifdef gcos
124	rddescf("makefile");
125#endif
126
127if(prtrflag) printdesc(0);
128
129if( srchname(".IGNORE") ) ++ignerr;
130if( srchname(".SILENT") ) silflag = 1;
131if(p=srchname(".SUFFIXES")) sufflist = p->linep;
132if( !sufflist ) fprintf(stderr,"No suffix list.\n");
133
134#ifdef unix
135sigivalue = (signal(SIGINT,  SIG_IGN) == SIG_IGN) ? 1 : 0;
136sigqvalue = (signal(SIGQUIT, SIG_IGN) == SIG_IGN) ? 1 : 0;
137enbint(intrupt);
138#endif
139
140nfargs = 0;
141
142for(i=1; i<argc; ++i)
143	if((s=argv[i]) != 0)
144		{
145		if((p=srchname(s)) == 0)
146			{
147			p = makename(s);
148/*
149			fprintf(stderr,"Warning: %s not in description.\n",s);
150*/
151			}
152		++nfargs;
153		doname(p,0);
154		if(dbgflag) printdesc(1);
155		}
156
157/*
158If no file arguments have been encountered, make the first
159name encountered that doesn't start with a dot
160*/
161
162if(nfargs == 0)
163	if(mainname == 0)
164		fatal("No arguments or description file");
165	else	{
166		doname(mainname,0);
167		if(dbgflag) printdesc(1);
168		}
169
170exit(0);
171}
172
173
174
175#ifdef unix
176void intrupt(int sig)
177{
178struct varblock *varptr();
179char *p;
180
181if( okdel &&  (p=varptr("@")->varval) && exists(p)>0 && !noexflag && !touchflag )
182	{
183	fprintf(stderr, "\n***  %s removed.", p);
184	unlink(p);
185	}
186
187fprintf(stderr, "\n");
188exit(2);
189}
190
191
192
193void disint()
194{
195signal(SIGINT,  SIG_IGN);
196signal(SIGQUIT, SIG_IGN);
197}
198
199
200
201void enbint(k)
202void (*k)(int);
203{
204if(sigivalue == 0)
205	signal(SIGINT,k);
206if(sigqvalue == 0)
207	signal(SIGQUIT,k);
208}
209#endif
210
211extern char *builtin[];
212
213char **linesptr = builtin;
214
215FILE * fin;
216int firstrd = 0;
217
218
219rddescf(descfile)
220char *descfile;
221{
222extern int yylineno;
223extern char *zznextc;
224FILE * k;
225
226/* read and parse description */
227
228if( !firstrd++ )
229	{
230	if( !noruleflag )
231		rdd1(NULL);
232
233#ifdef pwb
234		{
235		char *nlog, s[100];
236		nlog = logdir();
237		if ( (k=fopen( concat(nlog,"/makecomm",s), "r")) != NULL)
238			rdd1(k);
239		else if ( (k=fopen( concat(nlog,"/Makecomm",s), "r")) != NULL)
240			rdd1(k);
241
242		if ( (k=fopen("makecomm", "r")) != NULL)
243			rdd1(k);
244		else if ( (k=fopen("Makecomm", "r")) != NULL)
245			rdd1(k);
246		}
247#endif
248
249	}
250if(equals(descfile, "-"))
251	return( rdd1(stdin) );
252
253if( (k = fopen(descfile,"r")) != NULL)
254	return( rdd1(k) );
255
256return(1);
257}
258
259
260
261
262rdd1(k)
263FILE * k;
264{
265extern int yylineno;
266extern char *zznextc;
267fin = k;
268yylineno = 0;
269zznextc = 0;
270
271if( yyparse() )
272	fatal("Description file error");
273
274if(fin != NULL)
275	fclose(fin);
276
277return(0);
278}
279
280printdesc(prntflag)
281int prntflag;
282{
283struct nameblock *p;
284struct depblock *dp;
285struct varblock *vp;
286struct opendir *od;
287struct shblock *sp;
288struct lineblock *lp;
289
290#ifdef unix
291if(prntflag)
292	{
293	printf("Open directories:\n");
294	for(od=firstod; od!=0; od = od->nextp)
295		printf("\t%d: %s\n", fileno(od->dirfc), od->dirn);
296	}
297#endif
298
299if(firstvar != 0) printf("Macros:\n");
300for(vp=firstvar; vp!=0; vp=vp->nextp)
301	printf("\t%s = %s\n" , vp->varname , vp->varval);
302
303for(p=firstname; p!=0; p = p->nextp)
304	{
305	printf("\n\n%s",p->namep);
306	if(p->linep != 0) printf(":");
307	if(prntflag) printf("  done=%d",p->done);
308	if(p==mainname) printf("  (MAIN NAME)");
309	for(lp = p->linep ; lp!=0 ; lp = lp->nextp)
310		{
311		if( dp = lp->depp )
312			{
313			printf("\n depends on:");
314			for(; dp!=0 ; dp = dp->nextp)
315				if(dp->depname != 0)
316					printf(" %s ", dp->depname->namep);
317			}
318
319		if(sp = lp->shp)
320			{
321			printf("\n commands:\n");
322			for( ; sp!=0 ; sp = sp->nextp)
323				printf("\t%s\n", sp->shbp);
324			}
325		}
326	}
327printf("\n");
328fflush(stdout);
329}