svn commit: r185186 - head/usr.sbin/config

Andrew Thompson thompsa at FreeBSD.org
Sat Nov 22 13:12:48 PST 2008


Author: thompsa
Date: Sat Nov 22 21:12:47 2008
New Revision: 185186
URL: http://svn.freebsd.org/changeset/base/185186

Log:
  Allow multiple makeoption lines to be used with the += operator, this permits
  the following syntax in the kernel config.
  
   makeoptions MODULES_OVERRIDE=foo
   makeoptions MODULES_OVERRIDE+=bar
   makeoptions MODULES_OVERRIDE+=baz
  
  Bump config minor version to 600007.

Modified:
  head/usr.sbin/config/config.5
  head/usr.sbin/config/config.h
  head/usr.sbin/config/config.y
  head/usr.sbin/config/configvers.h
  head/usr.sbin/config/lang.l
  head/usr.sbin/config/mkmakefile.c

Modified: head/usr.sbin/config/config.5
==============================================================================
--- head/usr.sbin/config/config.5	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/config.5	Sat Nov 22 21:12:47 2008	(r185186)
@@ -231,6 +231,7 @@ specifications.
 Each option specification has the form
 .Pp
 .D1 Ar MakeVariableName Ns Op = Ns Ar Value
+.D1 Ar MakeVariableName Ns += Ns Ar Value
 .Pp
 and results in the appropriate
 .Xr make 1
@@ -243,7 +244,8 @@ is assumed to be the empty string.
 .Pp
 Example:
 .Bd -literal -offset indent -compact
-makeoptions MYMAKEOPTION="foobar"
+makeoptions MYMAKEOPTION="foo"
+makeoptions MYMAKEOPTION+="bar"
 makeoptions MYNULLMAKEOPTION
 .Ed
 .\" -------- MAXUSERS --------

Modified: head/usr.sbin/config/config.h
==============================================================================
--- head/usr.sbin/config/config.h	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/config.h	Sat Nov 22 21:12:47 2008	(r185186)
@@ -121,6 +121,7 @@ struct opt {
 	char	*op_value;
 	int	op_ownfile;	/* true = own file, false = makefile */
 	SLIST_ENTRY(opt) op_next;
+	SLIST_ENTRY(opt) op_append;
 };
 
 SLIST_HEAD(opt_head, opt) opt, mkopt, rmopts;

Modified: head/usr.sbin/config/config.y
==============================================================================
--- head/usr.sbin/config/config.y	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/config.y	Sat Nov 22 21:12:47 2008	(r185186)
@@ -13,6 +13,7 @@
 %token	NODEVICE
 %token	ENV
 %token	EQUALS
+%token	PLUSEQUALS
 %token	HINTS
 %token	IDENT
 %token	MAXUSERS
@@ -99,7 +100,7 @@ int yywrap(void);
 static void newdev(char *name);
 static void newfile(char *name);
 static void rmdev_schedule(struct device_head *dh, char *name);
-static void newopt(struct opt_head *list, char *name, char *value);
+static void newopt(struct opt_head *list, char *name, char *value, int append);
 static void rmopt_schedule(struct opt_head *list, char *name);
 
 static char *
@@ -211,7 +212,7 @@ System_spec:
 	  ;
 
 System_id:
-	Save_id { newopt(&mkopt, ns("KERNEL"), $1); };
+	Save_id { newopt(&mkopt, ns("KERNEL"), $1, 0); };
 
 System_parameter_list:
 	  System_parameter_list ID
@@ -226,13 +227,13 @@ Opt_list:
 
 Option:
 	Save_id {
-		newopt(&opt, $1, NULL);
+		newopt(&opt, $1, NULL, 0);
 		if (strchr($1, '=') != NULL)
 			errx(1, "%s:%d: The `=' in options should not be "
 			    "quoted", yyfile, yyline);
 	      } |
 	Save_id EQUALS Opt_value {
-		newopt(&opt, $1, $3);
+		newopt(&opt, $1, $3, 0);
 	      } ;
 
 Opt_value:
@@ -255,8 +256,9 @@ Mkopt_list:
 		;
 
 Mkoption:
