قوانین CMake را تعریف کنید، قوانین CMake را تعریف کنید

مشاهده منبع در GitHub

سیستم ساخت CMake به فایل‌های CMakeLists.txt متکی است که اهداف ساخت را تعریف می‌کنند. CMakeLists.txt در ریشه مخزن شما، بالای درخت ساخت است و مکان خوبی برای شروع تعریف اهداف، گزینه‌ها و ماکروهای مختلف مورد استفاده در فرآیند ساخت است.

اولین مقادیری که باید تعریف شود، نام پروژه و پلتفرم های پشتیبانی شده است.

در این مثال، نام پروژه را با نسخه 0.0.1 روی ot-efr32 قرار دادیم. ما همچنین یک متغیر EFR32_PLATFORM_VALUES تعریف می کنیم که لیستی از پلتفرم های efr32 است که توسط ot-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

ویژگی های مختلف در OpenThread ممکن است با تعریف متغیرهای CMake فعال/غیرفعال/پیکربندی شوند.

در پلتفرم 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 است. این هدف یک هدف ساختگی است که صرفاً برای تعریف پیکربندی استفاده می شود و تقریباً توسط تمام اهداف CMake در 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
)

زیر شاخه ها را به درخت ساخت اضافه کنید

اکنون که پیکربندی سطح بالا تعریف شده است، وقت آن است که زیر شاخه های دیگری را به درخت ساخت اضافه کنید.

پوشه src جایی است که کد منبع لایه platform-abstraction در آن قرار دارد. پوشه 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-efr32 و ot-nrf528xx مراجعه کنید.