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}