Среда разработки ESP-IDF от компании Espressif [2] использует kconfiglib (расширение, основанное на Python [3]). Система Kconfig предоставляет механизм конфигурации проекта, запускаемый во время его компиляции. Kconfig основана на опциях нескольких типов: integer, string, boolean. Файлы Kconfig указывают зависимости между опциями, значения по умолчанию для опций, способ группирования опций друг с другом, и т. д. Полный список доступных функций Kconfig по ссылкам [4, 5].
[Меню конфигурации проекта]
Разработчики приложения могут открыть основанное на терминале build target меню командой idf.py menuconfig. Пример скриншота результата выполнения этой команды показан на рис. 1.
Рис. 1. Экран системы конфигурирования проекта на основе запуска команды idf.py menuconfig.
Удобная фича menuconfig: существует поиск нужных опций с помощью функции [/] Jump to symbol. Нажмите клавишу /, и станет доступен быстрый поиск по опциям.
После обновления сгенерированная конфигурация сохраняется в файле sdkconfig, который находится в корневой папке проекта. На основании sdkconfig процесс сборки приложения генерирует файл sdkconfig.h в папке build\config\, делая тем самым опции sdkconfig доступными для системы сборки и исходных файлов проекта.
[Использование sdkconfig.defaults]
В некоторых случаях, когда файл sdkconfig попадает под управление системы управления ревизиями проекта, может быть неудобным тот факт, что файл sdkconfig изменяется системой построения. Система сборки позволяет избежать этого путем использования файла sdkconfig.defaults. Этот файл никогда не будет трогать система сборки, и он может быть создан вручную или автоматически. Он может содержать все параметры, которые имеют значение для данного приложения и отличаются от параметров по умолчанию. Формат файла sdkconfig.defaults такой же, как и у файла sdkconfig. Файл sdkconfig.defaults можно создать вручную, если заполнить все измененные конфигурации. Иначе этот файл может быть сгенерирован автоматически путем запуска команды idf.py save-defconfig.
Когда файл sdkconfig.defaults создан, файл sdkconfig может быть удален и добавлен в список игнорирования системы управления ревизиями (т. е. в файл .gitignore для git). Сборка для цели (build targets) будет автоматически создавать файл sdkconfig, заполненный настройками из файла sdkconfig.defaults, и остальные настройки будут установлены в свои значения по умолчанию. Обратите внимание, что процесс сборки не переназначит настройки, которые уже есть в sdkconfig, значениями из sdkconfig.defaults. Для дополнительной информации см. [6].
[Правила форматирования Kconfig]
Стандартизованы следующие атрибуты файлов Kconfig (в ESP-IDF это файл Kconfig.projbuild проекта):
● В любом меню имена опций должны иметь совместимый префикс. В настоящее время длина префикса устанавливается как минимум из 3 символов. ● Стиль отступа - 4 символа, отступ создается пробелами (не табуляцией). Все дочерние элементы имеют отступ на 1 уровень глубже родительского. Например, menu делается с отступом в 0 символов, config внутри меню создается с отступом в 4, help внутри config отступает от начала строки на 8 символов, и текст для help отступает в свою очередь от края строки на 12 символов. ● В конце строк не допускаются пробелы. ● Максимальная длина опций установлена в 40 символов. ● Максимальная длина строк установлена в 120 символов.
Проверка формата. Предоставляется скрипт tools/check_kconfigs.py, чтобы можно было проверить корректность формата Kconfig. Этот чекер проверяет все файлы Kconfig и Kconfig.projbuild в директории ESP-IDF, и генерирует новый файл с суффиксом .new, где находятся некоторые рекомендации для исправления проблем (если таковые проблемы были обнаружены). Имейте в виду, что чекер не может корректировать все правила, и только разработчик отвечает за конечное исправление всех ошибок, чтобы тесты были успешно пройдены. Например, отступы будут скорректированы, если в них не было какого-нибудь сбивающего форматирования ранее, но чекер не сможет придумать общий префикс для опций внутри меню.
[Обеспечение обратной совместимости опций Kconfig]
Стандартные инструменты Kconfig игнорируют неизвестные опции в sdkconfig. Таким образом, если у разработчика есть пользовательские настройки для опций, которые переименованы в более новых релизах ESP-IDF, то эти настройки будут по-тихом проигнорированы. Чтобы избежать такой ситуации, были адаптированы несколько функций:
1. Скрипт confgen.py используется тулчейном для предварительной обработки файлов sdkconfig перед чтением каких-либо других файлов, например menuconfig. В результате настройки старых опций будут сохранены, и не будут игнорироваться.
2. Скрипт confgen.py рекурсивно ищет все файлы sdkconfig.rename в директории ESP-IDF, которые содержат старые и новые имена опций Kconfig. В файле sdkconfig старые опции будут заменены на новые. Переименования, которые должны отображаться только для одной цели (наименования модели процессора, target), могут быть помещены в специфичный для этой цели переименованный файл: sdkconfig.rename.TARGET, где TARGET это имя цели, например sdkconfig.rename.esp32s2.
3. Скрипт confgen.py делает постобработку файлов sdkconfig, и генерирует выходные файлы (sdkconfig.h, sdkconfig.cmake, auto.conf) путем добавления списка операторов совместимости, например значения старой опции, и устанавливает значение новой опции (после модификации). Это осуществляется таким образом, чтобы не порушить пользовательский код, в котором все еще могут использоваться старые опции.
4. Скрипт confgen.py автоматически генерирует обработку устаревших опций, и осуществляет их замену [7].
[Справочное руководство по опциям конфигурации]
Полный справочник по опциям см. в [1], здесь буду оставлять перевод документации только на те опции, которые меня заинтересовали в процессе работы.
[Ссылки]
1. ESP-IDF Project Configuration site:docs.espressif.com. 2. Установка среды разработки ESP-IDF для ESP32. 3. ulfalizer / Kconfiglib site:github.com. 4. kconfig-language site:kernel.org. 5. Kconfig extensions site:pypi.org. 6. Custom sdkconfig defaults site:docs.espressif.com. 7. Deprecated options and their replacements site:docs.espressif.com. |