Cómo definir reglas de CMake

Ver el código fuente en GitHub

El sistema de compilación de CMake se basa en archivos CMakeLists.txt, que definen los objetivos de compilación. El elemento CMakeLists.txt en la raíz de tu repositorio es la parte superior del árbol de compilación y es un buen lugar para comenzar a definir los distintos destinos, opciones y macros que se usan en el proceso de compilación.

Los primeros valores que debes definir son el nombre del proyecto y las plataformas compatibles.

En este ejemplo, configuramos el nombre del proyecto como ot-efr32 con una versión de 0.0.1. También definimos una variable EFR32_PLATFORM_VALUES, que es una lista de plataformas efr32 compatibles con ot-efr32. A los fines de este ejemplo, definimos varias plataformas, pero también es adecuado tener una sola plataforma para la variable _PLATFORM_VALUES.

cmake_minimum_required(VERSION 3.10.2)
project(ot-efr32 VERSION 0.0.1)

set(EFR32_PLATFORM_VALUES
    "efr32mg1"
    "efr32mg12"
    "efr32mg13"
    "efr32mg21"
)

El archivo CMakeLists.txt incluye una verificación que anula las compilaciones iniciadas para plataformas no compatibles.

set_property(CACHE EFR32_PLATFORM PROPERTY STRINGS ${EFR32_PLATFORM_VALUES})
if(NOT EFR32_PLATFORM IN_LIST EFR32_PLATFORM_VALUES)
    message(FATAL_ERROR "Please select a supported platform: ${EFR32_PLATFORM_VALUES}")
endif()

La siguiente variable que se debe definir es OT_PLATFORM_LIB. Las aplicaciones de ejemplo de OpenThread usan esta variable para vincularla con tu plataforma.

set(OT_PLATFORM_LIB "openthread-${EFR32_PLATFORM}")

Opciones de CMake de OpenThread

Se pueden habilitar, inhabilitar o configurar varias funciones de OpenThread mediante la definición de variables de CMake.

En la plataforma ot-efr32, se usa una biblioteca mbedTLS externa silabs-mbedtls.

set(OT_BUILTIN_MBEDTLS_MANAGEMENT OFF CACHE BOOL "disable builtin mbedtls management" FORCE)
set(OT_EXTERNAL_MBEDTLS "silabs-mbedtls" CACHE STRING "use silabs mbedtls" FORCE)
set(OT_MBEDTLS ${OT_EXTERNAL_MBEDTLS})

Cómo definir directorios de salida

El directorio de salida para los diferentes archivos de destino se puede configurar usando las siguientes variables.

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)

Cómo agregar OpenThread al árbol de compilación

Para incluir el submódulo openthread en el árbol de compilación, haz lo siguiente:

add_subdirectory(openthread)

Cómo pasar propiedades de compilación a OpenThread

En la sección final de este archivo, puedes definir propiedades de compilación (como definiciones, opciones y directorios) que puedes agregar al árbol de compilación openthread y a las bibliotecas de tu plataforma.

Una forma conveniente de agregar estas definiciones es usar el destino ot-config. Este objetivo es un destino ficticio que se usa únicamente con el fin de definir la configuración y está vinculado por casi todos los destinos de CMake en openthread.

# Define config filename macros
target_compile_definitions(ot-config INTERFACE
    OPENTHREAD_CONFIG_FILE="openthread-core-efr32-config.h"
    OPENTHREAD_PROJECT_CORE_CONFIG_FILE="openthread-core-efr32-config.h"
    OPENTHREAD_CORE_CONFIG_PLATFORM_CHECK_FILE="openthread-core-efr32-config-check.h"
)

# Disable -Wshadow and -Wpedantic
target_compile_options(ot-config INTERFACE
    -Wno-shadow
    -Wno-pedantic
)

# Add platform dirs to "include" dirs
target_include_directories(ot-config INTERFACE
    ${PROJECT_SOURCE_DIR}/src/src
    ${PROJECT_SOURCE_DIR}/src/${EFR32_PLATFORM}
    ${PROJECT_SOURCE_DIR}/src/${EFR32_PLATFORM}/crypto
)

Cómo agregar subdirectorios al árbol de compilación

Ahora que se definió la configuración de nivel superior, es momento de agregar otros subdirectorios al árbol de compilación.

La carpeta src es donde se encuentra el código fuente de la capa de abstracción de la plataforma. La carpeta third_party contiene cualquier código de terceros.

Si quieres incluir aplicaciones de ejemplo en el repositorio, crea una carpeta examples y agrégala también al árbol de compilación.

add_subdirectory(src)
add_subdirectory(third_party)

# Optional
add_subdirectory(examples)

El directorio src

Este es el núcleo del repositorio y es donde se implementa la capa de abstracción de la plataforma. También contiene algunos otros archivos obligatorios.

src/arm-none-eabi.cmake

Se trata de un archivo de cadena de herramientas que define algunas variables que CMake usa en el proceso de compilación. Un buen punto de partida sería copiar la versión ot-efr32 de este archivo y modificarla para que se ajuste a tu plataforma.

src/CMakeLists.txt

Aquí es donde defines los archivos fuente, incluyes rutas de acceso y marcas de compilador para tu biblioteca de plataforma. Un buen ejemplo de este archivo para un repositorio que solo admite una plataforma es de ot-cc2538.

Es posible admitir varias plataformas en un solo repositorio y se pueden usar varios repositorios de plataforma como referencia. Consulta ot-efr32 y ot-nrf528xx.