diff mbox series

[PATCHv3,next] kconfig: add dependency warning print about invalid values in verbose mode

Message ID 20240102020405.32701-1-sunying@isrc.iscas.ac.cn (mailing list archive)
State New
Headers show
Series [PATCHv3,next] kconfig: add dependency warning print about invalid values in verbose mode | expand

Commit Message

sunying@isrc.iscas.ac.cn Jan. 2, 2024, 2:04 a.m. UTC
From: Ying Sun <sunying@isrc.iscas.ac.cn>

Warning in verbose mode about incorrect causes and
 mismatch dependency of invalid values to help users correct them.

Detailed warning messages are printed only when the environment variable
 is set like "KCONFIG_WARN_CHANGED_INPUT=1".
By default, the current behavior is not changed.

Signed-off-by: Siyuan Guo <zy21df106@buaa.edu.cn>
Signed-off-by: Ying Sun <sunying@isrc.iscas.ac.cn>
---
v2 -> v3:
* Fixed warning message that mess up the ncurses display.
* Fixed memory leak where str_new() was called but str_free() was not used.
* Integrated the code to avoid excessive dispersion.
* Use the environment variable KCONFIG_WARN_CHANGED_INPUT as the switch

v1 -> v2:
* Reduced the number of code lines by refactoring and simplifying the logic.
* Changed the print "ERROR" to "WARNING".
* Focused on handling dependency errors: dir_dep and rev_dep, and range error.
  - A downgrade from 'y' to 'm' has be warned.
  - A new CONFIG option should not be warned.
  - Overwriting caused by default value is not an error and is no longer printed.
* Fixed style issues.
---
---
 scripts/kconfig/confdata.c | 76 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

Comments

Masahiro Yamada Feb. 10, 2024, 11:24 p.m. UTC | #1
"in verbose mode" is stale.

Please rephrase the subject.




On Tue, Jan 2, 2024 at 11:11 AM <sunying@isrc.iscas.ac.cn> wrote:
>
> From: Ying Sun <sunying@isrc.iscas.ac.cn>
>
> Warning in verbose mode about incorrect causes and
>  mismatch dependency of invalid values to help users correct them.

Same here, "verbose mode" does not exist in this patch.




>
> Detailed warning messages are printed only when the environment variable
>  is set like "KCONFIG_WARN_CHANGED_INPUT=1".
> By default, the current behavior is not changed.
>
> Signed-off-by: Siyuan Guo <zy21df106@buaa.edu.cn>
> Signed-off-by: Ying Sun <sunying@isrc.iscas.ac.cn>
> ---
> v2 -> v3:
> * Fixed warning message that mess up the ncurses display.
> * Fixed memory leak where str_new() was called but str_free() was not used.
> * Integrated the code to avoid excessive dispersion.
> * Use the environment variable KCONFIG_WARN_CHANGED_INPUT as the switch




This checker prints wrong reports.


I just attached one test case.



[test Kconfig]

config MODULES
       def_bool y
       modules

config FOO
       tristate "foo"
       depends on BAR

config BAR
       tristate "bar"

config BAZ
       tristate "baz"
       select FOO


[test .config]

CONFIG_FOO=m
# CONFIG_BAR is not set
CONFIG_BAZ=y



[test command]


$ KCONFIG_WARN_CHANGED_INPUT=1 make  olddefconfig



[result]


Kconfig:8:warning: 'MODULES' set to y due to option constraints


WARNING: unmet direct dependencies detected for FOO
  Depends on [n]: BAR [=n]
  Selected by [y]:
  - BAZ [=y]
Kconfig:12:warning: 'FOO' set to n for it unmet direct dependencies
 Depends on [n]: BAR [=n]



$ cat .config
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.8.0-rc3 Kernel Configuration
#
CONFIG_MODULES=y
CONFIG_FOO=y
# CONFIG_BAR is not set
CONFIG_BAZ=y







The first report

  Kconfig:8:warning: 'MODULES' set to y due to option constraints

should not be printed.

CONFIG options without prompt can be omitted.




The second report

  Kconfig:12:warning: 'FOO' set to n for it unmet direct dependencies

is completely wrong.



CONFIG_FOO was changed to 'y' due to the select.





One more thing,

Add
export KCONFIG_WARN_CHANGED_INPUT=1

to scripts/kconfig/Makefile




