הגדרה של כללי CMake

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

הצגת המקור ב-GitHub

מערכת CMake Build מסתמכת על CMakeLists.txt קבצים שמגדירים יעדים ל-build. החלק CMakeLists.txt בבסיס המאגר הוא החלק העליון של עץ ה-build, והוא מקום טוב להתחיל להגדיר את היעדים, האפשרויות והפקודות המאקרו השונים שמשתמשים בהם בתהליך ה-build.

הערכים הראשונים להגדרה הם שם הפרויקט והפלטפורמות הנתמכות.

בדוגמה הזו, הגדרנו את שם הפרויקט כ-ot-efr32 בגרסה 0.0.1. אנחנו מגדירים גם משתנה 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 לעץ ה-build

כדי לכלול את מודול המשנה openthread בעץ ה-build:

add_subdirectory(openthread)

העברת מאפייני build אל OpenThread

בקטע האחרון בקובץ אפשר להגדיר מאפייני build (כמו הגדרות, אפשרויות ולכלול ספריות), שמומלץ להוסיף לעץ של 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
)

הוספת ספריות משנה לעץ ה-build

כעת, לאחר שהתצורה ברמה העליונה מוגדרת, הגיע הזמן להוסיף ספריות משנה נוספות לעץ ה-build.

התיקייה src היא המקום שבו שוכן קוד המקור של שכבת הפלטפורמה. התיקייה third_party מכילה קוד של צד שלישי.

אם רוצים לכלול אפליקציות לדוגמה בחנות, יוצרים תיקייה examples ומוסיפים אותה גם לעץ ה-build.

add_subdirectory(src)
add_subdirectory(third_party)

# Optional
add_subdirectory(examples)

הספרייה של src

זהו לב המאגר, וכאן מיושמת שכבת הפשטת הפלטפורמה. כמו כן, הקובץ מכיל מספר קבצים נדרשים נוספים.

src/arm-none-eabi.cmake

זהו קובץ Toolchain שמגדיר כמה משתנים ש-CMake משתמש בהם בתהליך הבנייה. נקודת התחלה טובה היא להעתיק את גרסת ot-efr32 של הקובץ הזה ולשנות אותה בהתאם לפלטפורמה שלכם.

src/CMakeLists.txt

כאן אתם מגדירים את קובצי המקור, כוללים נתיבים וסמלי ההידור של ספריית הפלטפורמה שלכם. דוגמה טובה לקובץ זה עבור מאגר שתומך בפלטפורמה אחת בלבד היא מהאתר ot-cc2538.

קיימת תמיכה עבור פלטפורמות מרובות במאגר יחיד, וניתן להשתמש בכמה מאגרי פלטפורמות כחומר עזר. פרטים נוספים זמינים בכתובת ot-efr32 ובכתובת ot-nrf528xx.