Add "conditional appending makeoptions". Syntax is:

makeoptions selector FOO+=bar

"selector" may be anything used as a key in the selecttab, i.e. an option,
a "device" name, an "attach" name, a file system, etc.

Semantics: FOO+=bar when the selector is set.  For example, if you have:

makeoptions pickle CPPFLAGS+=-I${S}/picklesrc

then "options PICKLE" will cause "CPPFLAGS+=-I${S}/picklesrc" to be
added to the Makefile.

Suggested by Matt Thomas.
This commit is contained in:
thorpej 2004-06-04 07:28:26 +00:00
parent e33c2bb5d5
commit 2d9180a3cc
4 changed files with 48 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: defs.h,v 1.17 2004/06/04 04:38:27 thorpej Exp $ */
/* $NetBSD: defs.h,v 1.18 2004/06/04 07:28:26 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@ -360,6 +360,7 @@ struct nvlist *options; /* options */
struct nvlist *fsoptions; /* filesystems */
struct nvlist *mkoptions; /* makeoptions */
struct nvlist *appmkoptions; /* appending mkoptions */
struct hashtab *condmkopttab; /* conditional makeoption table */
struct hashtab *devbasetab; /* devbase lookup */
struct hashtab *devatab; /* devbase attachment lookup */
struct hashtab *devitab; /* device instance lookup */
@ -436,6 +437,7 @@ void addoption(const char *, const char *);
void addfsoption(const char *);
void addmkoption(const char *, const char *);
void appendmkoption(const char *, const char *);
void appendcondmkoption(const char *, const char *, const char *);
void deffilesystem(const char *, struct nvlist *);
void defoption(const char *, struct nvlist *, struct nvlist *);
void defflag(const char *, struct nvlist *, struct nvlist *);

View File

@ -1,5 +1,5 @@
%{
/* $NetBSD: gram.y,v 1.49 2004/06/04 04:38:27 thorpej Exp $ */
/* $NetBSD: gram.y,v 1.50 2004/06/04 07:28:26 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@ -480,7 +480,8 @@ mkopt_list:
mkoption:
WORD '=' value { addmkoption($1, $3); } |
WORD PLUSEQ value { appendmkoption($1, $3); };
WORD PLUSEQ value { appendmkoption($1, $3); } |
WORD WORD PLUSEQ value { appendcondmkoption($1, $2, $4); };
no_mkopt_list:
no_mkopt_list ',' no_mkoption |

View File

@ -1,4 +1,4 @@
/* $NetBSD: main.c,v 1.89 2004/06/04 04:38:27 thorpej Exp $ */
/* $NetBSD: main.c,v 1.90 2004/06/04 07:28:26 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@ -251,6 +251,7 @@ main(int argc, char **argv)
needcnttab = ht_new();
opttab = ht_new();
mkopttab = ht_new();
condmkopttab = ht_new();
fsopttab = ht_new();
deffstab = ht_new();
defopttab = ht_new();
@ -900,6 +901,27 @@ appendmkoption(const char *name, const char *value)
nextappmkopt = &nv->nv_next;
}
/*
* Add a conditional appending "make" option.
*/
void
appendcondmkoption(const char *selname, const char *name, const char *value)
{
struct nvlist *nv, *lnv;
const char *n;
n = strtolower(selname);
nv = newnv(name, value, NULL, 0, NULL);
if (ht_insert(condmkopttab, n, nv) == 0)
return;
if ((lnv = ht_lookup(condmkopttab, n)) == NULL)
panic("appendcondmkoption");
for (; lnv->nv_next != NULL; lnv = lnv->nv_next)
/* search for the last list element */;
lnv->nv_next = nv;
}
/*
* Add a name=value pair to an option list. The value may be NULL.
*/

View File

@ -1,4 +1,4 @@
/* $NetBSD: mkmakefile.c,v 1.60 2004/06/04 04:38:28 thorpej Exp $ */
/* $NetBSD: mkmakefile.c,v 1.61 2004/06/04 07:28:26 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@ -515,6 +515,22 @@ emitincludes(FILE *fp)
return (0);
}
static int
print_condmkopts(const char *name, void *value, void *arg)
{
struct nvlist *nv;
FILE *fp = arg;
if (ht_lookup(selecttab, name) == 0)
return (0);
for (nv = value; nv != NULL; nv = nv->nv_next)
if (fprintf(fp, "%s+=%s\n", nv->nv_name, nv->nv_str) < 0)
return (1);
return (0);
}
/*
* Emit appending makeoptions.
*/
@ -526,5 +542,6 @@ emitappmkoptions(FILE *fp)
for (nv = appmkoptions; nv != NULL; nv = nv->nv_next)
if (fprintf(fp, "%s+=%s\n", nv->nv_name, nv->nv_str) < 0)
return (1);
return (0);
return (ht_enumerate(condmkopttab, print_condmkopts, fp));
}