Cómo configurar el entorno de compilación

Ver código fuente en GitHub

Para promover el desarrollo libre y abierto, OpenThread usa CMake en la cadena de herramientas de compilación. Actualmente, esta cadena de herramientas es necesaria para trasladar OpenThread a una plataforma de hardware nueva.

Es posible que otras cadenas de herramientas de compilación se admitan en el futuro, pero no están dentro del alcance de esta guía de portabilidad.

Crea un repositorio nuevo

El primer paso es configurar una casa nueva para tu plataforma de hardware. En esta guía, crearemos un repositorio nuevo llamado ot-efr32 que contiene la capa de abstracción de plataformas, el SDK de la plataforma de hardware y algunas secuencias de comandos útiles.

En este ejemplo, creamos el repositorio SiliconLabs/ot-efr32 en GitHub y lo clonamos en ~/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

Estructura del repositorio

Para ayudar a mantener la coherencia con los repositorios existentes de la plataforma en la organización de GitHub de OpenThread, te recomendamos que estructures tu repositorio de la siguiente manera:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
Carpeta Descripción
examples Aplicaciones de ejemplo opcional
openthread El repositorio openthread como submódulo
script Secuencias de comandos para compilar, probar y analizar con lint
src Implementación de la capa de abstracción de la plataforma
third_party Ubicación de cualquier fuente de terceros

Agregar submódulos

El siguiente paso es agregar openthread y cualquier otro repositorio obligatorio 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.

En este ejemplo, agregaremos una versión básica del SDK de Silicon Labs Gecko como submódulo en 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.

Secuencias de comandos

Para facilitar las tareas comunes, te recomendamos crear algunas secuencias de comandos en la carpeta script. Esto puede incluir secuencias de comandos para tareas como arranque, compilación, ejecución de código y una secuencia de comandos de prueba para las verificaciones de CI de GitHub.

A continuación, se muestran algunos ejemplos de secuencias de comandos que son estándar para la mayoría de los repositorios de plataforma existentes.

bootstrap

Esta secuencia de comandos debe instalar todas las herramientas y paquetes que requiere tu plataforma de hardware. También debe ejecutar la secuencia de comandos bootstrap de openthread a fin de asegurarse de que el usuario tenga todo lo necesario para compilar la pila de OpenThread.

Consulta la secuencia de comandos de arranque en ot-efr32 para ver un ejemplo.

build

La secuencia de comandos de compilación CMake debe permitir a los usuarios compilar la pila de OpenThread para tu plataforma. Si tu repositorio define cualquier aplicación de ejemplo, esta secuencia de comandos también debe compilarlas. Esta secuencia de comandos debe contener las opciones básicas de configuración del sistema, incluidas las definiciones de macros específicas de la plataforma.

Consulta la secuencia de comandos de compilación en ot-efr32 para ver un ejemplo.

test

Una secuencia de comandos de prueba puede ser útil para que los usuarios prueben los cambios con cualquier prueba que hayas definido. Esto puede ser tan simple como ejecutar compilaciones de verificación de estado o tan complicada como iniciar un paquete de prueba de unidades.

En ot-efr32, la secuencia de comandos simplemente ejecuta la secuencia de comandos build para cada placa compatible en cada una de las plataformas efr32.

Consulta la secuencia de comandos de prueba en ot-efr32 para ver un ejemplo.

make-pretty

Para mantener un estilo coherente, esta secuencia de comandos debe formatear el código, las secuencias de comandos y los archivos de Markdown.

Puedes definir esta secuencia de comandos por tu cuenta, pero es más fácil usar la secuencia de comandos make-pretty que usan los repositorios de plataforma existentes. La secuencia de comandos llama a las secuencias de comandos de estilo de openthread y ayuda a garantizar un estilo coherente en todos los repositorios de OpenThread.

Configuración de la secuencia de comandos del vinculador

La secuencia de comandos GNU Linker describe cómo asignar todas las secciones de los archivos de entrada (archivos "objeto" .o) que genera la Colección de compiladores de GNU (GCC) al archivo de salida final (por ejemplo, .elf). También determina la ubicación de almacenamiento de cada segmento de un programa ejecutable, así como la dirección de entrada. A menudo, la secuencia de comandos del vinculador específica de la plataforma se proporciona con el BSP de la plataforma.

Configura la herramienta de ld para que apunte a la secuencia de comandos del vinculador específica de la plataforma mediante target_link_libraries en el destino de CMake de tu plataforma en 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 inicio de la cadena de herramientas

A menudo, se proporciona el código de inicio de la cadena de herramientas junto con el BSP de la plataforma. Por lo general, este código:

  1. Implementa la función de entrada (Reset_Handler) del programa ejecutable.
  2. Define la tabla de vectores de interrupción
  3. Inicializa el montón y la pila.
  4. Copia la sección .data de la memoria no volátil a la RAM.
  5. Salta a la función principal de la aplicación para ejecutar la lógica de la aplicación.

El código de inicio (C o código fuente de ensamblado) debe estar incluido en la biblioteca openthread-platform-name de tu plataforma; de lo contrario, algunas variables clave que se usan en la secuencia de comandos del vinculador no se pueden citar correctamente:

  • src/CMakeLists.txt

Ejemplo: startup-gcc.c en ot-cc2538 - src/CMakeLists.txt

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