سیستم ساخت 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 مراجعه کنید.