빌드 환경 설정

GitHub에서 소스 보기

OpenThread는 자유롭고 개방적인 개발을 장려하기 위해 빌드 도구 모음에서 CMake를 사용합니다. 현재 이 도구 모음은 OpenThread를 새 하드웨어 플랫폼으로 포팅하는 데 필요합니다.

다른 빌드 도구 모음은 향후 지원될 수 있지만 이 포팅 가이드의 범위에는 해당하지 않습니다.

새 저장소 만들기

첫 번째 단계는 하드웨어 플랫폼의 새 홈을 설정하는 것입니다. 이 가이드에서는 플랫폼 추상화 레이어, 하드웨어 플랫폼의 SDK, 몇 가지 유용한 스크립트가 포함된 ot-efr32라는 새 저장소를 만듭니다.

이 예에서는 GitHub에서 SiliconLabs/ot-efr32 저장소를 만들고 ~/repos/ot-efr32에 클론했습니다.

mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning into 'ot-efr32'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234
Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done.
Resolving deltas: 100% (194/194), done.
git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

저장소 구조

OpenThread GitHub 조직의 기존 플랫폼 저장소와 일관성을 유지하려면 다음과 같이 저장소를 구성하는 것이 좋습니다.

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
폴더 설명
examples 선택사항 애플리케이션 예시
openthread 하위 모듈로서의 openthread 저장소
script 빌드, 테스트, 린팅을 위한 스크립트
src 플랫폼 추상화 레이어 구현
third_party 서드 파티 소스의 위치

하위 모듈 추가

다음 단계는 openthread 및 기타 필요한 저장소를 하위 모듈로 추가하는 것입니다.

git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.

이 예에서는 Silicon Labs Gecko SDK의 라이트 버전을 third_party의 하위 모듈로 추가합니다.

cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning into '/home/user/repos/ot-efr32/third_party/sdk_support'...
remote: Enumerating objects: 32867, done.
remote: Counting objects: 100% (8181/8181), done.
remote: Compressing objects: 100% (3098/3098), done.
remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686
Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done.
Resolving deltas: 100% (19797/19797), done.

스크립트

일반적인 작업을 더 쉽게 처리하려면 script 폴더에 스크립트를 만들어 보세요. 여기에는 부트스트랩, 빌드, 코드 린터 실행과 같은 작업을 위한 스크립트와 GitHub CI 검사를 위한 테스트 스크립트가 포함될 수 있습니다.

다음은 대부분의 기존 플랫폼 저장소에 표준으로 적용되는 스크립트의 몇 가지 예입니다.

bootstrap

이 스크립트는 하드웨어 플랫폼에 필요한 모든 도구와 패키지를 설치합니다. 또한 openthread의 부트스트랩 스크립트를 실행하여 사용자가 OpenThread 스택을 빌드하는 데 필요한 모든 것을 갖추었는지 확인해야 합니다.

예시는 ot-efr32부트스트랩 스크립트를 참고하세요.

build

CMake 빌드 스크립트를 사용하면 사용자가 플랫폼용 OpenThread 스택을 빌드할 수 있어야 합니다. 저장소에 예시 애플리케이션이 정의되어 있으면 이 스크립트에서 해당 애플리케이션도 빌드해야 합니다. 이 스크립트에는 플랫폼별 매크로 정의 등 기본 시스템 구성 옵션이 포함되어야 합니다.

예를 보려면 ot-efr32빌드 스크립트를 참고하세요.

test

테스트 스크립트는 사용자가 정의한 테스트를 사용하여 변경사항을 테스트하는 데 유용할 수 있습니다. 이는 단순히 건전성 검사 빌드를 실행하는 것일 수도 있고 단위 테스트 모음을 실행하는 것처럼 복잡할 수도 있습니다.

ot-efr32에서 스크립트는 각 efr32 플랫폼에서 지원되는 모든 보드에 대해 build 스크립트를 실행합니다.

예시는 ot-efr32테스트 스크립트를 참고하세요.

make-pretty

일관된 스타일을 유지하려면 이 스크립트가 코드, 스크립트, 마크다운 파일의 형식을 지정해야 합니다.

이 스크립트를 직접 정의할 수도 있지만 기존 플랫폼 저장소에서 사용하는 make-pretty 스크립트를 사용하는 것이 가장 쉽습니다. 이 스크립트는 openthread의 스타일 스크립트를 호출하며 모든 OpenThread 저장소에서 일관된 스타일을 유지하는 데 도움이 됩니다.

링커 스크립트 구성

GNU 링커 스크립트는 입력 파일 (GNU Compiler Collection (GCC)에서 생성된 .o '객체' 파일)의 모든 섹션을 최종 출력 파일 (예: .elf)에 매핑하는 방법을 설명합니다. 또한 실행 파일의 각 세그먼트의 저장소 위치와 진입 주소를 결정합니다. 플랫폼별 링커 스크립트는 종종 플랫폼의 BSP와 함께 제공됩니다.

src/CMakeLists.txt의 플랫폼 CMake 타겟에서 target_link_libraries를 사용하여 플랫폼별 링커 스크립트를 가리키도록 ld 도구를 구성합니다.

set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")

target_link_libraries(openthread-efr32mg12
    PRIVATE
        ot-config
    PUBLIC
        -T${LD_FILE}
        -Wl,--gc-sections -Wl,-Map=$.map
)

툴체인 시작 코드

도구 모음 시작 코드는 플랫폼의 BSP와 함께 제공되는 경우가 많습니다. 이 코드는 일반적으로 다음을 실행합니다.

  1. 실행 파일 프로그램의 진입 함수 (Reset_Handler)를 구현합니다.
  2. 인터럽트 벡터 테이블 정의
  3. 힙과 스택을 초기화합니다.
  4. 비휘발성 메모리에서 RAM으로 .data 섹션을 복사합니다.
  5. 애플리케이션 로직을 실행하기 위해 애플리케이션 main 함수로 이동합니다.

시작 코드 (C 또는 어셈블리 소스 코드)는 플랫폼의 openthread-platform-name 라이브러리에 포함되어야 합니다. 그렇지 않으면 링커 스크립트에 사용되는 일부 키 변수를 올바르게 인용할 수 없습니다.

  • src/CMakeLists.txt

: ot-cc2538startup-gcc.c - src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)