f498926c | 15-Aug-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: improve the recursive dependency report
This commit improves the messages of the recursive dependency. Currently, sym->dir_dep.expr is not checked. Hence, any dependency in property visibi
kconfig: improve the recursive dependency report
This commit improves the messages of the recursive dependency. Currently, sym->dir_dep.expr is not checked. Hence, any dependency in property visibility is regarded as the dependency of the symbol.
[Test Code 1]
config A bool "a" depends on B
config B bool "b" depends on A
[Test Code 2]
config A bool "a" if B
config B bool "b" depends on A
For both cases above, the same message is displayed:
symbol B depends on A symbol A depends on B
This commit changes the message for the latter, like this:
symbol B depends on A symbol A prompt is visible depending on B
Also, 'select' and 'imply' are distinguished.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Tested-by: Dirk Gouders <dirk@gouders.net>
show more ...
|
5e8c5299 | 15-Aug-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: report recursive dependency involving 'imply'
Currently, Kconfig does not complain about the recursive dependency where 'imply' keywords are involved.
[Test Code]
config A boo
kconfig: report recursive dependency involving 'imply'
Currently, Kconfig does not complain about the recursive dependency where 'imply' keywords are involved.
[Test Code]
config A bool "a"
config B bool "b" imply A depends on A
In the code above, Kconfig cannot calculate the symbol values correctly due to the circular dependency. For example, allyesconfig followed by syncconfig results in an odd behavior because CONFIG_B becomes visible in syncconfig.
$ make allyesconfig scripts/kconfig/conf --allyesconfig Kconfig # # configuration written to .config # $ cat .config # # Automatically generated file; DO NOT EDIT. # Main menu # CONFIG_A=y $ make syncconfig scripts/kconfig/conf --syncconfig Kconfig * * Restart config... * * * Main menu * a (A) [Y/n/?] y b (B) [N/y/?] (NEW)
To detect this correctly, sym_check_expr_deps() should recurse to not only sym->rev_dep.expr but also sym->implied.expr .
At this moment, sym_check_print_recursive() cannot distinguish 'select' and 'imply' since it does not know the precise context where the recursive dependency has been hit. This will be solved by the next commit.
In fact, even the document and the unit-test are confused. Using 'imply' does not solve recursive dependency since 'imply' addresses the unmet direct dependency, which 'select' could cause.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Tested-by: Dirk Gouders <dirk@gouders.net>
show more ...
|
32a94b8b | 22-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: remove duplicated file name and lineno of recursive inclusion
As in the unit test, the error message for the recursive inclusion looks like this:
Kconfig.inc1:4: recursive inclusion dete
kconfig: remove duplicated file name and lineno of recursive inclusion
As in the unit test, the error message for the recursive inclusion looks like this:
Kconfig.inc1:4: recursive inclusion detected. Inclusion path: current file : 'Kconfig.inc1' included from: 'Kconfig.inc3:1' included from: 'Kconfig.inc2:3' included from: 'Kconfig.inc1:4'
The 'Kconfig.inc1:4' is duplicated in the first and last lines. Also, the single quotes do not help readability.
Change the message like follows:
Recursive inclusion detected. Inclusion path: current file : Kconfig.inc1 included from: Kconfig.inc3:1 included from: Kconfig.inc2:3 included from: Kconfig.inc1:4
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
show more ...
|
e2c75e76 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: test if recursive inclusion is detected
If recursive inclusion is detected, it should fail with error messages. Test this.
This also tests the line numbers in the error message, fi
kconfig: tests: test if recursive inclusion is detected
If recursive inclusion is detected, it should fail with error messages. Test this.
This also tests the line numbers in the error message, fixed by commit 5ae6fcc4bb82 ("kconfig: fix line number in recursive inclusion error message").
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
3e4888c2 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: test randconfig for choice in choice
Commit 3b9a19e08960 ("kconfig: loop as long as we changed some symbols in randconfig") fixed randconfig where a choice contains a sub-choice. Pri
kconfig: tests: test randconfig for choice in choice
Commit 3b9a19e08960 ("kconfig: loop as long as we changed some symbols in randconfig") fixed randconfig where a choice contains a sub-choice. Prior to that commit, the sub-choice values were not set.
I am not sure whether this is an intended feature or just something people discovered works, but it is used in the real world; drivers/usb/gadget/legacy/Kconfig is source'd in a choice context, then creates a sub-choice in it.
For the test case in this commit, there are 3 possible results.
Case 1: CONFIG_A=y # CONFIG_B is not set
Case 2: # CONFIG_A is not set CONFIG_B=y CONFIG_C=y # CONFIG_D is not set
Case 3: # CONFIG_A is not set CONFIG_B=y # CONFIG_C is not set CONFIG_D=y CONFIG_E=y
So, this test iterates several times, and checks if the result is either of the three.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
beaaddb6 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: test defconfig when two choices interact
Commit fbe98bb9ed3d ("kconfig: Fix defconfig when one choice menu selects options that another choice menu depends on") fixed defconfig when
kconfig: tests: test defconfig when two choices interact
Commit fbe98bb9ed3d ("kconfig: Fix defconfig when one choice menu selects options that another choice menu depends on") fixed defconfig when two choices interact (i.e. calculating the visibility of a choice requires to calculate another choice).
The test code in that commit log was based on the real world example, and complicated. So, I shrunk it down to the following:
defconfig.choice: ---8<--- CONFIG_CHOICE_VAL0=y ---8<---
---8<--- config MODULES def_bool y option modules
choice prompt "Choice"
config CHOICE_VAL0 tristate "Choice 0"
config CHOICE_VAL1 tristate "Choice 1"
endchoice
choice prompt "Another choice" depends on CHOICE_VAL0
config DUMMY bool "dummy"
endchoice ---8<---
Prior to commit fbe98bb9ed3d,
$ scripts/kconfig/conf --defconfig=defconfig.choice Kconfig.choice
resulted in:
CONFIG_MODULES=y CONFIG_CHOICE_VAL0=m # CONFIG_CHOICE_VAL1 is not set CONFIG_DUMMY=y
where the expected result would be:
CONFIG_MODULES=y CONFIG_CHOICE_VAL0=y # CONFIG_CHOICE_VAL1 is not set CONFIG_DUMMY=y
Roughly, this weird behavior happened like this:
Symbols are calculated a couple of times. First, all symbols are calculated in conf_read(). The first 'choice' is evaluated to 'y' due to the SYMBOL_DEF_USER flag, but sym_calc_choice() clears it unless all of its choice values are explicitly set by the user.
conf_set_all_new_symbols() clears all SYMBOL_VALID flags. Then, only choices are calculated. Here, the SYMBOL_DEF_USER for the first choice has been forgotten, so it is evaluated to 'm'. set_all_choice_values() sets SYMBOL_DEF_USER again to choice symbols.
When calculating the second choice, due to 'depends on CHOICE_VAL0', it triggers the calculation of CHOICE_VAL0. As a result, SYMBOL_VALID is set for CHOICE_VAL0.
Symbols except choices get the final chance of re-calculation in conf_write(). In a normal case, CHOICE_VAL0 would be re-calculated, then the first choice would be indirectly re-calculated with the SYMBOL_DEF_USER which has been recalled by set_all_choice_values(), which would be evaluated to 'y'. But, in this case, CHOICE_VAL0 has already been marked as SYMBOL_VALID, so this re-calculation does not happen. Then, =m from the conf_set_all_new_symbols() phase is written out to the .config file.
Add a unit test for this naive case.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
ee236610 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: check visibility of tristate choice values in y choice
If tristate choice values depend on symbols set to 'm', they should be hidden when the choice containing them is changed from '
kconfig: tests: check visibility of tristate choice values in y choice
If tristate choice values depend on symbols set to 'm', they should be hidden when the choice containing them is changed from 'm' to 'y' (i.e. exclusive choice).
This issue was fixed by commit fa64e5f6a35e ("kconfig/symbol.c: handle choice_values that depend on 'm' symbols").
Add a test case to avoid regression.
For the input in this unit test, there is a room for argument if "# CONFIG_CHOICE1 is not set" should be written to the .config file.
After commit fa64e5f6a35e, this line was written to the .config file.
With commit cb67ab2cd2b8 ("kconfig: do not write choice values when their dependency becomes n"), it is not written now.
In this test, "# CONFIG_CHOICE1 is not set" is don't care.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
930c429a | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: check unneeded "is not set" with unmet dependency
Commit cb67ab2cd2b8 ("kconfig: do not write choice values when their dependency becomes n") fixed a problem where "# CONFIG_... is n
kconfig: tests: check unneeded "is not set" with unmet dependency
Commit cb67ab2cd2b8 ("kconfig: do not write choice values when their dependency becomes n") fixed a problem where "# CONFIG_... is not set" for choice values are wrongly written into the .config file when they are once visible, then become invisible later.
Add a test for this naive case.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
b76960c0 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: test if new symbols in choice are asked
If new choice values are added with new dependency, and they become visible during user configuration, oldconfig should recognize them as (NEW
kconfig: tests: test if new symbols in choice are asked
If new choice values are added with new dependency, and they become visible during user configuration, oldconfig should recognize them as (NEW), and ask the user for choice.
This issue was fixed by commit 5d09598d488f ("kconfig: fix new choices being skipped upon config update").
This is a subtle corner case. Add a test case to avoid breakage.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
49ac3c0c | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: test automatic submenu creation
If a symbols has dependency on the preceding symbol, the menu entry should become the submenu of the preceding one, and displayed with deeper indentat
kconfig: tests: test automatic submenu creation
If a symbols has dependency on the preceding symbol, the menu entry should become the submenu of the preceding one, and displayed with deeper indentation.
This is done by restructuring the menu tree in menu_finalize(). It is a bit complicated computation, so let's add a test case.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|
1903c511 | 13-Mar-2018 |
Masahiro Yamada <yamada.masahiro@socionext.com> |
kconfig: tests: add basic choice tests
The calculation of 'choice' is a bit complicated part in Kconfig.
The behavior of 'y' choice is intuitive. If choice values are tristate, the choice can be '
kconfig: tests: add basic choice tests
The calculation of 'choice' is a bit complicated part in Kconfig.
The behavior of 'y' choice is intuitive. If choice values are tristate, the choice can be 'm' where each value can be enabled independently. Also, if a choice is marked as 'optional', the whole choice can be invisible.
Test basic functionality of choice.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Ulf Magnusson <ulfalizer@gmail.com>
show more ...
|