定義 CMake 規則

前往 GitHub 查看原始碼

CMake 建構系統需要使用可定義建構目標的 CMakeLists.txt 檔案。存放區根目錄的 CMakeLists.txt 是建構樹狀結構的頂端,非常適合用來定義建構程序中使用的各種目標、選項和巨集。

第一個定義的值是專案名稱和支援的平台。

在這個範例中,我們將專案名稱設為 ot-efr32,版本是 0.0.1。我們也定義了變數 EFR32_PLATFORM_VALUES,也就是 ot-efr32 支援的 efr32 平台清單。為達到這個範例,我們已定義多個平台,但也允許使用單一平台做為 _PLATFORM_VALUES 變數。

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

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

CMakeLists.txt 檔案包含一個檢查,可取消版本針對不支援的平台啟動。

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()

下一個需要定義的變數為 OT_PLATFORM_LIB。OpenThread 範例應用程式會使用這個變數來連結到你的平台。

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

OpenThread CMake 選項

可透過定義 CMake 變數的方式,啟用/停用/設定 OpenThread 中的各種功能。

ot-efr32 平台會使用外部 mbedTLS 程式庫 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})

定義輸出目錄

您可以使用下列變數設定不同目標檔案的輸出目錄。

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)

將 OpenThread 新增至建構樹狀結構

如要在建構樹狀結構中加入 openthread 子模組:

add_subdirectory(openthread)

將建構屬性傳遞至 OpenThread

這個檔案的最後一部分可讓您定義建構屬性 (例如定義、選項及納入目錄),並建議您將這些屬性新增至 openthread 建構樹狀結構和平台程式庫。

想要新增這些定義,最簡單的方法是使用 ot-config 目標。這個目標是一個假目標,只用於定義設定,而且會由 openthread 中絕大多數的 CMake 目標建立連結。

# 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
)

將子目錄新增至建構樹狀結構

頂層設定已定義完畢,現在該將其他子目錄新增至建構樹狀結構。

src 資料夾是平台抽象層原始碼的所在位置。third_party 資料夾包含任何第三方程式碼。

如果您想在存放區中加入範例應用程式,請建立 examples 資料夾,並將其新增至建構樹狀結構。

add_subdirectory(src)
add_subdirectory(third_party)

# Optional
add_subdirectory(examples)

src 目錄

這是存放區的核心,也是實作平台抽象層的位置。也包含其他一些必要檔案。

src/arm-none-eabi.cmake

這是一個工具鍊檔案,定義 CMake 在建構程序中使用的部分變數。建議您先複製這個檔案的 ot-efr32 版本,再根據平台的需求進行修改。

src/CMakeLists.txt

您可以在此處定義平台程式庫的來源檔案、包含路徑和編譯器標記。這個檔案的例子是 ot-cc2538 中僅支援單一平台的存放區。

可以在單一存放區中支援多個平台,並可使用多個平台存放區做為參照。請參閱 ot-efr32ot-nrf528xx