# Kconfig
Kconfig 是一種用於配置系統的語言,常見於 Linux kernel 和 ESP-IDF 等嵌入式開發框架中。
## Format
|📘 <span class="note">NOTE</span>|
|:---|
|同一個 `menu` 或 `choice` 區塊內的所有 `config` 名稱,應該要有一個共同的 prefix,長度至少要 3 個字母。|
|若有嵌套關係,不要求 prefix 疊加,但疊加是好習慣。|
## Keywords
### 📁 `menu`
```
menu "Example Configuration"
...
endmenu
```
- 定義一個 **選單**。
- 名稱提示:上例為 `"Example Configuration"`。
- 一個 `Kconfig` 內可以有多個 `menu`,且可嵌套。
### 🔀 `choice` / `endchoice`
```
choice BLINK_LED
prompt "Blink LED type"
default BLINK_LED_GPIO
...
endchoice
```
- 定義一組 **互斥選項**(只能選一個)。
- 一個 `choice` 由多個 `config` 組成。
- `prompt`:名稱提示。
- `default`:預設選項。
### ⚙️ `config`
```
config BLINK_LED_GPIO
bool "GPIO"
```
- 定義一個 **設定選項**。
- 名稱提示:上例為 `"GPIO"`。
- 型別:可為 `bool`、`int`、`string` ...
- 常見屬性
| 屬性 | 說明 |
|------|------|
| `bool` | 布林選項(開/關) |
| `int` | 整數輸入 |
| `string` | 字串輸入 |
| `prompt` | 選單顯示文字 |
| `default` | 預設值(可搭配條件) |
| `range` | 限制輸入範圍(僅適用於 `int`) |
| `depends on` | 設定條件依賴(僅在條件成立時顯示) |
| `help` | 說明文字,會顯示在說明欄位中 |
### 🧩 `orsource`
```
orsource "$IDF_PATH/examples/common_components/env_caps/$IDF_TARGET/Kconfig.env_caps"
```
- 導入其他 `Kconfig` 檔案內容。
- 常用於根據目標板子載入不同的配置。
## Options
### 🆘 `help`
```
config BLINK_GPIO
int "Blink GPIO number"
help
GPIO number (IOxx) to blink on and off the LED.
```
- 提供使用者**幫助文檔**。
### 🧷 `depends on`
```
choice BLINK_LED_STRIP_BACKEND
depends on BLINK_LED_STRIP
...
endchoice
```
- 只有當某個 config 被選中時,這個 choice 才會出現。
### 🧪 `if`
```
default BLINK_LED_STRIP_BACKEND_RMT if SOC_RMT_SUPPORTED
```
- 條件成立時才會使用。
## Example
### 🍔 漢堡店菜單
```
menu "Burger Menu"
menu "Main Course"
choice BURGER_TYPE
prompt "Choose your burger type"
default BURGER_TYPE_CLASSIC
help
Please choose your preferred type of burger.
config BURGER_TYPE_CLASSIC
bool "Classic Beef Burger"
config BURGER_TYPE_CHICKEN
bool "Crispy Chicken Burger"
config BURGER_TYPE_VEGGIE
bool "Garden Veggie Burger"
endchoice
config BURGER_EXTRA_CHEESE
bool "Add extra cheese"
default n
help
Add a slice of extra cheese to your burger.
config BURGER_ADD_BACON
bool "Add bacon"
default n
depends on !BURGER_TYPE_VEGGIE
help
Add crispy bacon strips to your burger (Not available for veggie burgers).
config BURGER_SPICY
bool "Add hot sauce"
default n
depends on BURGER_TYPE_CHICKEN || BURGER_TYPE_CLASSIC
help
Only available for meat-based burgers.
endmenu
menu "Combo Options"
config BURGER_SET_COMBO
bool "Upgrade to combo"
default y
help
Upgrade your meal to a combo with drink and fries.
menu "Drink Selection"
depends on BURGER_SET_COMBO
choice BURGER_DRINK_TYPE
prompt "Choose your drink"
default BURGER_DRINK_COKE
help
Choose a drink for your combo meal.
config BURGER_DRINK_COKE
bool "Coke"
config BURGER_DRINK_TEA
bool "Unsweetened Green Tea"
config BURGER_DRINK_JUICE
bool "Orange Juice"
endchoice
endmenu
config BURGER_INCLUDE_KETCHUP
bool "Include ketchup packets"
default y
depends on BURGER_SET_COMBO
config BURGER_INCLUDE_FRIES
bool "Include fries"
default y
depends on BURGER_SET_COMBO
endmenu
endmenu
```