22 Aug, 2018

3 commits

  • 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
    Tested-by: Dirk Gouders

    Masahiro Yamada
     
  • 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
    Tested-by: Dirk Gouders

    Masahiro Yamada
     
  • Originally, recursive dependency was a fatal error for Kconfig
    because Kconfig cannot compute symbol values in such a situation.

    Commit d595cea62403 ("kconfig: print more info when we see a recursive
    dependency") changed it to a warning, which I guess was not intentional.

    Get it back to an error again.

    Also, rename the unit test directory "warn_recursive_dep" to
    "err_recursive_dep" so that it matches to the behavior.

    Signed-off-by: Masahiro Yamada
    Tested-by: Dirk Gouders

    Masahiro Yamada
     

29 May, 2018

2 commits


26 Mar, 2018

11 commits

  • 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

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • Recursive dependency should be detected and warned. Test this.

    This indirectly tests the line number increments.

    Signed-off-by: Masahiro Yamada
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • 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
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada
     
  • Many parts in Kconfig are so cryptic and need refactoring. However,
    its complexity prevents us from moving forward. There are several
    naive corner cases where it is difficult to notice breakage. If
    those are covered by unit tests, we will be able to touch the code
    with more confidence.

    Here is a simple test framework based on pytest. The conftest.py
    provides a fixture useful to run commands such as 'oldaskconfig' etc.
    and to compare the resulted .config, stdout, stderr with expectations.

    How to add test cases?
    ----------------------

    For each test case, you should create a subdirectory under
    scripts/kconfig/tests/ (so test cases are separated from each other).
    Every test case directory should contain the following files:

    - __init__.py: describes test functions
    - Kconfig: the top level Kconfig file for the test

    To do a useful job, test cases generally need additional data like
    input .config and information about expected results.

    How to run tests?
    -----------------

    You need python3 and pytest. Then, run "make testconfig". O= option
    is supported. If V=1 is given, detailed logs captured during tests
    are displayed.

    Signed-off-by: Masahiro Yamada
    Reviewed-by: Ulf Magnusson

    Masahiro Yamada