* Copyright (c) 1992 The Regents of the University of California.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Lawrence Berkeley Laboratories.
* %sccs.include.redist.c%
* @(#)mkmakefile.c 5.2 (Berkeley) %G%
static int emitdefs
__P((FILE *));
static int emitobjs
__P((FILE *));
static int emitcfiles
__P((FILE *));
static int emitsfiles
__P((FILE *));
static int emitfiles
__P((FILE *, int));
static int emitrules
__P((FILE *));
static int emitload
__P((FILE *));
register FILE *ifp
, *ofp
;
register int (*fn
) __P((FILE *));
char line
[BUFSIZ
], ifname
[200];
(void)sprintf(ifname
, "Makefile.%s", machine
);
if ((ifp
= fopen(ifname
, "r")) == NULL
) {
(void)fprintf(stderr
, "config: cannot read %s: %s\n",
ifname
, strerror(errno
));
ofname
= path("Makefile");
if ((ofp
= fopen(ofname
, "w")) == NULL
) {
(void)fprintf(stderr
, "config: cannot write %s: %s\n",
ofname
, strerror(errno
));
while (fgets(line
, sizeof(line
), ifp
) != NULL
) {
if (fputs(line
, ofp
) < 0)
if (strcmp(line
, "%OBJS\n") == 0)
else if (strcmp(line
, "%CFILES\n") == 0)
else if (strcmp(line
, "%SFILES\n") == 0)
else if (strcmp(line
, "%RULES\n") == 0)
else if (strcmp(line
, "%LOAD\n") == 0)
"unknown %% construct ignored: %s", line
);
"config: error reading %s (at line %d): %s\n",
ifname
, lineno
, strerror(errno
));
/* (void)unlink(ofname); */
(void)fprintf(stderr
, "config: error writing %s: %s\n",
ofname
, strerror(errno
));
/* (void)unlink(ofname); */
register struct nvlist
*nv
;
if (fputs("IDENT=", fp
) < 0)
for (nv
= options
; nv
!= NULL
; nv
= nv
->nv_next
) {
if (fprintf(fp
, "%s-D%s%s%s", sp
, nv
->nv_name
,
nv
->nv_str
? "=" : "", nv
->nv_str
? nv
->nv_str
: "") < 0)
if (fprintf(fp
, "PARAM=-DMAXUSERS=%d\n", maxusers
) < 0)
for (nv
= mkoptions
; nv
!= NULL
; nv
= nv
->nv_next
)
if (fprintf(fp
, "%s=%s\n", nv
->nv_name
, nv
->nv_str
) < 0)
register struct files
*fi
;
register int lpos
, len
, sp
;
if (fputs("OBJS=", fp
) < 0)
for (fi
= allfiles
; fi
!= NULL
; fi
= fi
->fi_next
) {
if ((fi
->fi_flags
& FI_SEL
) == 0)
len
= strlen(fi
->fi_base
) + 2;
if (fputs(" \\\n", fp
) < 0)
if (fprintf(fp
, "%c%s.o", sp
, fi
->fi_base
) < 0)
if (lpos
!= 7 && putc('\n', fp
) < 0)
return (emitfiles(fp
, 'c'));
return (emitfiles(fp
, 's'));
register struct files
*fi
;
register struct config
*cf
;
register int lpos
, len
, sp
;
if (fprintf(fp
, "%cFILES=", toupper(suffix
)) < 0)
for (fi
= allfiles
; fi
!= NULL
; fi
= fi
->fi_next
) {
if ((fi
->fi_flags
& FI_SEL
) == 0)
len
= strlen(fi
->fi_path
);
if (fi
->fi_path
[len
- 1] != suffix
)
if (fputs(" \\\n", fp
) < 0)
if (fprintf(fp
, "%c%s%s", sp
, *fi
->fi_path
!= '/' ? "$S/" : "",
for (cf
= allcf
; cf
!= NULL
; cf
= cf
->cf_next
) {
(void)sprintf(swapname
, "$S/%s/%s/swapgeneric.c",
(void)sprintf(swapname
, "swap%s.c", cf
->cf_name
);
if (fputs(" \\\n", fp
) < 0)
if (fprintf(fp
, "%c%s", sp
, swapname
) < 0)
if (lpos
!= 7 && putc('\n', fp
) < 0)
register struct files
*fi
;
for (fi
= allfiles
; fi
!= NULL
; fi
= fi
->fi_next
) {
if ((fi
->fi_flags
& FI_SEL
) == 0)
if (fprintf(fp
, "%s.o: %s%s\n", fi
->fi_base
,
*fi
->fi_path
!= '/' ? "$S/" : "", fi
->fi_path
) < 0)
if ((cp
= fi
->fi_mkrule
) == NULL
) {
cp
= fi
->fi_flags
& FI_DRIVER
? "DRIVER" : "NORMAL";
(void)sprintf(buf
, "${%s_%c%s}", cp
, ch
,
fi
->fi_flags
& FI_CONFIGDEP
? "_C" : "");
if (fprintf(fp
, "\t%s\n\n", cp
) < 0)
* Emit the load commands.
* This function is not to be called `spurt'.
register struct config
*cf
;
register const char *nm
, *swname
;
if (fputs("all:", fp
) < 0)
for (cf
= allcf
; cf
!= NULL
; cf
= cf
->cf_next
) {
if (fprintf(fp
, " %s", cf
->cf_name
) < 0)
if (fputs("\n\n", fp
) < 0)
for (first
= 1, cf
= allcf
; cf
!= NULL
; cf
= cf
->cf_next
) {
swname
= cf
->cf_root
!= NULL
? cf
->cf_name
: "generic";
if (fprintf(fp
, "%s: ${SYSTEM_DEP} swap%s.o", nm
, swname
) < 0)
if (fputs(" newvers", fp
) < 0)
\t${SYSTEM_LD} swap%s.o\n\
swap%s.o: ", swname
, swname
) < 0)
if (cf
->cf_root
!= NULL
) {
if (fprintf(fp
, "swap%s.c\n", nm
) < 0)
if (fprintf(fp
, "$S/%s/%s/swapgeneric.c\n",
if (fputs("\t${NORMAL_C}\n\n", fp
) < 0)