Yocto 프로젝트는 리눅스 배포판을 생성하는 데 사용되는 복잡한 빌드 시스템이다. 빌드 과정은 여러 단계로 이루어지며, 각각의 단계는 특정 작업을 수행하도록 설계되어 있다. 이하에서는 Yocto 빌드 시스템의 주요 구성 요소와 빌드 과정에 대해 자세히 설명하겠다.
구성 요소 (Components)
Yocto 빌드는 주로 다음과 같은 주요 구성 요소로 이루어져 있다:
- BitBake: Yocto 빌드 시스템의 핵심 도구로, 메타데이터를 기반으로 패키지를 빌드한다.
- Recipes (.bb): BitBake가 읽고 실행하는 빌드 지침서로, 패키지 소스와 빌드 지침을 포함한다.
- Layers: 여러 레시피, 설정 파일 및 빌드 지침을 포함하는 디렉토리 계층 구조로, 소프트웨어 스택의 모듈화와 확장을 용이하게 한다.
- Configuration Files (.conf): 빌드 프로세스의 여러 측면을 지정하는 데 사용되는 설정 파일이다.
- Source Mirror: 패키지 소스 코드가 저장된 위치이다.
- Shared State Cache (SSTATE): 빌드된 아티팩트를 재사용하여 빌드 시간을 단축시키기 위한 캐시이다.
빌드 준비 (Build Preparation)
-
디렉토리 초기화:
- Yocto 프로젝트를 시작하기 위해서는 작업 디렉토리를 초기화하는 과정이 필요하다. 이는
oe-init-build-env
스크립트를 활용하여 수행된다.bash source oe-init-build-env
- 이 명령은 빌드 디렉토리를 만들고 필요한 환경 변수를 설정한다.
- Yocto 프로젝트를 시작하기 위해서는 작업 디렉토리를 초기화하는 과정이 필요하다. 이는
-
환경 설정:
conf/local.conf
와conf/bblayers.conf
파일을 수정하여 필요한 설정을 지정한다.local.conf
파일은 빌드 목표, 머신 종류, 빌드 옵션 등을 설정하는 데 사용된다.bblayers.conf
파일은 빌드에 포함될 레이어를 정의한다.
소스 코드 준비 (Fetching Source Code)
- BitBake는
SRC_URI
변수에 지정된 위치에서 소스 코드를 다운로드한다. fetch
task는 주어진 URL에서 소스 코드를 로컬 디렉토리로 가져온다.
shell
SRC_URI = "https://example.com/source.tar.gz"
- 다운로드된 소스는 DL_DIR
디렉토리에 저장된다.
빌드 (Build)
-
패치 (Patch):
- 필요한 경우 다운로드된 소스 코드에 패치를 적용한다.
- 패치는
SRC_URI
에_append
를 사용하여 추가할 수 있다.shell SRC_URI_append = " file://my_patch.patch"
-
Configure:
do_configure
task는 소스 코드의 구성을 조정한다.- 일반적으로
./configure
스크립트가 실행된다.bash do_configure() { ./configure --prefix=${prefix} }
-
컴파일 (Compile):
do_compile
task는 실제로 소스 코드를 컴파일한다.- 표준 빌드 시스템 명령어(
make
등)가 사용된다.bash do_compile() { make }
-
설치 (Install):
do_install
task는 빌드된 아티팩트를 지정된 디렉토리에 설치한다.- 이 디렉토리는
DESTDIR
환경 변수로 지정된다.bash do_install() { make install DESTDIR=${D} }
-
패키징 (Package):
do_package
task는 빌드된 아티팩트를 패키징한다.- 패키지는
.rpm
,.deb
,.ipk
등 다양한 형식으로 생성될 수 있다.
이미지 생성 (Image Generation)
bitbake core-image-minimal
명령을 실행하여 기본 이미지를 생성한다.- 이 과정에서는 각 패키지가 빌드된 후, 지정된 이미지에 포함된다.
- 최종 이미지는
DEPLOY_DIR_IMAGE
디렉토리에 저장된다.
빌드 최적화 및 디버깅 (Build Optimization and Debugging)
빌드 최적화 (Build Optimization)
빌드 프로세스를 최적화하여 시간 및 자원을 절약할 수 있다. Yocto는 이를 위해 다양한 기능을 제공한다.
-
Shared State Cache (SSTATE):
- 이전 빌드 결과를 재사용하여 빌드 시간을 단축한다.
SSTATE_DIR
변수로 캐시 디렉토리를 지정할 수 있다.shell SSTATE_DIR = "/path/to/sstate-cache"
-
병렬 빌드:
BB_NUMBER_THREADS
및PARALLEL_MAKE
변수를 조정하여 병렬 빌드를 활용한다.shell BB_NUMBER_THREADS = "8" PARALLEL_MAKE = "-j 8"
-
디스크 I/O 개선:
- 빌드 디렉토리를 빠른 디스크 (예: SSD)에 위치시킨다.
- TMPDIR 변수를 사용하여 임시 빌드 디렉토리를 지정할 수 있다.
-
INHERIT +=”rm_work”:
- 빌드가 완료된 후 임시 파일을 삭제하여 디스크 공간을 절약한다.
shell INHERIT += "rm_work"
- 빌드가 완료된 후 임시 파일을 삭제하여 디스크 공간을 절약한다.
디버깅 (Debugging)
Yocto 빌드 시스템을 디버깅하는 데 도움이 되는 다양한 도구와 방법이 있다.
-
로그 파일:
- 각 태스크의 실행 결과는 로그 파일에 기록된다.
- 로그는
tmp/log
디렉토리에 저장된다.shell tmp/work/<machine>/<recipe>/<version>/temp/log.do_<task>.log
-
devshell:
bitbake -c devshell <recipe>
명령을 사용하여 특정 레시피의 개발 쉘 환경으로 진입할 수 있다.shell bitbake -c devshell core-image-minimal
-
BitBake 디버깅 옵션:
-v
,-D
플래그를 사용하여 BitBake의 디버그 출력을 활성화한다.shell bitbake -v -D <recipe>
-
위키 및 포럼:
- Yocto 프로젝트의 공식 위키 및 포럼에서 다양한 문제 해결 방법을 찾아볼 수 있다.
유용한 도구와 리소스 (Useful Tools and Resources)
Hob
- 그래픽 사용자 인터페이스 (GUI)로, BitBake와 Yocto 프로젝트를 쉽게 조작할 수 있다.
- Hob는 프로젝트 생성, 설정 및 빌드를 시각적으로 관리할 수 있는 도구이다.
Toaster
- 웹 기반의 빌드 인터페이스로, BitBake 빌드를 시각적으로 관리하고 모니터링한다.
- 빌드 메타데이터와 빌드 로그를 분석하고 보고서를 생성할 수 있다.
Devtool
- 레시피 생성, 수정, 테스트 및 디버깅을 쉽게 할 수 있는 명령 줄 도구이다.
- 새로운 레시피를 생성하거나 기존 레시피를 수정할 때 유용하다.
devtool add <recipe-name> <source-url>
devtool modify <recipe-name>