BSD 3 development
[unix-history] / usr / src / cmd / make / files.c
CommitLineData
36be9057
BJ
1/* UNIX DEPENDENT PROCEDURES */
2
3
4/* DEFAULT RULES FOR UNIX */
5
6char *builtin[] =
7 {
8#ifdef pwb
9 ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h",
10#else
11 ".SUFFIXES : .out .o .c .f .e .r .y .yr .ye .l .s",
12#endif
13 "YACC=yacc",
14 "YACCR=yacc -r",
15 "YACCE=yacc -e",
16 "YFLAGS=",
17 "LEX=lex",
18 "LFLAGS=",
19 "CC=cc",
20#ifdef vax
21 "AS=as",
22#else
23 "AS=as -",
24#endif
25 "CFLAGS=",
26 "RC=f77",
27 "RFLAGS=",
28 "EC=f77",
29 "EFLAGS=",
30 "FFLAGS=",
31 "LOADLIBES=",
32#ifdef pwb
33 "SCOMP=scomp",
34 "SCFLAGS=",
35 "CMDICT=cmdict",
36 "CMFLAGS=",
37#endif
38
39 ".c.o :",
40 "\t$(CC) $(CFLAGS) -c $<",
41
42 ".e.o .r.o .f.o :",
43 "\t$(EC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<",
44
45 ".s.o :",
46 "\t$(AS) -o $@ $<",
47
48 ".y.o :",
49 "\t$(YACC) $(YFLAGS) $<",
50 "\t$(CC) $(CFLAGS) -c y.tab.c",
51 "\trm y.tab.c",
52 "\tmv y.tab.o $@",
53
54 ".yr.o:",
55 "\t$(YACCR) $(YFLAGS) $<",
56 "\t$(RC) $(RFLAGS) -c y.tab.r",
57 "\trm y.tab.r",
58 "\tmv y.tab.o $@",
59
60 ".ye.o :",
61 "\t$(YACCE) $(YFLAGS) $<",
62 "\t$(EC) $(RFLAGS) -c y.tab.e",
63 "\trm y.tab.e",
64 "\tmv y.tab.o $@",
65
66 ".l.o :",
67 "\t$(LEX) $(LFLAGS) $<",
68 "\t$(CC) $(CFLAGS) -c lex.yy.c",
69 "\trm lex.yy.c",
70 "\tmv lex.yy.o $@",
71
72 ".y.c :",
73 "\t$(YACC) $(YFLAGS) $<",
74 "\tmv y.tab.c $@",
75
76 ".l.c :",
77 "\t$(LEX) $(LFLAGS) $<",
78 "\tmv lex.yy.c $@",
79
80 ".yr.r:",
81 "\t$(YACCR) $(YFLAGS) $<",
82 "\tmv y.tab.r $@",
83
84 ".ye.e :",
85 "\t$(YACCE) $(YFLAGS) $<",
86 "\tmv y.tab.e $@",
87
88#ifdef pwb
89 ".o.L .c.L .t.L:",
90 "\t$(SCOMP) $(SCFLAGS) $<",
91
92 ".t.o:",
93 "\t$(SCOMP) $(SCFLAGS) -c $<",
94
95 ".t.c:",
96 "\t$(SCOMP) $(SCFLAGS) -t $<",
97
98 ".h.z .t.z:",
99 "\t$(CMDICT) $(CMFLAGS) $<",
100
101 ".h.x .t.x:",
102 "\t$(CMDICT) $(CMFLAGS) -c $<",
103#endif
104
105 ".s.out .c.out .o.out :",
106 "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@",
107
108 ".f.out .r.out .e.out :",
109 "\t$(EC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@",
110 "\t-rm $*.o",
111
112 ".y.out :",
113 "\t$(YACC) $(YFLAGS) $<",
114 "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@",
115 "\trm y.tab.c",
116
117 ".l.out :",
118 "\t$(LEX) $(LFLAGS) $<",
119 "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@",
120 "\trm lex.yy.c",
121
122 0 };
123\f
124#include "defs"
125#include <sys/types.h>
126
127
128TIMETYPE exists(filename)
129char *filename;
130{
131#include <sys/stat.h>
132struct stat buf;
133register char *s;
134TIMETYPE lookarch();
135
136for(s = filename ; *s!='\0' && *s!='(' ; ++s)
137 ;
138
139if(*s == '(')
140 return(lookarch(filename));
141
142if(stat(filename,&buf) < 0)
143 return(0);
144else return(buf.st_mtime);
145}
146
147
148TIMETYPE prestime()
149{
150TIMETYPE t;
151time(&t);
152return(t);
153}
154
155\f
156
157#include <sys/dir.h>
158FSTATIC char n15[15];
159FSTATIC char *n15end = &n15[14];
160
161
162
163struct depblock *srchdir(pat, mkchain, nextdbl)
164register char *pat; /* pattern to be matched in directory */
165int mkchain; /* nonzero if results to be remembered */
166struct depblock *nextdbl; /* final value for chain */
167{
168FILE * dirf;
169int i, nread, cldir;
170char *dirname, *dirpref, *endir, *filepat, *p, temp[100];
171char fullname[100], *p1, *p2;
172struct nameblock *q;
173struct depblock *thisdbl;
174struct opendir *od;
175struct pattern *patp;
176
177struct direct entry[32];
178
179
180thisdbl = 0;
181
182if(mkchain == NO)
183 for(patp=firstpat ; patp ; patp = patp->nxtpattern)
184 if(! unequal(pat, patp->patval)) return(0);
185
186patp = ALLOC(pattern);
187patp->nxtpattern = firstpat;
188firstpat = patp;
189patp->patval = copys(pat);
190
191endir = 0;
192
193for(p=pat; *p!='\0'; ++p)
194 if(*p=='/') endir = p;
195
196if(endir==0)
197 {
198 dirname = ".";
199 dirpref = "";
200 filepat = pat;
201 }
202else {
203 dirname = pat;
204 *endir = '\0';
205 dirpref = concat(dirname, "/", temp);
206 filepat = endir+1;
207 }
208
209dirf = NULL;
210cldir = NO;
211
212for(od = firstod ; od; od = od->nxtopendir)
213 if(! unequal(dirname, od->dirn) )
214 {
215 dirf = od->dirfc;
216 fseek(dirf,0L,0); /* start over at the beginning */
217 break;
218 }
219
220if(dirf == NULL)
221 {
222 dirf = fopen(dirname, "r");
223 if(nopdir >= MAXDIR)
224 cldir = YES;
225 else {
226 ++nopdir;
227 od = ALLOC(opendir);
228 od->nxtopendir = firstod;
229 firstod = od;
230 od->dirfc = dirf;
231 od->dirn = copys(dirname);
232 }
233 }
234
235if(dirf == NULL)
236 {
237 fprintf(stderr, "Directory %s: ", dirname);
238 fatal("Cannot open");
239 }
240
241else do
242 {
243 nread = fread( (char *) &entry[0], sizeof(struct direct), 32, dirf) ;
244 for(i=0; i<nread; ++i)
245 if(entry[i].d_ino!= 0)
246 {
247 p1 = entry[i].d_name;
248 p2 = n15;
249 while( (p2<n15end) &&
250 (*p2++ = *p1++)!='\0' );
251 if( amatch(n15,filepat) )
252 {
253 concat(dirpref,n15,fullname);
254 if( (q=srchname(fullname)) ==0)
255 q = makename(copys(fullname));
256 if(mkchain)
257 {
258 thisdbl = ALLOC(depblock);
259 thisdbl->nxtdepblock = nextdbl;
260 thisdbl->depname = q;
261 nextdbl = thisdbl;
262 }
263 }
264 }
265
266 } while(nread==32);
267
268if(endir != 0) *endir = '/';
269
270if(cldir)
271 fclose(dirf);
272return(thisdbl);
273}
274\f
275/* stolen from glob through find */
276
277static amatch(s, p)
278char *s, *p;
279{
280 register int cc, scc, k;
281 int c, lc;
282
283 scc = *s;
284 lc = 077777;
285 switch (c = *p) {
286
287 case '[':
288 k = 0;
289 while (cc = *++p) {
290 switch (cc) {
291
292 case ']':
293 if (k)
294 return(amatch(++s, ++p));
295 else
296 return(0);
297
298 case '-':
299 k |= (lc <= scc) & (scc <= (cc=p[1]) ) ;
300 }
301 if (scc==(lc=cc)) k++;
302 }
303 return(0);
304
305 case '?':
306 caseq:
307 if(scc) return(amatch(++s, ++p));
308 return(0);
309 case '*':
310 return(umatch(s, ++p));
311 case 0:
312 return(!scc);
313 }
314 if (c==scc) goto caseq;
315 return(0);
316}
317
318static umatch(s, p)
319char *s, *p;
320{
321 if(*p==0) return(1);
322 while(*s)
323 if (amatch(s++,p)) return(1);
324 return(0);
325}
326\f
327#ifdef METERFILE
328#include <pwd.h>
329int meteron = 0; /* default: metering off */
330
331meter(file)
332char *file;
333{
334TIMETYPE tvec;
335char *p, *ctime();
336FILE * mout;
337struct passwd *pwd, *getpwuid();
338
339if(file==0 || meteron==0) return;
340
341pwd = getpwuid(getuid());
342
343time(&tvec);
344
345if( (mout=fopen(file,"a")) != NULL )
346 {
347 p = ctime(&tvec);
348 p[16] = '\0';
349 fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4);
350 fclose(mout);
351 }
352}
353#endif
354\f
355
356/* look inside archives for notations a(b) and a((b))
357 a(b) is file member b in archive a
358 a((b)) is entry point _b in object archive a
359*/
360#include <ar.h>
361#include <a.out.h>
362
363static struct ar_hdr arhead;
364FILE *arfd;
365long int arpos, arlen;
366
367static struct exec objhead;
368
369static struct nlist objentry;
370
371
372TIMETYPE lookarch(filename)
373char *filename;
374{
375char *p, *q, *send, s[15];
376int i, nc, nsym, objarch;
377
378for(p = filename; *p!= '(' ; ++p)
379 ;
380*p = '\0';
381openarch(filename);
382*p++ = '(';
383
384if(*p == '(')
385 {
386 objarch = YES;
387 nc = 8;
388 ++p;
389 }
390else
391 {
392 objarch = NO;
393 nc = 14;
394 }
395send = s + nc;
396
397for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ )
398 ;
399while(q < send)
400 *q++ = '\0';
401while(getarch())
402 {
403 if(objarch)
404 {
405 getobj();
406 nsym = objhead.a_syms / sizeof(objentry);
407 for(i = 0; i<nsym ; ++i)
408 {
409 fread( (char *) &objentry, sizeof(objentry),1,arfd);
410 if( (objentry.n_type & N_EXT)
411 && ((objentry.n_type & ~N_EXT) || objentry.n_value)
412 && eqstr(objentry.n_name,s,nc))
413 {
414 clarch();
415 return(arhead.ar_date);
416 }
417 }
418 }
419
420 else if( eqstr(arhead.ar_name, s, nc))
421 {
422 clarch();
423 return( arhead.ar_date);
424 }
425 }
426
427clarch();
428return( 0L);
429}
430
431
432clarch()
433{
434fclose( arfd );
435}
436
437
438openarch(f)
439register char *f;
440{
441int word;
442#include <sys/stat.h>
443struct stat buf;
444
445stat(f, &buf);
446arlen = buf.st_size;
447
448arfd = fopen(f, "r");
449if(arfd == NULL)
450 fatal1("cannot open %s", f);
451fread( (char *) &word, sizeof(word), 1, arfd);
452if(word != ARMAG)
453 fatal1("%s is not an archive", f);
454arpos = 0;
455arhead.ar_size = 2 - sizeof(arhead);
456}
457
458
459
460getarch()
461{
462arpos += sizeof(arhead);
463arpos += (arhead.ar_size + 1 ) & ~1L;
464if(arpos >= arlen)
465 return(0);
466fseek(arfd, arpos, 0);
467fread( (char *) &arhead, sizeof(arhead), 1, arfd);
468return(1);
469}
470
471
472getobj()
473{
474long int skip;
475
476fread( (char *) &objhead, sizeof(objhead), 1, arfd);
477if( objhead.a_magic != A_MAGIC1 &&
478 objhead.a_magic != A_MAGIC2 &&
479 objhead.a_magic != A_MAGIC3 &&
480 objhead.a_magic != A_MAGIC4 )
481 fatal1("%s is not an object module", arhead.ar_name);
482skip = objhead.a_text + objhead.a_data;
483#ifdef vax
484skip += objhead.a_trsize + objhead.a_drsize;
485#else
486if(! objhead.a_flag )
487 skip *= 2;
488#endif
489fseek(arfd, skip, 1);
490}
491
492
493eqstr(a,b,n)
494register char *a, *b;
495int n;
496{
497register int i;
498for(i = 0 ; i < n ; ++i)
499 if(*a++ != *b++)
500 return(NO);
501return(YES);
502}