Yocto

Yocto 개발 환경 (SDK, eSDK, devtool 등)

chbae 2023. 9. 21. 01:16
728x90
반응형

Yocto 기반으로 임베디드 리눅스를 개발할때 일반적으로 많이 사용하는 개발 환경을 소개하고자 한다. 다들 알고 글을 읽고 있겠지만 간단히 Yocto에 대해서 다시 소개하자면 하드웨어 아키텍처와 무관하게 커스텀 임베디드 리눅스를 만들기 위한 빌드 프레임워크이다. 자세한 내용은 https://www.yoctoproject.org/ 를 방문해서 문서와 함께 살펴보면 된다.

 

Yocto 기반으로 개발을 해본 분들은 알고 있겠지만 일단 Yocto 자체를 배우는 것에 대한 시간이 소요된다. 오죽하면 "나오고 나온다고 해서" 욕토라고 하겠는가? :) 물론 Yocto 원어는 10의 -24승, 아주 작은 단위를 말한다. 이유야 어찌되었건 그만큼 Yocto 환경에서 개발하는데 어렵다는 의미이다.

 

그럼 왜그렇게 다들 어려워할까? 라고 생각하보면 기본적으로 임베디드 리눅스에 대한 전반적인 지식이 필요하다. 그리고 Yocto의 문법을 추가적으로 배워야 하기 때문에 단순 컴포넌트만 개발해왔던 개발자들에게는 전반적으로 이해를 하면서 개발을 해야하기 때문에 어려워하는 것 같다. 필자도 계속 개발자들에게 전체 yocto 환경을 이해하고 개발하는 것을 추천하지만 현실적이지 않다는 것을 계속 깨닫고 Yocto 오픈 소스 진영에서도 이를 알고 SDK, eSDK, devtool등과 같이 개발자들이 친숙한 방법으로 개발할 수 있도록 제공을 하기 시작했다.

 

이 글에서는 Yocto에서 제공하는 SDK, eSDK, devtool과 필자의 회사에서 따로 만들어서 개발자들이나 CI에서 사용하는 canoncal environment나 ADK (Application Development Kit)에 대해서 추가적으로 이야기해보고자 한다.

SDK (Software Development Kit)

 

SDK는 다들 아는 것처럼 Software Development Kit으로 toolchain과 기타 필요한 라이브러리가 포함된 개발 도구를 말한다. Yocto에서는 bitbake [이미지 이름] -c populate_sdk라는 명령을 통해 만들 수있다. 물론 bitbake meta-toolchain으로도 기본 toolchain과 라이브러리를 만들 수 있지만 전자에서 이야기한 명령어를 사용하면 이미지를 만드는데 필요한 라이브러리나 컴포넌트들도 SDK에 포함된다. 그래서 가끔은 필요가 없는 컴포넌트들도 포함이 되기도 한다.

 

SDK를 빌드하면 사이즈가 엄청 큰 .sh 파일이 생성되며 이를 실행하면 개발자가 원하는 폴더에 압축이 풀리며 SDK가 설치 된다. sh 파일이라고 해서 editor로 절대 열려고 시도하면 컴퓨터가 뻗을 수도 있다. 아래처럼 사용하면 된다.

$ ./Downloads/poky-glibc-x86_64-core-image-sato-i586-toolchain-4.1.3.sh
Poky (Yocto Project Reference Distro) SDK installer version 4.1.3
===============================================================
Enter target directory for SDK (default: /opt/poky/4.1.3):
You are about to install the SDK to "/opt/poky/4.1.3". Proceed [Y/n]? Y
Extracting SDK........................................ ..............................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.

$ source /opt/poky/4.1.3/environment-setup-i586-poky-linux

 

source 명령어로 environment-setup-i586-poky-linux를 실행하면 CC등과 같은 필요한 환경변수가 설정되어 이후 필요한 소스코드를 빌드하면 된다.

eSDK (Extensible SDK)

