Configurar o ambiente de build

Ver código-fonte no GitHub

Para promover o desenvolvimento livre e aberto, o OpenThread usa o CMake no conjunto de ferramentas de build. No momento, esse conjunto de ferramentas é necessário para portar o OpenThread para uma nova plataforma de hardware.

Outros toolchains de build podem receber suporte no futuro, mas não estão no escopo deste guia de portabilidade.

Criar um novo repositório

A primeira etapa é configurar um novo local para sua plataforma de hardware. Neste guia, vamos criar um novo repositório chamado ot-efr32, que contém a camada de abstração da plataforma, o SDK da plataforma de hardware e alguns scripts úteis.

Neste exemplo, criamos o repositório SiliconLabs/ot-efr32 no GitHub e o clonamos para ~/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

Estrutura do repositório

Para manter a consistência com os repositórios de plataforma existentes na organização do GitHub do OpenThread, estruturamos o repositório da seguinte forma:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Pasta Descrição
examples Exemplos de aplicativos opcionais
openthread O repositório openthread como um submódulo
script Scripts para criação, teste e linting
src Implementação da camada de abstração da plataforma
third_party Local de qualquer origem de terceiros

Adicionar submódulos

A próxima etapa é adicionar openthread e todos os outros repositórios necessários como submódulos.

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.

Neste exemplo, vamos adicionar uma versão Lite do SDK do Gecko da Silicon Labs como um submódulo em 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

Para facilitar tarefas comuns, crie alguns scripts na pasta script. Isso pode incluir scripts para tarefas como inicialização, criação, execução de um lint de código e um script de teste para verificações de CI do GitHub.

Confira abaixo alguns exemplos de scripts padrão para a maioria dos repositórios de plataforma.

bootstrap

Esse script precisa instalar todas as ferramentas e pacotes necessários para a plataforma de hardware. Ele também precisa executar o script de inicialização do openthread para garantir que o usuário tenha tudo o que precisa para criar a pilha do OpenThread.

Consulte o script de inicialização em ot-efr32 para conferir um exemplo.

build

O script de build do CMake precisa permitir que os usuários criem a pilha do OpenThread para sua plataforma. Se o repositório definir exemplos de aplicativos, esse script também vai criá-los. Esse script precisa conter as opções básicas de configuração do sistema, incluindo todas as definições de macro específicas da plataforma.

Consulte o script de build em ot-efr32 para conferir um exemplo.

test

Um script de teste pode ser útil para os usuários testarem as mudanças usando os testes que você definiu. Pode ser algo tão simples quanto executar builds de verificação de sanidade ou tão complicado quanto iniciar um pacote de testes de unidade.

Em ot-efr32, o script simplesmente executa o script build para cada placa com suporte em cada uma das plataformas efr32.

Consulte o script de teste em ot-efr32 para conferir um exemplo.

make-pretty

Para manter o estilo consistente, esse script precisa formatar códigos, scripts e arquivos Markdown.

Você pode definir esse script, mas talvez seja mais fácil usar o script make-pretty que os repositórios de plataforma atuais estão usando. O script chama os scripts de estilo do openthread e ajuda a garantir um estilo consistente em todos os repositórios do OpenThread.

Configuração do script do vinculador

O script do GNU Linker descreve como mapear todas as seções nos arquivos de entrada (arquivos .o "objeto" gerados pela coleção de compiladores GNU (GCC)) para o arquivo de saída final (por exemplo, .elf). Ele também determina o local de armazenamento de cada segmento de um programa executável, bem como o endereço de entrada. O script do vinculador específico da plataforma geralmente é fornecido com o BSP da plataforma.

Configure a ferramenta ld para apontar para o script de vinculação específico da plataforma usando target_link_libraries no destino do CMake da plataforma em 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
)

Código de inicialização da cadeia de ferramentas

O código de inicialização do Toolchain geralmente é fornecido com o BSP da plataforma. Esse código normalmente:

  1. Implementa a função de entrada (Reset_Handler) do programa executável
  2. Define a tabela de vetor de interrupção
  3. Inicializa a pilha e a pilha
  4. Copia a seção .data da memória não volátil para a RAM
  5. Vai para a função principal do aplicativo para executar a lógica do aplicativo

O código de inicialização (código-fonte C ou assembly) precisa ser incluído na biblioteca openthread-platform-name da plataforma. Caso contrário, algumas variáveis-chave usadas no script do vinculador não poderão ser citadas corretamente:

  • src/CMakeLists.txt

Exemplo: startup-gcc.c em ot-cc2538 - src/CMakeLists.txt

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