Yocto Project 라는 리눅스 빌드 시스템의 달인이 되고자, 연습한 기록을 남기려고 한다.
기록을 시작하는 2024. 10. 13. 기준 Yocto Project의 가장 최신의 LTS(Long Term Support) 버전은 5.0 Scarthgap 이다.
따라서 5.0 Scarthgap 을 기준으로 모든 연습을 수행하고, 문서 또한 Scarthgap 기준의 문서를 참조한다.
Scarthgap 은 2024년 4월 출시되어, 2028년 4월까지 지원이 보장되는 LTS 버전이다.
Long Term Support 란?
장기 지원 버전, 곧 LTS(Long Term Support)는 일반적인 경우보다 장기간에 걸쳐 지원하도록 특별히 고안된 소프트웨어의 버전 또는 에디션이다. 이것은 특히 리눅스를 비롯한 오픈소스 프로젝트에서 적용되고 있다.
- 위키백과 한국 - 장기 지원 버전쉽게 말하자면, A/S 서비스 기간이 언제까지냐 와 관련하여 그 "언제"가 길게 출시된 버전이라고 할 수 있다. LTS 버전이 아니면 그 "언제"가 굉장히 짧아서 이용 중에 "어? 저기 제작자님, 이거 문제가 하나 있는데요?" 라고 요청해도 "그건 A/S 기간 끝났어요" 라고 답하며 고쳐주지 않는다.
아래의 웹페이지는 가장 최신의 안정화된 버전의 공식 문서 웹페이지이다. 원하는 버전(e.g. Scarthgap)을 골라 이동하기 바란다.
Yocto Project 공식 문서 웹페이지
우분투 등의 리눅스 배포판이 설치된 컴퓨터나 노트북... 이 있다면 좋겠지만 대부분 윈도우를 사용할테니 가상머신을 만들어 사용한다. 가상머신에 대해서는 설명을 생략한다. (따로 찾아보세요.)
Yocto Project 공식 문서의 Quick Build 부분을 참고 바람.
<주의>
절전모드를 "안 함" 으로 설정한다..!!!
빌드 도중 절전모드에 들어가면 에러가 발생하는 경우가 있었다.
$ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 python3-subunit zstd liblz4-tool file locales libacl1
$ sudo locale-gen en_US.UTF-8
# 주석: 아래 두 줄은 poky를 다운로드할 디렉토리 생성
$ mkdir yocto-sources
$ cd yocto-sources
# 주석: 아래는 poky 깃 프로젝트를 clone
$ git clone git://git.yoctoproject.org/poky
clone을 완료하면 poky 디렉토리가 생겨 있다.
$ cd poky
$ git checkout -t origin/scarthgap -b my-scarthgap
$ source oe-init-build-env
source oe-init-build-env
명령을 수행하고 나면,
poky 디렉토리에 build 라는 이름의 디렉토리가 생성되어
그 build 라는 이름의 디렉토리로 터미널의 작업 디렉토리가 이동되어 있을 것이다.
이 build 라는 이름의 디렉토리가 하나의 빌드 프로젝트 라고 할 수 있다.
예를 들자면, 비주얼 스튜디오의 솔루션 폴더와 같다고나 할까..?
자꾸 build 디렉토리라고 안하고 build 라는 이름의 디렉토리라고 강조하는 이유가 있다.
원래는 oe-init-build-env 스크립트는 아래와 같이 특정 디렉토리 경로를 인자로 주어야 한다.
source oe-init-build-env <지정하려는 디렉토리 경로>
# 주석: e.g. $ source oe-init-build-env ../build_instance_1
source oe-init-build-env <지정하려는 디렉토리 경로>
을 수행하면,
<지정하려는 디렉토리> 에 대한 최초 실행이면 meta, meta-poky, meta-yocto-bsp 라는 세 개의 기본 레이어를 포함하는 Yocto의 기본 빌드 디렉토리를 생성하고 터미널에 활성화한다.
<지정하려는 디렉토리> 에 대해 source oe-init-build-env <지정하려는 디렉토리 경로>
를 수행한 적이 있어, Yocto 빌드 디렉토리의 구조를 갖추고 있으면 그 디렉토리를 현재 터미널에 활성화한다.
source oe-init-build-env <지정하려는 디렉토리 경로>
를 수행한 후의 터미널에서만 bitbake 를 이용한 Yocto 의 빌드를 수행할 수 있다.
그리고 그 빌드는 모두 source oe-init-build-env
을 할 때 지정한 디렉토리 에서 수행되며,
빌드에 대한 모든 결과물도 source oe-init-build-env
을 할 때 지정한 디렉토리 아래에 생성되게 된다.
여기서 <지정하려는 디렉토리 경로> 를 기입하지 않고 실행하면 기본적으로 현재 터미널의 작업 디렉토리 아래 build 라는 이름의 디렉토리가 지정된다.
그래서 source oe-init-build-env
를 수행하면 poky 디렉토리에 build 라는 이름의 디렉토리가 생성되고, 기본적인 Yocto의 빌드 디렉토리로서의 구성이 되고, 터미널에 빌드 디렉토리로서 활성화된다.
그래서 보통 project 디렉토리 아래에 레이어들을 모아놓은 sources/ 디렉토리를 가지고 있고, 각 빌드 디렉토리는 sources/ 디렉토리 아래에 poky/ 를 위치시키고, project/ 디렉토리 아래 build_1/, build_2/, build_3/ ... 이런 식으로 빌드 디렉토리들을 갖고 있는 형태가 일반적일 것 같다.
(아래 이미지와 같이 디렉토리를 트리 구조로 볼 수 있는 tree 명령을 사용하기 위해서는 sudo apt install tree
로 tree 패키지를 설치하면 된다.)
<결론>
터미널을 닫고 새로 열 때마다 그 터미널에서 다시 빌드를 수행하고 싶다면
source oe-init-build-env <지정하려는 디렉토리>
명령을 다시 수행해 주어야 한다.
oe-init-build-env 라는 파일을 열어보면 알겠지만, 셸 스크립트이다. 셸 스크립트는 셸에서 쓸 명령들을 적어놓은 스크립트인데, ./my_script
로 실행시킬 수도 있고, source my_script
로 실행시킬 수도 있다.
그러면 왜 source oe-init-build-env
로 실행시키느냐?
변수 설정들을 현재 열어 놓은 터미널(셸)에 적용시키기 위함이다.
source
명령은 현재 셸에 명령들을 수행하고, ./my_script
는 새로운 셸(서브셸)을 열어서 거기에서 스크립트 명령들을 수행하기 때문에 내가 지금 열어 놓은 터미널에 적용이 안된다.
차이점을 알고 싶다면, 한 터미널에서 source oe-init-build-env
를 한 후 echo $BUIlDDIR
을 수행 해보고, 다른 터미널에서 ./oe-init-build-env
를 한 후, echo $BUIlDDIR
을 수행 해본다.
결과:
source oe-init-build-env
의 경우
./oe-init-build-env
의 경우
새로운 셸을 열어 명령들을 수행하므로
현재 터미널이 build 라는 이름의 디렉토리로 이동 안됨.
bitbake도 실행 안됨.
BUILDDIR 등의 변수들 현재 터미널에 적용 안되어 있음.
bitbake core-image-sato