static char *sccsid
= "@(#)doname.c 4.9 (Berkeley) 87/06/18";
/* BASIC PROCEDURE. RECURSIVE. */
p->done = 0 don't know what to do yet
p->done = 1 file in process of being updated
p->done = 2 file already exists in current state
p->done = 3 file make failed
extern char *sys_siglist
[];
doname(p
, reclevel
, tval
)
register struct nameblock
*p
;
TIMETYPE td
, td1
, tdep
, ptime
, ptime1
, prestime();
register struct depblock
*q
;
struct depblock
*qtemp
, *srchdir(), *suffp
, *suffp1
;
struct nameblock
*p1
, *p2
;
struct shblock
*implcom
, *explcom
;
register struct lineblock
*lp
;
struct lineblock
*lp1
, *lp2
;
char sourcename
[BUFSIZ
], prefix
[BUFSIZ
], temp
[BUFSIZ
], concsuff
[20];
char *pnamep
, *p1namep
, *cp
;
struct chain
*qchain
, *appendq();
* VPATH= ${PATH1}:${PATH2} didn't work. This fix is so ugly I don't
* even want to think about it. Basically it grabs VPATH and
* explicitly does macro expansion before resolving names. Why
* VPATH didn't get handled correctly I have no idea; the symptom
* was that, while macro expansion got done, the .c files in the
* non-local directories wouldn't be found.
struct varblock
*vpath_cp
, *varptr();
vpath_cp
= varptr("VPATH");
subst(vpath_cp
->varval
, vpath_exp
);
setvar("VPATH",vpath_exp
);
printf("doname(%s,%d)\n",p
->namep
,reclevel
);
p
->done
= 1; /* avoid infinite loops */
/* Expand any names that have embedded metacharaters */
for(lp
= p
->linep
; lp
; lp
= lp
->nxtlineblock
)
for(q
= lp
->depp
; q
; q
=qtemp
)
/* make sure all dependents are up to date */
for(lp
= p
->linep
; lp
; lp
= lp
->nxtlineblock
)
for(q
= lp
->depp
; q
; q
= q
->nxtdepblock
)
errstat
+= doname(q
->depname
, reclevel
+1, &td1
);
printf("TIME(%s)=%ld\n", q
->depname
->namep
, td1
);
qchain
= appendq(qchain
, q
->depname
->namep
);
if(p
->septype
== SOMEDEPS
)
if( ptime
<td
|| (ptime
==0 && td
==0) || lp
->depp
==0)
setvar("?", mkqlist(qchain
) );
errstat
+= docom(lp
->shp
);
setvar("@", (char *) NULL
);
fprintf(stderr
, "Too many command lines for `%s'\n",
/* Look for implicit dependents, using suffix rules */
for(lp
= sufflist
; lp
; lp
= lp
->nxtlineblock
)
for(suffp
= lp
->depp
; suffp
; suffp
= suffp
->nxtdepblock
)
pnamep
= suffp
->depname
->namep
;
if(suffix(p
->namep
, pnamep
, prefix
))
srchdir( concat(prefix
,"*",temp
) , NO
, (struct depblock
*) NULL
);
for(lp1
= sufflist
; lp1
; lp1
= lp1
->nxtlineblock
)
for(suffp1
=lp1
->depp
; suffp1
; suffp1
= suffp1
->nxtdepblock
)
p1namep
= suffp1
->depname
->namep
;
if( (p1
=srchname(concat(p1namep
, pnamep
,concsuff
))) &&
(p2
=srchname(concat(prefix
, p1namep
,sourcename
))) )
errstat
+= doname(p2
, reclevel
+1, &td
);
qchain
= appendq(qchain
, p2
->namep
);
if(dbgflag
) printf("TIME(%s)=%ld\n", p2
->namep
, td
);
if (p2
->alias
) setvar("<", copys(p2
->alias
));
else setvar("<", copys(p2
->namep
));
for(lp2
=p1
->linep
; lp2
; lp2
= lp2
->nxtlineblock
)
if(implcom
= lp2
->shp
) break;
cp
= rindex(prefix
, '/');
if(errstat
==0 && (ptime
<tdep
|| (ptime
==0 && tdep
==0) ) )
ptime
= (tdep
>0 ? tdep
: prestime() );
setvar("?", mkqlist(qchain
) );
errstat
+= docom(explcom
);
errstat
+= docom(implcom
);
if(p1
=srchname(".DEFAULT"))
if (p
->alias
) setvar("<", p
->alias
);
else setvar("<", p
->namep
);
for(lp2
= p1
->linep
; lp2
; lp2
= lp2
->nxtlineblock
)
errstat
+= docom(implcom
);
printf("Don't know how to make %s\n", p
->namep
);
fatal1(" Don't know how to make %s", p
->namep
);
setvar("@", (char *) NULL
);
if(noexflag
|| (ptime
= exists(p
)) == 0)
else if(errstat
!=0 && reclevel
==0)
printf("`%s' not remade because of errors\n", p
->namep
);
else if(!questflag
&& reclevel
==0 && didwork
==NO
)
printf("`%s' is up to date.\n", p
->namep
);
if(questflag
&& reclevel
==0)
exit(ndocoms
>0 ? -1 : 0);
p
->done
= (errstat
? 3 : 2);
if(ptime1
> ptime
) ptime
= ptime1
;
struct varblock
*varptr();
printf("touch(%s)\n", s
);
else for( ; q
; q
= q
->nxtshblock
)
fixname(string2
, string
);
for(s
= string
; *s
=='-' || *s
=='@' ; ++s
)
if( docom1(s
, ign
, nopr
) && !ign
)
else fatal( (char *) NULL
);
docom1(comstring
, nohalt
, noprint
)
register char *comstring
;
if(comstring
[0] == '\0') return(0);
if(!silflag
&& (!noprint
|| noexflag
) )
printf("%s%s\n", (noexflag
? "" : prompt
), comstring
);
if( status
= dosys(comstring
, nohalt
) )
unsigned sig
= status
& 0177;
if (sig
< NSIG
&& sys_siglist
[sig
] != NULL
&&
*sys_siglist
[sig
] != '\0')
printf("*** %s", sys_siglist
[sig
]);
printf("*** Signal %d", sig
);
printf(" - core dumped");
printf("*** Exit %d", status
>>8 );
if(nohalt
) printf(" (ignored)\n");
If there are any Shell meta characters in the name,
expand into a list, after searching directory
register struct depblock
*q
;
struct depblock
*p
, *srchdir();
for(s
=s1
; ;) switch(*s
++)
if( p
= srchdir(s1
, YES
, q
->nxtdepblock
) )