Настройка среды сборки

Посмотреть исходный код на GitHub

Чтобы продвигать бесплатную и открытую разработку, OpenThread использует CMake в цепочке инструментов сборки. В настоящее время этот набор инструментов необходим для переноса OpenThread на новую аппаратную платформу.

В будущем могут поддерживаться и другие наборы инструментов сборки, но они не входят в сферу применения данного руководства по переносу.

Создать новый репозиторий

Первым шагом является настройка нового дома для вашей аппаратной платформы. В этом руководстве мы создадим новый репозиторий с именем ot-efr32 , который будет содержать уровень абстракции платформы, SDK аппаратной платформы и несколько полезных скриптов.

В этом примере мы создали репозиторий SiliconLabs/ot-efr32 на GitHub и клонировали его в ~/repos/ot-efr32 .

mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning into 'ot-efr32'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234
Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done.
Resolving deltas: 100% (194/194), done.
git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

Структура репозитория

Чтобы обеспечить согласованность с существующими репозиториями платформы в организации OpenThread GitHub, вы можете структурировать свой репозиторий следующим образом:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Папка Описание
examples дополнительные примеры приложений
openthread Репозиторий openthread как подмодуль
script Скрипты для сборки, тестирования, линтинга
src Реализация уровня абстракции платформы
third_party Расположение любых сторонних источников

Добавить подмодули

Следующим шагом будет добавление openthread и любых других необходимых репозиториев в качестве подмодулей.

git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.

В этом примере мы добавим облегченную версию Silicon Labs Gecko SDK в качестве подмодуля в third_party .

cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning into '/home/user/repos/ot-efr32/third_party/sdk_support'...
remote: Enumerating objects: 32867, done.
remote: Counting objects: 100% (8181/8181), done.
remote: Compressing objects: 100% (3098/3098), done.
remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686
Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done.
Resolving deltas: 100% (19797/19797), done.

Скрипты

Чтобы упростить выполнение общих задач, вы можете создать несколько сценариев в папке script . Сюда могут входить сценарии для таких задач, как загрузка, сборка, запуск линтера кода, а также тестовый сценарий для проверок GitHub CI.

Ниже приведены примеры скриптов, которые являются стандартными для большинства существующих репозиториев платформы.

bootstrap

Этот скрипт должен установить все инструменты и пакеты, необходимые вашей аппаратной платформе. Он также должен выполнить сценарий начальной загрузки openthread , чтобы гарантировать, что у пользователя есть все необходимое для построения стека OpenThread.

См. пример сценария начальной загрузки в ot-efr32 .

build

Сценарий сборки CMake должен позволять пользователям создавать стек OpenThread для вашей платформы. Если в вашем репозитории определены какие-либо примеры приложений, этот сценарий также должен их создать. Этот сценарий должен содержать основные параметры конфигурации системы, включая любые определения макросов для конкретной платформы.

Пример см. в сценарии сборки в ot-efr32 .

test

Тестовый сценарий может быть полезен пользователям для проверки изменений с помощью любых определенных вами тестов. Это может быть что угодно: простое выполнение сборок для проверки работоспособности или такое же сложное, как запуск набора модульных тестов.

В ot-efr32 сценарий просто выполняет сценарий build для каждой поддерживаемой платы на каждой из платформ efr32.

Пример см. в тестовом сценарии в ot-efr32 .

make-pretty

Для обеспечения единообразия стиля этот сценарий должен форматировать код, сценарии и файлы уценки.

Вы можете определить этот сценарий самостоятельно, но, возможно, проще всего использовать сценарий make-pretty , который используют существующие репозитории платформы. Скрипт вызывает сценарии стиля openthread и помогает обеспечить единообразный стиль во всех репозиториях OpenThread.

Конфигурация скрипта компоновщика

Сценарий GNU Linker описывает, как сопоставить все разделы входных файлов ( .o «объектных» файлов, созданных коллекцией компиляторов GNU (GCC)) с конечным выходным файлом (например, .elf ). Он также определяет место хранения каждого сегмента исполняемой программы, а также адрес входа. Сценарий компоновщика, специфичный для платформы, часто предоставляется вместе с BSP платформы.

Настройте инструмент ld так, чтобы он указывал на сценарий компоновщика для конкретной платформы, используя target_link_libraries в цели CMake вашей платформы в src/CMakeLists.txt :

set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")

target_link_libraries(openthread-efr32mg12
    PRIVATE
        ot-config
    PUBLIC
        -T${LD_FILE}
        -Wl,--gc-sections -Wl,-Map=$.map
)

Код запуска цепочки инструментов

Код запуска Toolchain часто предоставляется вместе с BSP платформы. Обычно этот код:

  1. Реализует функцию входа ( Reset_Handler ) исполняемой программы.
  2. Определяет таблицу векторов прерываний
  3. Инициализирует кучу и стек
  4. Копирует раздел .data из энергонезависимой памяти в оперативную память.
  5. Переход к основной функции приложения для выполнения логики приложения.

Код запуска (исходный код C или ассемблера) должен быть включен в библиотеку openthread- platform-name вашей платформы, в противном случае некоторые ключевые переменные, используемые в скрипте компоновщика, не могут быть правильно заключены в кавычки:

  • src/CMakeLists.txt

Пример : startup-gcc.c в ot-cc2538src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)