Yocto/Yocto 프로젝트를 활용한 임베디드 리눅스 개발

[09장] Yocto 프로젝트를 이용한 개발

투영 2024. 11. 12. 10:40

https://product.kyobobook.co.kr/detail/S000214016400

 

Yocto 프로젝트를 활용한 임베디드 리눅스 개발 | 오타비우 살바도르 - 교보문고

Yocto 프로젝트를 활용한 임베디드 리눅스 개발 | Yocto 프로젝트나 오픈임베디드로 임베디드 리눅스 개발을 처음 시작하는 개발자를 위한 기본서다. Yocto 프로젝트에 대한 기본 개념부터 시작해

product.kyobobook.co.kr

 

 

이 장의 목표는 아래와 같다

 

  • 타깃 내부에서 사용할 개발 환경을 설정하는 방법
  • 타깃 외부에서 앱을 개발하는 데에 도움이 되는 표준 SW 키트 (SDK)

 

SDK

크로스 툴체인

: 하나의 아키텍처에서 실행돼 다른 아키텍처에서 사용되는 바이너리를 만드는 도구

: 예를 들어, gcc는 x86-64 머신에서 실행되고 ARM 머신용 바이너리를 생성한다

 

 

네이티브 빌드

: 동일한 호스트에서 빌드와 결과 바이너리 도구가 실행되는 의존성이 있을 때

 

즉, 빌드 및 타깃 아키텍처는 동일할 수 있지만 타깃 바이너리가 단계적 루트 파일 시스템을 사용해 의존성을 찾는 경우를 크로스 컴파일이라 한다.

 

 

SDK

: 어플리케이션을 개발하고 디버깅하는 도구와 파일의 집합 

: 컴파일러, 링커, 디버거, 외부 라이브러리, 헤더, 바이너리가 포함되며 이 모든 것을 툴체인이라고 부른다.

: 추가 유틸리티와 어플리케이션이 포함될 수도 있다.

: 2가지 유형이 존재한다 (크로스 개발 SDK, 네이티브 SDK)

 

  • 크로스개발 SDK: 개발 호스트에서 타깃에 대한 바이너리를 생성하는 데에 사용된다. 
  • 네이티브 SDK: 타깃 장치에서 실행하는 것을 목적으로 한다.

 

 

온디바이스 개발을 위한 네이티브 SDK 생성

 

개발 이미지에 필요한 것

 

  • 헤더파일과 라이브러리
  • 툴체인

 

이미지에 dev-pkgs 와 tools-sdk를 추가할 수 있게 하는 방법이다.

IMAGE_FEATURES += "dev-pkgs tools-sdk"

 

 

이 IMAGE_FEATURES 는 다음과 같이 이미지 기능을 확장한다.

 

  • dev-pkgs: 지정된 이미지에 설치된 모든 패키지에 대한 개발 패키지 (헤더 및 추가 라이브러리 링크)를 설치한다.
  • tools-sdk: 장치에서 실행되는 툴체인을 설명한다.

 

build/conf/local.conf 파일만 수정하고 싶다면, EXTRA_IMAGE_FEATURES 변수를 사용한다.

 

타깃은 애플리케이션 개발 주기 동안 이 이미지를 사용할 수 있고,

동일한 프로젝트에서 작업하는 모든 개발자와 이미지 공유가 가능하다.

-> 결론적으로 개발팀은 동일한 개발 환경을 일관되게 사용한다.

 

 

크로스 개발 SDK 유형

 

YOCTO 프로젝트는 2가지 유형의 크로스 개발 SDK를 생성할 수 있다.

 

  • 표준(standard) SDK
    • 부트로더나 리눅스 커널 개발 또는 기타 사용자 공간 소프트웨어 등, 애플리케이션 개발을 위한 아티팩트를 제공한다.
    • 툴체인과 디버깅 어플리케이션을 포함한다.
    • 사용자가 타깃에서 사용할 바이너리를 생성할 수 있게 하는 것이 목표이다.
  • 확장(extensible) SDK
    • SDK 의 sysroot 디렉터리에 추가 패키지를 설치할 수 있을 뿐만 아니라, Yocto 프로젝트가 제어하는 환경 내에서 레시피 및 애플리케이션을 통합할 수 있다.
    • 이미지와 레시피를 빌드할 수 있다.
    • devtool 이 있다.

 

devtool은 확장 가능한 SDK 추가 기능을 제공하는데, 비트베이크와 레시피 툴의 기능을 사용하기 위한 인터페이스이다.

특히 devtool 및 레시피 도구 명령은 기존 Yocto에서도 사용이 가능하다.

 

 

표준 SDK

 

이미지기반 SDK

일반적으로 SDK에는 제공해야 하는 라이브러리와 애플리케이션 집합이 있으며, 제품에 맞게 조정된 이미지로 정의한다.

 

이미 해보았지만, 아래와 같은 명령으로 core-image-full-cmdline용 표준 SDK를 생성할 수 있다.

bitbake core-image-full-cmdline -c populate_sdk

 

 

표준 SDK를 만드는 또다른 방법은 디버깅 도구가 포함된 일반 SDK를 만드는 것이다.

 

이 일반 SDK는 meta-toolchain 이라고 부르며, 주로 리눅스 커널 및 부트로더 개발과디버깅 프로세스에 사용된다.

단점은, 복잡한 의존성이 있는 애플리케이션을 빌드하기엔 부족하다는 점이다.

 

meta-toolchain을 생성하는 명령어는 아래와 같다.

bitbake meta-toolchain

 

 위의 두 가지 방법 모두 SDK 자체 설치 파일은 build/tmp/deploy/sdk/ 에 있다. 

 

해당 폴더에서 ls 명령어를 실행하면, [host.manifest, .sh, .target.manifest, testdata.json] 을 확인할 수 있다.

 

