make fails to support archive(member) names
Dave Davey
daved at physiol.su.oz
Wed Dec 7 14:00:56 AEST 1988
According to documentation, make supports dependencies of archive
members on source files, e.g. in the manual for make:
Two special forms of a name are recognized. A name like
a(b) means the file named b stored in the archive named a.
This is supposed to allow for makefiles like:
L = lib.a
LIBOBJS = $L(a.o) $L(b.o)
.c.a:
$(CC) -c $<
ar rv $L $*.o
rm -f $*.o
L: $(LIBOBJS)
The 4.3BSD and 4.3BSD(tahoe) versions of make do not support
this form of dependency - only some of the code needed
is present. The following context differences will patch either
the original 4.3 or the tahoe sources.
*** doname.c.orig Wed Dec 7 14:15:02 1988
--- doname.c Wed Dec 7 14:18:07 1988
***************
*** 14,19 ****
--- 14,22 ----
extern char *sys_siglist[];
+ extern char arfname[MAXNAMLEN];
+ char *savenamep;
+
doname(p, reclevel, tval)
register struct nameblock *p;
int reclevel;
***************
*** 140,145 ****
--- 143,157 ----
}
}
+ if((strchr(p->namep,'(')) != NULL)
+ {
+ /* fake the target */
+ if(dbgflag)
+ printf("\tARCHIVE MEMBER: %s\n",arfname);
+ savenamep = p->namep;
+ p->namep = copys(arfname);
+ }
+
/* Look for implicit dependents, using suffix rules */
for(lp = sufflist ; lp ; lp = lp->nxtlineblock)
***************
*** 148,153 ****
--- 160,170 ----
pnamep = suffp->depname->namep;
if(suffix(p->namep , pnamep , prefix))
{
+ if(savenamep)
+ {
+ /* fake the type of target */
+ pnamep = ".a";
+ }
srchdir( concat(prefix,"*",temp) , NO, (struct depblock *) NULL);
for(lp1 = sufflist ; lp1 ; lp1 = lp1->nxtlineblock)
*** files.c.orig Wed Dec 7 14:15:19 1988
--- files.c Wed Dec 7 14:16:51 1988
***************
*** 406,412 ****
static long arflen;
static long arfdate;
! static char arfname[16];
FILE *arfd;
long int arpos, arlen;
--- 406,412 ----
static long arflen;
static long arfdate;
! char arfname[MAXNAMLEN];
FILE *arfd;
long int arpos, arlen;
***************
*** 470,475 ****
--- 470,476 ----
}
}
+ strcpy(arfname,s);
clarch();
return( 0L);
}
***************
*** 519,524 ****
--- 520,526 ----
{
struct ar_hdr arhead;
long atol();
+ int i;
arpos += (arflen + 1) & ~1L; /* round archived file length up to even */
if(arpos >= arlen)
***************
*** 535,540 ****
--- 537,552 ----
arfdate = arhead.ar_date;
#endif
strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name));
+ #ifdef ASCARCH
+ for(i=sizeof arfname; i > 0; i--)
+ {
+ if(arfname[i-1] == '\0')
+ continue;
+ if(arfname[i-1] != ' ')
+ break;
+ arfname[i-1] = '\0';
+ }
+ #endif ASCARCH
return(1);
}
More information about the Comp.bugs.4bsd.ucb-fixes
mailing list