> v1 -> v2:
> * Reduced the number of code lines by refactoring and simplifying the logic.
> * Changed the print "ERROR" to "WARNING".
> * Focused on handling dependency errors: dir_dep and rev_dep, and range error.
>   - A downgrade from 'y' to 'm' has be warned.
>   - A new CONFIG option should not be warned.
>   - Overwriting caused by default value is not an error and is no longer printed.
> * Fixed style issues.
> ---
> ---
>  scripts/kconfig/confdata.c | 76 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 76 insertions(+)
>
> diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
> index f1197e672431..352774928558 100644
> --- a/scripts/kconfig/confdata.c
> +++ b/scripts/kconfig/confdata.c
> @@ -195,6 +195,52 @@ static void conf_message(const char *fmt, ...)
>         va_end(ap);
>  }
>
> +static void conf_warn_unmet_rev_dep(struct symbol *sym)
> +{
> +       struct gstr gs = str_new();
> +       char value = 'n';
> +
> +       switch (sym->curr.tri) {
> +       case no:
> +               value = 'n';
> +               break;
> +       case mod:
> +               sym_calc_value(modules_sym);
> +               value = (modules_sym->curr.tri == no) ? 'n' : 'm';
> +               break;
> +       case yes:
> +               value = 'y';
> +       }
> +
> +       str_printf(&gs,
> +               "'%s' set to %c for it is selected\n",
> +               sym->name, value);
> +       expr_gstr_print_revdep(sym->rev_dep.expr, &gs, yes,
> +                               " Selected by [y]:\n");
> +       expr_gstr_print_revdep(sym->rev_dep.expr, &gs, mod,
> +                               " Selected by [m]:\n");
> +
> +       conf_warning("%s", str_get(&gs));
> +       str_free(&gs);
> +}
> +
> +static void conf_warn_dep_error(struct symbol *sym)
> +{
> +       struct gstr gs = str_new();
> +
> +       str_printf(&gs,
> +               "'%s' set to n for it unmet direct dependencies\n",
> +               sym->name);
> +
> +       str_printf(&gs,
> +               " Depends on [%c]: ",
> +               sym->dir_dep.tri == mod ? 'm' : 'n');
> +       expr_gstr_print(sym->dir_dep.expr, &gs);
> +
> +       conf_warning("%s\n", str_get(&gs));
> +       str_free(&gs);
> +}
> +
>  const char *conf_get_configname(void)
>  {
>         char *name = getenv("KCONFIG_CONFIG");
> @@ -568,6 +614,36 @@ int conf_read(const char *name)
>                         continue;
>                 conf_unsaved++;
>                 /* maybe print value in verbose mode... */
> +               if (getenv("KCONFIG_WARN_CHANGED_INPUT") && (sym->prop)) {
> +                       conf_filename = sym->prop->file->name;
> +                       conf_lineno = sym->prop->menu->lineno;
> +
> +                       switch (sym->type) {
> +                       case S_BOOLEAN:
> +                       case S_TRISTATE:
> +                               if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) {
> +                                       if (sym->dir_dep.tri < sym->def[S_DEF_USER].tri)
> +                                               conf_warn_dep_error(sym);
> +                                       else if (sym->rev_dep.tri > sym->def[S_DEF_USER].tri)
> +                                               conf_warn_unmet_rev_dep(sym);
> +                                       else
> +                                               conf_warning("'%s' set to %s due to option constraints\n",
> +                                                       sym->name, sym_get_string_value(sym));
> +                               }
> +                               break;
> +                       case S_INT:
> +                       case S_HEX:
> +                       case S_STRING:
> +                               if (sym->dir_dep.tri == no && sym_has_value(sym))
> +                                       conf_warn_dep_error(sym);
> +                               else
> +                                       conf_warning("'%s' set to %s due to option constraints\n",
> +                                                       sym->name, sym_get_string_value(sym));
> +                               break;
> +                       default:
> +                               break;
> +                       }
> +               }
>         }
>
>         for_all_symbols(i, sym) {
> --
> 2.43.0
>
>


--
Best Regards


Masahiro Yamada
diff mbox series

Patch

diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index f1197e672431..352774928558 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -195,6 +195,52 @@  static void conf_message(const char *fmt, ...)
 	va_end(ap);
 }
 
+static void conf_warn_unmet_rev_dep(struct symbol *sym)
+{
+	struct gstr gs = str_new();
+	char value = 'n';
+
+	switch (sym->curr.tri) {
+	case no:
+		value = 'n';
+		break;
+	case mod:
+		sym_calc_value(modules_sym);
+		value = (modules_sym->curr.tri == no) ? 'n' : 'm';
+		break;
+	case yes:
+		value = 'y';
+	}
+
+	str_printf(&gs,
+		"'%s' set to %c for it is selected\n",
+		sym->name, value);
+	expr_gstr_print_revdep(sym->rev_dep.expr, &gs, yes,
+				" Selected by [y]:\n");
+	expr_gstr_print_revdep(sym->rev_dep.expr, &gs, mod,
+				" Selected by [m]:\n");
+
+	conf_warning("%s", str_get(&gs));
+	str_free(&gs);
+}
+
+static void conf_warn_dep_error(struct symbol *sym)
+{
+	struct gstr gs = str_new();
+
+	str_printf(&gs,
+		"'%s' set to n for it unmet direct dependencies\n",
+		sym->name);
+
+	str_printf(&gs,
+		" Depends on [%c]: ",
+		sym->dir_dep.tri == mod ? 'm' : 'n');
+	expr_gstr_print(sym->dir_dep.expr, &gs);
+
+	conf_warning("%s\n", str_get(&gs));
+	str_free(&gs);
+}
+
 const char *conf_get_configname(void)
 {
 	char *name = getenv("KCONFIG_CONFIG");
@@ -568,6 +614,36 @@  int conf_read(const char *name)
 			continue;
 		conf_unsaved++;
 		/* maybe print value in verbose mode... */
+		if (getenv("KCONFIG_WARN_CHANGED_INPUT") && (sym->prop)) {
+			conf_filename = sym->prop->file->name;
+			conf_lineno = sym->prop->menu->lineno;
+
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) {
+					if (sym->dir_dep.tri < sym->def[S_DEF_USER].tri)
+						conf_warn_dep_error(sym);
+					else if (sym->rev_dep.tri > sym->def[S_DEF_USER].tri)
+						conf_warn_unmet_rev_dep(sym);
+					else
+						conf_warning("'%s' set to %s due to option constraints\n",
+							sym->name, sym_get_string_value(sym));
+				}
+				break;
+			case S_INT:
+			case S_HEX:
+			case S_STRING:
+				if (sym->dir_dep.tri == no && sym_has_value(sym))
+					conf_warn_dep_error(sym);
+				else
+					conf_warning("'%s' set to %s due to option constraints\n",
+							sym->name, sym_get_string_value(sym));
+				break;
+			default:
+				break;
+			}
+		}
 	}
 
 	for_all_symbols(i, sym) {