浏览代码

Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild

Pull kconfig update from Michal Marek:

 - fix for behavior of tristate choice items and fix for documentation
   of existing kconfig behavior [Dirk Gouders]

 - more helpful "unexpected data" kconfig warning [Paul Bolle]

* 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  kconfig/symbol.c: handle choice_values that depend on 'm' symbols
  kconfig-language: elaborate on the type of a choice
  kconfig-language: fix comment on dependency-generated menu structures.
  kconfig: add unexpected data itself to warning
Linus Torvalds 9 年之前
父节点
当前提交
f429d35588
共有 3 个文件被更改,包括 30 次插入10 次删除
  1. 13 9
      Documentation/kbuild/kconfig-language.txt
  2. 3 1
      scripts/kconfig/confdata.c
  3. 14 0
      scripts/kconfig/symbol.c

+ 13 - 9
Documentation/kbuild/kconfig-language.txt

@@ -241,9 +241,8 @@ comment "module support disabled"
 	depends on !MODULES
 	depends on !MODULES
 
 
 MODVERSIONS directly depends on MODULES, this means it's only visible if
 MODVERSIONS directly depends on MODULES, this means it's only visible if
-MODULES is different from 'n'. The comment on the other hand is always
-visible when MODULES is visible (the (empty) dependency of MODULES is
-also part of the comment dependencies).
+MODULES is different from 'n'. The comment on the other hand is only
+visible when MODULES is set to 'n'.
 
 
 
 
 Kconfig syntax
 Kconfig syntax
@@ -285,12 +284,17 @@ choices:
 	"endchoice"
 	"endchoice"
 
 
 This defines a choice group and accepts any of the above attributes as
 This defines a choice group and accepts any of the above attributes as
-options. A choice can only be of type bool or tristate, while a boolean
-choice only allows a single config entry to be selected, a tristate
-choice also allows any number of config entries to be set to 'm'. This
-can be used if multiple drivers for a single hardware exists and only a
-single driver can be compiled/loaded into the kernel, but all drivers
-can be compiled as modules.
+options. A choice can only be of type bool or tristate.  If no type is
+specified for a choice, it's type will be determined by the type of
+the first choice element in the group or remain unknown if none of the
+choice elements have a type specified, as well.
+
+While a boolean choice only allows a single config entry to be
+selected, a tristate choice also allows any number of config entries
+to be set to 'm'. This can be used if multiple drivers for a single
+hardware exists and only a single driver can be compiled/loaded into
+the kernel, but all drivers can be compiled as modules.
+
 A choice accepts another option "optional", which allows to set the
 A choice accepts another option "optional", which allows to set the
 choice to 'n' and no entry needs to be selected.
 choice to 'n' and no entry needs to be selected.
 If no [symbol] is associated with a choice, then you can not have multiple
 If no [symbol] is associated with a choice, then you can not have multiple

+ 3 - 1
scripts/kconfig/confdata.c

@@ -375,7 +375,9 @@ load:
 				continue;
 				continue;
 		} else {
 		} else {
 			if (line[0] != '\r' && line[0] != '\n')
 			if (line[0] != '\r' && line[0] != '\n')
-				conf_warning("unexpected data");
+				conf_warning("unexpected data: %.*s",
+					     (int)strcspn(line, "\r\n"), line);
+
 			continue;
 			continue;
 		}
 		}
 setsym:
 setsym:

+ 14 - 0
scripts/kconfig/symbol.c

@@ -209,12 +209,26 @@ static void sym_set_all_changed(void)
 static void sym_calc_visibility(struct symbol *sym)
 static void sym_calc_visibility(struct symbol *sym)
 {
 {
 	struct property *prop;
 	struct property *prop;
+	struct symbol *choice_sym = NULL;
 	tristate tri;
 	tristate tri;
 
 
 	/* any prompt visible? */
 	/* any prompt visible? */
 	tri = no;
 	tri = no;
+
+	if (sym_is_choice_value(sym))
+		choice_sym = prop_get_symbol(sym_get_choice_prop(sym));
+
 	for_all_prompts(sym, prop) {
 	for_all_prompts(sym, prop) {
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		/*
+		 * Tristate choice_values with visibility 'mod' are
+		 * not visible if the corresponding choice's value is
+		 * 'yes'.
+		 */
+		if (choice_sym && sym->type == S_TRISTATE &&
+		    prop->visible.tri == mod && choice_sym->curr.tri == yes)
+			prop->visible.tri = no;
+
 		tri = EXPR_OR(tri, prop->visible.tri);
 		tri = EXPR_OR(tri, prop->visible.tri);
 	}
 	}
 	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
 	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))