Configurer l'environnement de compilation

Afficher la source sur GitHub

Pour promouvoir le développement libre et ouvert, OpenThread utilise CMake dans la chaîne d'outils de compilation. Actuellement, cette chaîne d'outils est nécessaire pour porter OpenThread vers une nouvelle plate-forme matérielle.

D'autres chaînes d'outils de compilation seront peut-être prises en charge à l'avenir, mais elles ne relèvent pas du champ d'application de ce guide de portage.

Créer un dépôt

La première étape consiste à configurer une nouvelle maison pour votre plate-forme matérielle. Dans ce guide, nous allons créer un dépôt nommé ot-efr32 qui contient la couche d'abstraction de la plate-forme, le SDK de la plate-forme matérielle et quelques scripts utiles.

Dans cet exemple, nous avons créé le dépôt SiliconLabs/ot-efr32 sur GitHub et l'avons cloné dans ~/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

Structure du dépôt

Pour assurer la cohérence avec les dépôts de plate-forme existants dans l'organisation GitHub OpenThread, vous pouvez structurer votre dépôt comme suit:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Dossier Description
examples Facultatif : exemples d'applications
openthread Dépôt openthread en tant que sous-module
script Scripts de compilation, de test et d'analyse lint
src Implémentation de la couche d'abstraction de la plate-forme
third_party Emplacement de toutes les sources tierces

Ajouter des sous-modules

L'étape suivante consiste à ajouter openthread et tous les autres dépôts requis en tant que sous-modules.

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.

Pour cet exemple, nous allons ajouter une version allégée du SDK Gecko de Silicon Labs en tant que sous-module dans 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.

Scripts

Pour faciliter les tâches courantes, vous pouvez créer des scripts dans le dossier script. Cela peut inclure des scripts pour des tâches telles que le démarrage, la compilation, l'exécution d'un linter de code et un script de test pour les vérifications de CI GitHub.

Vous trouverez ci-dessous quelques exemples de scripts standards pour la plupart des dépôts de plate-forme existants.

bootstrap

Ce script doit installer tous les outils et packages requis par votre plate-forme matérielle. Il doit également exécuter le script de démarrage de openthread pour s'assurer que l'utilisateur dispose de tout ce dont il a besoin pour compiler la pile OpenThread.

Pour obtenir un exemple, consultez le script d'amorçage dans ot-efr32.

build

Le script de compilation CMake doit permettre aux utilisateurs de compiler la pile OpenThread pour votre plate-forme. Si votre dépôt définit des exemples d'applications, ce script doit également les compiler. Ce script doit contenir les options de configuration système de base, y compris les définitions de macro spécifiques à la plate-forme.

Pour obtenir un exemple, consultez le script de compilation dans ot-efr32.

test

Un script de test peut être utile pour permettre aux utilisateurs de tester les modifications à l'aide des tests que vous avez définis. Il peut s'agir d'une tâche aussi simple que l'exécution de builds de validation ou aussi complexe que le lancement d'une suite de tests unitaires.

Dans ot-efr32, le script exécute simplement le script build pour chaque carte compatible sur chacune des plates-formes efr32.

Pour obtenir un exemple, consultez le script de test dans ot-efr32.

make-pretty

Pour assurer une cohérence de style, ce script doit mettre en forme le code, les scripts et les fichiers Markdown.

Vous pouvez définir ce script vous-même, mais il peut être plus simple d'utiliser le script make-pretty utilisé par les dépôts de plate-forme existants. Le script appelle les scripts de style de openthread et permet de garantir un style cohérent dans tous les dépôts OpenThread.

Configuration du script du lisseur

Le script GNU Linker décrit comment mapper toutes les sections des fichiers d'entrée (fichiers "objets" .o générés par la GNU Compiler Collection (GCC)) sur le fichier de sortie final (par exemple, .elf). Il détermine également l'emplacement de stockage de chaque segment d'un programme exécutable, ainsi que l'adresse d'entrée. Le script de l'éditeur de liens spécifique à la plate-forme est souvent fourni avec le BSP de la plate-forme.

Configurez l'outil ld pour qu'il pointe vers le script de l'éditeur de liens spécifique à la plate-forme à l'aide de target_link_libraries sur la cible CMake de votre plate-forme dans 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
)

Code de démarrage de la chaîne d'outils

Le code de démarrage de la chaîne d'outils est souvent fourni avec le BSP de la plate-forme. Ce code présente généralement les caractéristiques suivantes:

  1. Implémente la fonction d'entrée (Reset_Handler) du programme exécutable
  2. Définit la table des vecteurs d'interruption
  3. Initialise la pile et la mémoire tampon
  4. Copier la section .data de la mémoire non volatile vers la RAM
  5. Accéde à la fonction principale de l'application pour exécuter la logique de l'application

Le code de démarrage (code source C ou d'assemblage) doit être inclus dans la bibliothèque openthread-platform-name de votre plate-forme, sinon certaines variables clés utilisées dans le script du linker ne peuvent pas être correctement mises entre guillemets:

  • src/CMakeLists.txt

Exemple: startup-gcc.c dans ot-cc2538 - src/CMakeLists.txt

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