Yocto 프로젝트의 핵심 요소 중 하나는 레시피(Recipe)이다. 레시피는 특정 패키지를 빌드하고 설치하는 방법을 정의한 파일이다. 레시피는 주로 BitBake라는 도구를 통해 처리되며, BitBake는 빌드 시스템에서 이 레시피를 사용하여 소프트웨어 패키지를 빌드한다.

레시피 구조

레시피는 .bb 확장자를 가지는 파일로 작성된다. 레시피 파일은 여러 가지 변수를 통해 패키지의 소스 코드 위치, 빌드 방법, 의존성 등을 정의한다. 레시피의 주요 요소는 다음과 같다:

기본 변수

DESCRIPTION = "Example package"
HOMEPAGE = "http://example.com"
LICENSE = "MIT"
SRC_URI = "http://example.com/source.tar.gz"

소스 코드와 패치

레시피는 소스 코드뿐만 아니라 필요한 패치를 적용하는 방법도 정의할 수 있다. SRC_URI 변수에 패치 파일의 위치를 설정하면 BitBake가 자동으로 적용한다.

SRC_URI = "http://example.com/source.tar.gz \
           file://example.patch"

태스크(Task)와 함수

레시피에서는 특정 태스크를 수행하기 위한 함수들을 정의할 수 있다. 주요 태스크는 다음과 같다:

각 태스크는 기본적으로 제공되지만, 필요 시 커스터마이징이 가능한다.

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 ${S}/example${D}${bindir}
}

디펜던시 관리

레시피는 다른 패키지에 의존할 수 있으며, 이러한 경우 의존성은 DEPENDS 변수로 정의된다. 이 변수는 BitBake가 패키지를 빌드하기 전에 필요한 다른 패키지를 빌드하도록 지시한다.

DEPENDS = "libexample"

또한, RDEPENDS_${PN} 변수는 런타임 의존성을 정의하는 데 사용된다.

RDEPENDS_${PN} = "python3"

패키징 및 배포

레시피는 빌드 결과물을 패키지로 만들기 위한 규칙을 포함한다. PACKAGES 변수는 생성될 패키지 리스트를 정의하며, FILES_${PN} 변수는 각 패키지에 포함될 파일들을 지정한다.

PACKAGES = "${PN}${PN}-dev ${PN}-dbg"

FILES_${PN} = "${bindir}/*"
FILES_${PN}-dev = "${includedir}/*"
FILES_${PN}-dbg = "${bindir}/*-dbg"

환경 설정 및 커스터마이징

Yocto 프로젝트는 매우 유연하고 다양한 커스터마이징 옵션을 제공한다. 각 레이어와 레시피는 여러 설정 파일을 통해 환경을 구성할 수 있다.

빌드 디렉토리 설정

Yocto 프로젝트를 시작할 때, oe-init-build-env 스크립트를 실행하여 빌드 디렉토리를 초기화한다. 이 스크립트는 기본 설정 파일을 생성하며, 주로 conf/local.confconf/bblayers.conf 파일을 포함한다.

local.conf

local.conf 파일은 빌드 환경의 전반적인 설정을 정의한다. 예를 들어, 타겟 머신, 병렬 빌드 설정, 패키지 형식 등을 구성할 수 있다.

MACHINE = "qemuarm"

PARALLEL_MAKE = "-j4"
BB_NUMBER_THREADS = "4"

PACKAGE_CLASSES = "package_ipk"

bblayers.conf

bblayers.conf 파일은 사용되는 레이어 목록을 정의한다. 레이어는 여러 레시피와 설정을 포함할 수 있는 디렉토리이다.

BBLAYERS ?= " \
  /path/to/yocto/meta \
  /path/to/yocto/meta-poky \
  /path/to/yocto/meta-openembedded \
  "

사용자 설정 파일

사용자 환경 설정을 좀 더 세부적으로 관리하기 위해 conf/user.conf 파일을 생성하여 사용할 수 있다. 이 파일은 개인적으로 수정된 설정을 포함하여 빌드 환경에 반영된다.

DISTRO = "poky"
EXTRA_IMAGE_FEATURES = "debug-tweaks"

레이어

레시피, 클래스, 설정 파일 등을 그룹화하여 별도의 레이어로 관리할 수 있다. 각 레이어는 meta-<layername> 형태의 디렉토리 구조를 갖는다.

meta-example/
├── conf
│   └── layer.conf
├── recipes-example
│   └── example
│       └── example_1.0.bb

layer.conf

layer.conf 파일은 해당 레이어와 관련된 기본 설정을 정의한다. 이 파일은 레이어가 참조하는 경로 등을 설정한다.

LCONF_VERSION = "7"
BBPATH .= ":${LAYERDIR}"

이미지 빌드 커스터마이징

이미지 빌드를 커스터마이징하려면 해당 이미지의 레시피 파일(.bb 파일)을 수정하여 추가적으로 설치할 패키지나 설정을 정의할 수 있다.

예시: core-image-minimal.bbappend

이미지에 추가 패키지를 포함하려면 .bbappend 파일을 생성하여 해당 이미지 레시피를 확장하면 된다.

IMAGE_INSTALL_append = " my-package"

이 방법을 통해 특정 이미지를 선택적으로 커스터마이징할 수 있다.

디버깅과 로그

빌드 과정 중 발생하는 문제를 디버깅하기 위해 Yocto 프로젝트는 다양한 로그 파일을 제공한다. tmp/log 디렉토리에는 빌드와 관련된 로그 파일들이 저장된다. 또한, 각 태스크별 로그 파일(log.do_*)도 해당 태스크가 실행되는 디렉토리에 생성된다.

tail -f tmp/log/cooker/qemuarm.log