-	Save_id { newopt(&mkopt, $1, ns("")); } |
-	Save_id EQUALS Opt_value { newopt(&mkopt, $1, $3); } ;
+	Save_id { newopt(&mkopt, $1, ns(""), 0); } |
+	Save_id EQUALS Opt_value { newopt(&mkopt, $1, $3, 0); } |
+	Save_id PLUSEQUALS Opt_value { newopt(&mkopt, $1, $3, 1); } ;
 
 Dev:
 	ID { $$ = $1; }
@@ -282,7 +284,7 @@ NoDev_list:
 
 Device:
 	Dev {
-		newopt(&opt, devopt($1), ns("1"));
+		newopt(&opt, devopt($1), ns("1"), 0);
 		/* and the device part */
 		newdev($1);
 		}
@@ -401,9 +403,9 @@ findopt(struct opt_head *list, char *nam
  * Add an option to the list of options.
  */
 static void
-newopt(struct opt_head *list, char *name, char *value)
+newopt(struct opt_head *list, char *name, char *value, int append)
 {
-	struct opt *op;
+	struct opt *op, *op2;
 
 	/*
 	 * Ignore inclusions listed explicitly for configuration files.
@@ -413,7 +415,8 @@ newopt(struct opt_head *list, char *name
 		return;
 	}
 
-	if (findopt(list, name)) {
+	op2 = findopt(list, name);
+	if (op2 != NULL && !append) {
 		printf("WARNING: duplicate option `%s' encountered.\n", name);
 		return;
 	}
@@ -422,7 +425,12 @@ newopt(struct opt_head *list, char *name
 	op->op_name = name;
 	op->op_ownfile = 0;
 	op->op_value = value;
-	SLIST_INSERT_HEAD(list, op, op_next);
+	if (op2 != NULL) {
+		while (SLIST_NEXT(op2, op_append) != NULL)
+			op2 = SLIST_NEXT(op2, op_append);
+		SLIST_NEXT(op2, op_append) = op;
+	} else
+		SLIST_INSERT_HEAD(list, op, op_next);
 }
 
 /*

Modified: head/usr.sbin/config/configvers.h
==============================================================================
--- head/usr.sbin/config/configvers.h	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/configvers.h	Sat Nov 22 21:12:47 2008	(r185186)
@@ -49,5 +49,5 @@
  *
  * $FreeBSD$
  */
-#define	CONFIGVERS	600006
+#define	CONFIGVERS	600007
 #define	MAJOR_VERS(x)	((x) / 100000)

Modified: head/usr.sbin/config/lang.l
==============================================================================
--- head/usr.sbin/config/lang.l	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/lang.l	Sat Nov 22 21:12:47 2008	(r185186)
@@ -156,6 +156,7 @@ PATH	[./][-/.%^A-Za-z_0-9]+
 ";"		{	return SEMICOLON;		}
 ","		{	return COMMA;			}
 "="		{	BEGIN TOEOL; return EQUALS;	}
+"+="		{	BEGIN TOEOL; return PLUSEQUALS;	}
 <<EOF>>		{
 			int tok;
 

Modified: head/usr.sbin/config/mkmakefile.c
==============================================================================
--- head/usr.sbin/config/mkmakefile.c	Sat Nov 22 21:08:25 2008	(r185185)
+++ head/usr.sbin/config/mkmakefile.c	Sat Nov 22 21:12:47 2008	(r185186)
@@ -110,7 +110,7 @@ makefile(void)
 {
 	FILE *ifp, *ofp;
 	char line[BUFSIZ];
-	struct opt *op;
+	struct opt *op, *t;
 	int versreq;
 
 	read_files();
@@ -127,8 +127,12 @@ makefile(void)
 	if (ofp == 0)
 		err(1, "%s", path("Makefile.new"));
 	fprintf(ofp, "KERN_IDENT=%s\n", ident);
-	SLIST_FOREACH(op, &mkopt, op_next)
-		fprintf(ofp, "%s=%s\n", op->op_name, op->op_value);
+	SLIST_FOREACH_SAFE(op, &mkopt, op_next, t) {
+		fprintf(ofp, "%s=%s", op->op_name, op->op_value);
+		while ((op = SLIST_NEXT(op, op_append)) != NULL)
+			fprintf(ofp, " %s", op->op_value);
+		fprintf(ofp, "\n");
+	}
 	if (debugging)
 		fprintf(ofp, "DEBUG=-g\n");
 	if (profiling)


More information about the svn-src-head mailing list