Kconfigってなんだ?
nRF Connect SDKを触り始めてしばらく経ちますが、Kconfigというものの存在がよく分かっていませんでした。中身を見てみるとprj.confで定義されているシンボルが記述されているのをよく見かけるわけですが
「はて、それだったら直接prj.confに書けばいいじゃん。なんでわざわざ別のKconfigとかいうのに書くわけ???」
とずっと思っていました。
ていうかKconfigってナニモノ?
確かに上記の理解は間違いではないのですが、厳密には正解というわけでもありません。標準で用意されているKconfigオプションというのは
ここで検索することはできますが、ここで検索できるオプションというのも全てKconfigで定義されたものです。具体的な例を見てみると、CONFIG_BT_SMPは以下の場所にあるKconfigで定義されています。
つまり
因果関係は逆であり、Kconfigで定義されているからprj.confで使うことができるという流れになります。
ということは・・・。
プロジェクト独自のオプションを定義できる
Kconfigが存在する最大の理由はこれです。いわゆるカスタムプロパティを定義することができます。標準で添付されているサンプルだとperipheral_uartなどでその記述を見ることができます。
#
# Copyright (c) 2018 Nordic Semiconductor
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
source "Kconfig.zephyr"
menu "Nordic UART BLE GATT service sample"
config BT_NUS_THREAD_STACK_SIZE
int "Thread stack size"
default 1024
help
Stack size used in each of the two threads
config BT_NUS_UART_BUFFER_SIZE
int "UART payload buffer element size"
default 40
help
Size of the payload buffer in each RX and TX FIFO element
config BT_NUS_SECURITY_ENABLED
bool "Enable security"
default y
select BT_SMP
help
"Enable BLE security for the UART service"
config BT_NUS_UART_DEV
string "UART device name"
default "UART_0"
help
Name of the used UART device. The sample uses uart0 by default.
The UART device should not be used as logger backend.
config BT_NUS_UART_RX_WAIT_TIME
int "Timeout for UART RX complete event"
default 50
help
Wait for RX complete event time in milliseconds
config BT_NUS_UART_ASYNC_ADAPTER
bool "Enable UART async adapter"
select SERIAL_SUPPORT_ASYNC
help
Enables asynchronous adapter for UART drives that supports only
IRQ interface.
endmenu
これらのうちのいくつかはmain.cにも出てくるんですよね。例えばこのあたりとかです。
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
#ifdef CONFIG_BT_NUS_SECURITY_ENABLED
.security_changed = security_changed,
#endif
};
ここで「はて、CONFIG_BT_NUS_SECURITY_ENABLEDってなんだっけか?」と思ってKconfigサイトで調べてみると・・・。
ヒットしないのです。
ふぁーーーーー?どういうことなの?なんでコンパイルエラーにならないの?って思いますよね。実はこのオプションは自身のプロジェクト内のKconfigで定義されているオプションであり、このプロジェクトにしか存在しないものなのです。
なぜこんなものがあるのか?
そうは言ったって別に自分が使うだけのものならそんなもんイラナイじゃん、というのは実際その通りです(笑)。ですので、まだ完全には理解できていないというのが正直なところです。
分かり次第、追記しようと思います。(色々とあっちこっち調べているので時間はかかりますが)