빌드 환경 설정

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 링커 스크립트는 입력 파일의 모든 섹션(GCC (GNCC 컴파일러 컬렉션)에 의해 생성된 .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. .data 섹션을 비휘발성 메모리에서 RAM으로 복사합니다.
  5. 애플리케이션 기본 함수로 이동하여 애플리케이션 로직 실행

시작 코드 (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
    $
)