Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jan 2009 02:45:00 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r187075 - stable/7/usr.sbin/config
Message-ID:  <200901120245.n0C2j0ev045957@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Mon Jan 12 02:45:00 2009
New Revision: 187075
URL: http://svn.freebsd.org/changeset/base/187075

Log:
  MFC r185186
  
   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:
  stable/7/usr.sbin/config/   (props changed)
  stable/7/usr.sbin/config/config.5
  stable/7/usr.sbin/config/config.h
  stable/7/usr.sbin/config/config.y
  stable/7/usr.sbin/config/configvers.h
  stable/7/usr.sbin/config/lang.l
  stable/7/usr.sbin/config/mkmakefile.c

Modified: stable/7/usr.sbin/config/config.5
==============================================================================
--- stable/7/usr.sbin/config/config.5	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/config.5	Mon Jan 12 02:45:00 2009	(r187075)
@@ -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: stable/7/usr.sbin/config/config.h
==============================================================================
--- stable/7/usr.sbin/config/config.h	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/config.h	Mon Jan 12 02:45:00 2009	(r187075)
@@ -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: stable/7/usr.sbin/config/config.y
==============================================================================
--- stable/7/usr.sbin/config/config.y	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/config.y	Mon Jan 12 02:45:00 2009	(r187075)
@@ -13,6 +13,7 @@
 %token	NODEVICE
 %token	ENV
 %token	EQUALS
+%token	PLUSEQUALS
 %token	HINTS
 %token	IDENT
 %token	MAXUSERS
@@ -219,7 +220,7 @@ System_spec:
 
 System_id:
 	Save_id
-	      = { newopt(&mkopt, ns("KERNEL"), $1); };
+	      = { newopt(&mkopt, ns("KERNEL"), $1, 0); };
 
 System_parameter_list:
 	  System_parameter_list ID
@@ -235,14 +236,14 @@ 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:
@@ -269,9 +270,11 @@ Mkopt_list:
 
 Mkoption:
 	Save_id
-	      = { newopt(&mkopt, $1, ns("")); } |
+	      = { newopt(&mkopt, $1, ns(""), 0); } |
 	Save_id EQUALS Opt_value
-	      = { newopt(&mkopt, $1, $3); } ;
+	      = { newopt(&mkopt, $1, $3, 0); } |
+	Save_id PLUSEQUALS Opt_value
+	      = { newopt(&mkopt, $1, $3, 1); } ;
 
 Dev:
 	ID
@@ -299,7 +302,7 @@ NoDev_list:
 Device:
 	Dev
 	      = {
-		newopt(&opt, devopt($1), ns("1"));
+		newopt(&opt, devopt($1), ns("1"), 0);
 		/* and the device part */
 		newdev($1);
 		}
@@ -419,9 +422,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.
@@ -431,7 +434,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;
 	}
@@ -440,7 +444,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: stable/7/usr.sbin/config/configvers.h
==============================================================================
--- stable/7/usr.sbin/config/configvers.h	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/configvers.h	Mon Jan 12 02:45:00 2009	(r187075)
@@ -49,5 +49,5 @@
  *
  * $FreeBSD$
  */
-#define	CONFIGVERS	600006
+#define	CONFIGVERS	600007
 #define	MAJOR_VERS(x)	((x) / 100000)

Modified: stable/7/usr.sbin/config/lang.l
==============================================================================
--- stable/7/usr.sbin/config/lang.l	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/lang.l	Mon Jan 12 02:45:00 2009	(r187075)
@@ -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: stable/7/usr.sbin/config/mkmakefile.c
==============================================================================
--- stable/7/usr.sbin/config/mkmakefile.c	Mon Jan 12 02:44:23 2009	(r187074)
+++ stable/7/usr.sbin/config/mkmakefile.c	Mon Jan 12 02:45:00 2009	(r187075)
@@ -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)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901120245.n0C2j0ev045957>