표준 SDK 는 설치 스크립트로 래핑되므로,

위의 방법으로 표준 SDK를 설치한 후 다음 단계는 이 .sh 파일을 실행하여 설치하는 것이다. (.sh 파일 실행)

 

 

표준 SDK는 MACHINE 변수를 사용해 설정한 머신 아키텍처와 일치하게 생성된다. 

표준 SDK를 사용해 사용자 지정 애플리케이션을 빌드하려면 x86-64 아키텍처를 타깃으로 아래와 같은 커맨드를 실행할 수 있다.

source /opt/poky/4.0.4/environment-setup-core2-64-poky-linux

 

 

일반적으로 사용되는 또 다른 프로젝트는 리눅스 커널이다. 

리눅스 커널 소스코드를 빌드하려면 아래와 같이 한다.

source /opt/poky/4.0.4/environment-setup-core2-64-poky-linux
unset LDFLAGS
make defconfig
make bzImage

 

이 명령어들 중 LDFLAGS 를 설정하지 않는 이유는, 표준 SDK의 기본값을 GCC로 링킹에 사용하지 않게 하기 위함이다.

 

 

확장 SDK

 

주요 기능은 아래와 같다.

 

  1. 레시피 생성
  2. 레시피 빌드
  3. 이미지 빌드
  4. 내부 툴체인에 패키지 설치
  5. 타깃에 패키지 배포

 

이 추가 기능은 Yocto에서도 사용할 수 있게 devtool 유틸리티에서 제공된다.

확장 SDK 를 생성하려면 아래와 같은 명령을 사용하면 된다.

bitbake core-image-full-cmdline -c populate_sdk_ext

 

결과 파일은 build/tmp/deply/sdk 디렉터리에 있다. 

 

 

이 디렉터리로 이동하여 ls 명령어를 실행하면 아래와 같은 파일이 있는 것을 볼 수 있다.

.host.manifest
.sh
.target.manifest
.testdata.json

 

 

마찬가지로 .sh 파일이 생성됐으므로, 설치하면 된다.

.sh 파일을 실행한다. 

 

 

요구사항에 맞는 사용자 지정 이미지를 생성한 뒤에 이를 기반으로 확장 SDK를 사용하는 것이 좋다.

그러나 확장 SDK를 사용해 추가 의존성을 SDK로 빌드하고 설치할 수 있다.

 

 

아래 코드는 /home/user/poky_sdk에 확장 SDK를 설치한다.

그 이후 제공된 스크립트를 사용해 필요한 환경 변수를 내보내, 확장 SDK를 사용할 수 있게 만든다.

. /home/user/poky_sdk/environment-setup-core2-64-poky-linux

 

 

확장 SDK는 동일한 Yocto 프로젝트 도구와 메타데이터를 제공하는 다른 방법이며, 아래와 같은 기능을 포함한다.

 

  • Yocto 프로젝트 환경을 실행하기 위한 기본 바이너리 집합
  • 개발을 위한 표준 SDK
  • 로컬 빌드를 줄이기 위한 셰어드 스테이트 캐시
  • Yocto 프로젝트 메타데이터와 설정 스냅숏

 

기본적으로 확장 SDK 는 이를 생성하는 데 사용된 환경의 스냅숏이다.

 

 

devtool을 사용해 이미지 빌드

 

core-image-full-cmdline을 만들어보자.

 

devtool build-image core-image-full-cmdline

 

이 명령어를 실행하면 생성된 파일은 /home/user/poky_sdk/tmp/deploy/images/qemux86-64 에서 찾을 수 있다.

 

이후 runqemu를 하면, 이미지 실행을 통해 타깃 하드웨어를 에뮬레이팅 가능하다.

devtool runqemu core-image-full-cmdline

 

 

devtool은 외부 깃 저장소에서 레시피를 생성할 수도 있다. 

devtool add https://github.com/OSSystems/bbexample

 

devtool은 지정된 저장소에 대한 기본 레시피 파일을 생성한다.

패키지 소스코드와 필요한 메타데이터가 포함된 작업 영역을 만드는데, 위 명령어를 실행한 후 devtool이 사용하는 파일 구조는 아래와 같다.

 

/home/user/poky_sdk/workspace
----appends
---------bbexample_git.bbappend
----cond
---------layer.conf
----README
----recipies
---------bbexample
-------------bbexample_git.bb
----sources
---------bbexamples
-------------autogen.sh (그 외 다수)

 

현재 devtool은 다음을 기반으로 프로젝트에 대한 잠정적인 레시피를 생성한다.

 

  • Autotools
  • CMake
  • Scons
  • qmake
  • 일반 Makefile
  • Node.js 모듈
  • setuptools 또는 distutils 를 사용한 파이썬 모듈

 

 

devtool을 사용해 레시피 빌드

 

위의 과정까지 끝나고 나면 작업 디렉터리 아래에 레시피가 생성됐으므로 해당 명령어를 실행할 수 있다.

devtool build bbexample

 

 

 

devtool을 사용해 타깃으로 배포

 

패키지 빌드 후에는 타깃에 배포도 가능하다.

아래 예제의 192.168.7.2 아이피는 실행 중인 QEMU를 말한다. 

 

devtool deploy-target bbexample root@192.168.7.2

 

이를 실행하면 애플리케이션이 타깃에 설치되고, QEMU 타깃에서 bbexample이 실행되는 것을 확인할 수 있다.

 

 

SDK 확장

확장 SDK의 목표 중 하나는 SDK 환경에서 다양한 레시피를 설치할 수 있게 하는 것이다.

예를 들어 libusb1을 사용하려면 아래의 명령어를 실행하면 된다.

 

devtool sdk-install -s libusb1