-
Notifications
You must be signed in to change notification settings - Fork 161
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(menuconfig): allow choice override menuconfig #123
Closed
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Handle special cases when having a choice override with a menuconfig.
bors bot
added a commit
to RIOT-OS/RIOT
that referenced
this pull request
May 31, 2023
19086: Remodel the USB in Kconfig r=aabadie a=MrKevinWeiss ### Contribution description #### The issues with current architecture Generally there has been some confusion on how to manage KConfig with respect to the board selection of default STDIO backends, specifically for boards that require a USB based backend as there are possible stacks to use. The `<BOARD>.config` way of selecting cannot handle conditional selects. The issues is more with boards such as `esp32s2-wemos-mini`, currently some USB stack will be selected regardless of overridding the preferred STDIO. Selecting a USB stack directly with `STDIO_USB*` creates some circular dependency issues with kconfig and is hard to manage. We also have a mutually exclusive USB stacks, TINYUSB or USBUS which should probably be a choice. #### Desired behaviour 1. Ideally we want a board to default to the most obvious STDIO implementation, for example, if I have nucleo, it uses a UART, for some ESPs, USB is the default way to communicate. 2. These backends could always be overridden though, for example, I may just connect directly to a UART and want my STDIO there, or maybe use a ble based STDIO. 3. The next condition would be specifically for boards with a USB based STDIO. Since we have a TINYUSB stack and a USBUS stack we would want to use the associated STDIO depending on the stack the application selects. 4. However, if nothing is selected by the application, than bring in a USB stack (board based preference) unless there is a specific non-USB based STDIO is selected. For these boards that have this requirement, we DO NOT want to bring in the USB stack if the STDIO is specifically overridden (important for kconfig). #### Update kconfiglib package to RIOT-OS org managed one There is a problem with the upstreamed Kconfiglib implementation and the maintainer is not responsive to the fix. The issue is to do with `menuconfig`s in choices and has been fixed with the RIOT-OS based fork. This PR requires this fix. #### Changes to the USB stack A new entry point is introduced `USB_DEVICE` which indicates wanting a USB device but not caring which stack is used. This allows making a `choice` between the `TINYUSB` and `USBUS` stack allowing mutual exclusivity. Making the USB stack a `choice` means that a specific stack cannot be selected from non-board/non-cpu/non-application based symbols. Thus the `REQUIRES_` design pattern is used for a module to indicate a specific stack should be selected. This is needed for the `MODULE_TINYUSB_NETDEV` in this case. #### Changes to USB STDIO implementations The `MODULE_STDIO_CDC_ACM` and `MODULE_STDIO_TINYUSB_CDC_ACM` are both depends on now, using a `REQUIRES_USB_STDIO` to select the dependencies. This means we do not have to use `select PACKAGE_TINYUSB if TEST_KCONFIG && !MODULE_USBUS` in the board select. ##### Why not just select the USB from STDIO_USB Issue with using select for STDIO choices is that we cannot check which stack we are using to default the STDIO to that, breaking desired behaviour 3. #### The `FORCE_USB_STDIO` Desired behaviour 4 means that we do not want to bring in the USB stack if we override, say, to the UART STDIO backend. Due to the limitations of Kconfig, this is my solution to prevent the USB from being brought in if there is an STDIO that doesn't need it. It is only for the `esp32s2-wemos-mini` board and would not be used in other places and would only need to be explicitly disabled for applications requiring different STDIO backend and no USB. It is not perfect but I think the best solution and fairly understandable... <details><summary><h4>Issues with Kconfig</h4></summary> When using a `choice` and having conditional defaults, for example: ```kconfig choice IMPL default FOO if CHOOSE_FOO default BAR ``` there is a limitation of the level of the level of knowledge that can be expected from Kconfig, a limitation on circular dependencies, and a limitation that the dependencies only get resolved once. For example, if ` BAR` selects something that would eventually select `CHOOSE_FOO`, then the default should be `FOO` and which would no longer select `BAR` preventing the select `CHOOSE_FOO`... Messy stuff and we would want an error saying no no no. What Kconfig cannot handle is something like: ```kconfig choice IMPL bool "Implementation" default FOO if CHOOSE_FOO default BAR config FOO bool "Foo" config BAR bool "Bar" endchoice config CHOOSE_FOO bool config SYMBOL bool select CHOOSE_FOO if !BAR ``` `SYMBOL` causes a circular dependency in Kconfig even though the only possible outcome for the `choice` selection would be static. If we select `BAR` then `CHOOSE_FOO` would not be selected and we stay with `BAR`. If we select `FOO` than `CHOOSE_FOO` will be selected which stays with `FOO`. Everything should be fine, but isn't because Kconfig does not resolve to that degree, it simply sees that there is a dependency of the `IMPL` choice outcome (ie. `if !BAR`) that is a condition for a dependency of the `IMPL` choice selection (ie. ` if CHOOSE_FOO`). This is a limitation of the Kconfig what what makes this problem so challenging, with Make we say "select some sort of USB backend if no other stdio is specifically requested" and it will. </details> An attempt at remodelling the dependencies of the USB stack in Kconfig. Currently there are some issues, especially with the integration of TinyUSB package as a backend. This will require a kconfiglib package fix though... ### Testing procedure `TEST_KCONFIG=1 BOARD=reel make menuconfig -C examples/hello-world` ### Issues/PRs references Requires ulfalizer/Kconfiglib#123 to be merged upstream or fork for RIOT Relates maybe to #18998 and #19038 19672: pkg/micropython: model in Kconfig r=aabadie a=aabadie Co-authored-by: MrKevinWeiss <[email protected]> Co-authored-by: Alexandre Abadie <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hi 👋
I have encountered this issue when spending far too much time with kconfig and RIOT...
Handle special cases when having a choice override with a menuconfig.
This is a bit more complete solution to #94
The failure can be checked with:
Here is the failure and solution in action...