Definisci le regole CMake

Visualizza il codice sorgente su GitHub

Il sistema di compilazione CMake si basa su file CMakeLists.txt che definiscono le destinazioni per la build. CMakeLists.txt alla radice del repository è la parte superiore dell'albero di build ed è un buon punto di partenza per definire le varie destinazioni, opzioni e macro utilizzate nel processo di compilazione.

I primi valori da definire sono il nome del progetto e le piattaforme supportate.

In questo esempio, abbiamo impostato il nome del progetto su ot-efr32 con una versione di 0.0.1. Definiamo inoltre una variabile EFR32_PLATFORM_VALUES, ossia un elenco di piattaforme efr32 supportate da ot-efr32. Nell'ambito di questo esempio, abbiamo definito più piattaforme, ma è possibile avere un'unica piattaforma per la variabile _PLATFORM_VALUES.

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

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

Il file CMakeLists.txt include un controllo che interrompa le build avviate per le piattaforme non supportate.

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 variabile successiva da definire è OT_PLATFORM_LIB. Questa variabile viene utilizzata dalle applicazioni di esempio OpenThread per il collegamento alla tua piattaforma.

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

Opzioni CMake di OpenThread

È possibile attivare/disattivare/configurare varie funzionalità in OpenThread definendo le variabili CMake.

Sulla piattaforma ot-efr32 viene utilizzata una libreria mbedTLS esterna 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})

Definisci directory di output

La directory di output per diversi file di destinazione può essere configurata utilizzando le variabili riportate di seguito.

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)

Aggiungi OpenThread all'albero di build

Per includere il sottomodulo openthread nella struttura ad albero della build:

add_subdirectory(openthread)

Passare le proprietà della build a OpenThread

La sezione finale di questo file consente di definire le proprietà della build (ad esempio definizioni, opzioni e includere directory) che potresti voler aggiungere alla struttura di build di openthread e alle librerie della tua piattaforma.

Un modo pratico per aggiungere queste definizioni è utilizzare la destinazione ot-config. Questo target è un target fasullo utilizzato esclusivamente al fine di definire la configurazione e a cui è collegato quasi tutti i target CMake in 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
)

Aggiungi sottodirectory alla struttura di build

Ora che è stata definita la configurazione di primo livello, è il momento di aggiungere altre sottodirectory alla struttura di build.

La cartella src è la posizione in cui si trova il codice sorgente del livello di astrazione della piattaforma. La cartella third_party contiene codice di terze parti.

Se vuoi includere applicazioni di esempio nel repository, crea una cartella examples e aggiungila anche alla struttura di build.

add_subdirectory(src)
add_subdirectory(third_party)

# Optional
add_subdirectory(examples)

La directory src

Questa è la parte centrale del repository ed è qui che viene implementato il livello di astrazione della piattaforma. Contiene anche alcuni altri file necessari.

src/arm-none-eabi.cmake

Si tratta di un file Toolchain che definisce alcune variabili utilizzate da CMake nel processo di compilazione. Un buon punto di partenza è copiare la versione ot-efr32 di questo file e modificarla per adattarla alla tua piattaforma.

src/CMakeLists.txt

Qui puoi definire i file di origine, includere i percorsi e i flag del compilatore per la libreria della tua piattaforma. Un buon esempio di questo file per un repository che supporta una sola piattaforma è quello di ot-cc2538.

È possibile supportare più piattaforme in un unico repository e diversi repository di piattaforme possono essere utilizzati come riferimento. Vedi ot-efr32 e ot-nrf528xx.