eSDK는 SDK의 확장판으로 다음과 같이 비교할 수 있다. devtool이 가장 유용한 기능중 하나인데 이에 대해서는 https://www.yocto.co.kr/78 에서 이미 간단히 소개했다. eSDK를 생성하려면 bitbake [이미지 이름] -c populate_sdk_ext 명령어를 사용하면 된다.

 

Feature Standard SDK Extensible SDk
Toolchain Yes Yes
Debugger Yes Yes
Size 100+ MB 1+ GB
devtool No Yes
Build Images No Yes
Updateable No Yes
Managed Sysroot No Yes
Installed Packages No Yes
Construction Packages Shared State

 

eSDK에 대한 내용은 조금 더 자세한 내용은 아래 Youtube를 참고하여 보기를 바란다.

 

ADK (Application Development Kit)

이는 Yocto에서 제공하는 공식 용어 및 공식 이미지는 아니고 각 회사나 프로젝트에 맞게 필요에 따라 정의해서 사용한다. 많은 곳에서 meta-toolchain을 확장하여 추가적인 bb파일로 정의하여 toolchain + 기본 라이브러리 + 필요한 라이브러리를 직접 설정하여 만들어 낸다. populate_sdk나 populate_sdk_ext를 기반으로 만들기도 하지만 여기서는 super set에서 추가를 하거나 일부 빼는 경우라서 필자는 추천하지는 않는다.

Canonical Environment

이는 필자 회사에서 사용하는 용어로 QEMU X86 환경을 MACHINE으로 해서 Docker 기반의 이미지를 만들어 낸다. 실제 타깃 머신이 아닌 X86 환경이지만 Docker 기반의 X86 즉, 대부분의 PC에서 호환이 가능한 환경을 제공함으로써 실제 타깃에 보내기전 개발자의 환경 또는 CI 를 쉽게 설정하여 Unit Test 등과 같은 것들을 쉽게 추가할 수 있다.

Package-Based Development

Yocto에서는 Package Feed라는 기능을 제공하여 원격에 RPM, IPK등과 같은 패키지를 저장해 놓고 rpm, dnf, opkg등과 같은 명령어로 필요한 패키지를 다운받을 수 있도록 제공한다. 물론 이는 다 각자의 프로젝트에서 설정할 수 있게끔 제공해야 가능하다. 유스 케이스는 기본 minimal한 이미지를 제공하는 것을 받아서 타깃에 flashing하고 이후에는 내가 필요한 컴포넌트 들만 dnf와 같은 패키지 툴로 설치하는 것이다. Ubuntu의 apt,apt-get과 비슷하게 의존성 있는 패키지들까지 다 알아서 가지고 오니까 개발자 입장에서는 편하기도 하다. 하지만 관리하는 입장에서는 패키지 버전 등을 잘 맞춰서 관리해야하기 때문에 때로는 의존성 문제가 생겨 관리하기 어렵기도 하다.

 

그래서 필자는 개발하는데 제공하는것은 추천하지만 이것을 양산이미지로 만드는 것은 추천하지는 않는다. 관리적인 이슈가 너무 크다. 필자회사에서 하려고 하는것 같은데... 약간 회의적이다.

정리

Yocto는 기본적으로 bitbake 명령어를 사용하여 필요한 레시피, 이미지를 빌드하여 사용하지만 쉽고 빠르게 개발을 하기 위해서 위에서 설명한 다양한 개발 환경을 제공한다. 모두 다 제공하여 개발자들이 사용하기 편하게 하는것이 가장 좋겠지만 이를 유지보수 하는게 또 큰 일이라서 쉽지 않다. 필자의 회사에서는 위에서 이야기한 모든 것을 제공하려고 하고 이미 많은 것들을 제공하고 있다. 하지만 여전히 고민은 많다. 어떻게 다 잘 관리하나 .....

 

이 외에도 다른 방법들이 있거나 좋은 아이디어가 있으면 댓글로 추천 부탁 드립니다. :)

728x90