Документация Zephyr рекомендует использовать пример-приложение в качестве отправной точки. Однако данный подход с использованием git неверен. Согласно файлу readme примера, его необходимо инициализировать с помощью запада:
west init -m https://github.com/zephyrproject-rtos/example-application --mr main my-workspace
Но это означает, что рабочее пространство будет иметь топологию T2, то есть весь исходный код Zephyr будет находиться внутри репозитория приложения. Это означает, что если я таким образом разработаю несколько приложений, весь исходный код Zephyr будет храниться на моем диске несколько раз.
Поэтому я хотел бы реализовать это приложение как отдельное приложение, т. е. исходный код Zephyr должен находиться в совершенно другом каталоге.
Просто бег
west build -b nucleo_wl55jc . --pristine
внутри клонированных результатов example-application
usage: west [-h] [-z ZEPHYR_BASE] [-v] [-V] <command> ...
west: unknown command "build"; do you need to run this inside a workspace?
Вам следует активировать зефирный венв,
source ~/zephyrproject/.venv/bin/activate
А также переменные среды zephyr необходимо определить, это можно сделать с помощью
source ~/zephyrproject/zephyr-env.sh
После долгих проб и ошибок я понял это сам.
Основная проблема заключается в создании приложения без топологии T2, т. е. с приложением, не являющимся корневым каталогом. Приложение по-прежнему будет «корнем» процесса сборки, но оно должно зависеть от других компонентов в репозитории примера приложения (в частности, от драйверов, файлов dts и привязок, определений платы), которые также должны быть собраны.
Для этого все, кроме приложения, должно находиться в собственном каталоге, который не является родительским для каталога приложения. Поэтому создайте каталог (например, с именем common
, но имя не имеет значения) внутри example-application
и переместите в него все, кроме каталога app
:
mkdir common
shopt -s extglob
mv ./!(.git|app|common) common
Поскольку папка common
уже содержит файл zephyr/module.yml
, это уже полноценный модуль Zephyr.
Отредактируйте app/CMakeLists.txt
и добавьте зависимость к этому модулю, используя EXTRA_ZEPHYR_MODULES
:
cmake_minimum_required(VERSION 3.13.1)
# This has to go before find_package!
list(APPEND EXTRA_ZEPHYR_MODULES
${CMAKE_CURRENT_SOURCE_DIR}/../common
)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
Если example-application
находится где-то в дереве исходного кода Zephyr, его можно построить напрямую с помощью west
. Если нет, то перед этим необходимо установить переменную среды ZEPHYR_BASE
:
ZEPHYR_BASE = "/home/me/zephyrproject/zephyr"
west build -b custom_plank app --pristine
Я уже это сделал, иначе команда
west
вообще не распознавалась бы.