CMake 규칙 정의

GitHub에서 소스 보기

CMake 빌드 시스템은 빌드 타겟을 정의하는 CMakeLists.txt 파일을 사용합니다. 저장소 루트의 CMakeLists.txt는 빌드 트리의 맨 꼭대기이며 빌드 프로세스에 사용되는 다양한 타겟, 옵션, 매크로를 정의하기에 좋은 위치입니다.

가장 먼저 정의해야 하는 값은 프로젝트 이름과 지원되는 플랫폼입니다.

이 예에서는 프로젝트 이름을 ot-efr32로 설정하고 버전을 0.0.1로 설정합니다. 또한 ot-efr32에서 지원하는 efr32 플랫폼 목록인 EFR32_PLATFORM_VALUES 변수도 정의합니다. 이 예에서는 여러 플랫폼을 정의했지만 _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

여기에서 플랫폼 라이브러리의 소스 파일, include 경로, 컴파일러 플래그를 정의합니다. 단일 플랫폼만 지원하는 저장소의 이 파일의 좋은 예는 ot-cc2538입니다.

단일 저장소에서 여러 플랫폼을 지원할 수 있으며 여러 플랫폼 저장소를 참조로 사용할 수 있습니다. ot-efr32ot-nrf528xx를 참고하세요.