Embedded System/Embedded Linux Build System Yocto

Yocto Project 핵심 개념 정리: BitBake, Poky, BSP Layer 및 Custom Recipe 작성 가이드

임베디드 친구 2025. 5. 12. 21:47
반응형

Yocto Project 빌드 시스템 이해: BitBake 및 OE-Core 핵심 동작 원리

임베디드 리눅스 개발에서 Yocto Project는 맞춤형 배포판을 생성하기 위한 핵심 프레임워크입니다. 그러나 BitBake, Poky, OpenEmbedded-Core(OE-Core) 간의 역할 분담과 .bb 레시피의 동작 방식을 정확히 이해하지 못하면 빌드 오류 대응 및 BSP(Board Support Package) 커스터마이징에 어려움을 겪게 됩니다.

본 포스팅에서는 Yocto Project의 핵심 구성 요소를 명확히 구분하고, RK3399 칩셋 기반 BSP Machine Configuration 설정 및 C 언어 기반 Custom Recipe 작성 구조를 최신 Yocto 빌드 표준에 맞춰 상세히 분석합니다.

Yocto Build System 핵심 요약: BitBake, Poky, Recipe 구성 정리

  • BitBake & Poky 역할 구분: BitBake는 Python 기반 Task Scheduler 및 파서이며, Poky는 BitBake, OE-Core, 기본 Metadata가 결합된 Reference Distribution입니다.
  • BSP Layer & Machine Conf: conf/machine/*.conf 파일에서 PREFERRED_PROVIDER_virtual/kernel 및 SOC_FAMILY를 지정하여 하드웨어 종속적 빌드 환경을 제어합니다.
  • Recipe Task Execution: .bb 레시피의 WORKDIR 사용 시 UNPACKDIR 변수 분리 등 최신 Yocto 변수 규칙을 준수하고, ${CC} ${CFLAGS} ${LDFLAGS} 환경 변수를 전달하여 컴파일을 수행합니다.

Yocto Project 구성 요소 상세 분석 및 RK3399 BSP Machine Configuration 구현

Yocto 핵심 구성 요소 비교: Poky vs OpenEmbedded vs BitBake

Yocto Project의 주요 구성 요소를 명확히 정의하면 다음과 같습니다.

구성 요소 (Component) 주요 역할 (Primary Role) 구성 특징 (Key Features)
BitBake Task Execution & Metadata Parser Python/Shell 기반 빌드 스케줄러, DAG(Directed Acyclic Graph) 의존성 관리
OpenEmbedded-Core Base Metadata Repository Cross-compilation 툴체인, 기본 라이브러리 및 공통 .bbclass 집합
Poky Reference Linux Distribution BitBake + OE-Core + Reference Layers (meta-yocto-bsp 등) 통합 릴리스
BSP Layer Hardware Abstraction 특정한 SoC/Board 지원을 위한 Kernel, Bootloader(U-Boot), Machine Configuration

BitBake Task Execution Flow 및 주요 Environment Variables

BitBake는 메타데이터를 파싱한 후 각 패키지에 대해 아래의 Task 순서로 빌드를 수행합니다.

do_fetch $\rightarrow$ do_unpack $\rightarrow$ do_patch $\rightarrow$ do_configure $\rightarrow$ do_compile $\rightarrow$ do_install $\rightarrow$ do_package

병렬 빌드 성능을 최적화하려면 conf/local.conf 파일 내에 CPU 코어 수에 맞춘 병렬 설정을 적용합니다.

# conf/local.conf
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"

RK3399 Board Support Package (BSP) Machine Configuration 분석

meta-rk3399 레이어 내의 Machine Configuration 파일은 해당 Target 하드웨어의 Kernel 및 U-Boot Provider를 정의합니다.

meta-rk3399/
├── conf/
│   └── machine/
│       └── rk3399.conf
├── recipes-bsp/
│   └── u-boot/
│       └── u-boot-rockchip_2021.10.bb
└── recipes-kernel/
    └── linux/
        └── linux-rockchip_5.10.bb

conf/machine/rk3399.conf 작성 예시:

# conf/machine/rk3399.conf
# Target Machine Configuration for Rockchip RK3399

MUST_PIPE = "1"
SOC_FAMILY = "rockchip:rk3399"

require conf/machine/include/soc-family.inc

PREFERRED_PROVIDER_virtual/kernel ?= "linux-rockchip"
PREFERRED_VERSION_linux-rockchip ?= "5.10%"

PREFERRED_PROVIDER_u-boot ?= "u-boot-rockchip"
PREFERRED_PROVIDER_virtual/bootloader ?= "u-boot-rockchip"

IMAGE_FSTYPES += "ext4 wic"

Custom C Application Recipe (.bb) 작성 및 분석

meta-mylayer 레이어에 소스 코드와 레시피를 배치하는 구조입니다.

meta-mylayer/
├── conf/
│   └── layer.conf
└── recipes-example/
    └── hello-world/
        ├── files/
        │   └── hello.c
        └── hello-world_1.0.bb

C 소스 파일 (hello.c):

// files/hello.c
#include <stdio.h>

int main(void) {
    printf("Hello, Yocto Embedded Linux!\n");
    return 0;
}

BitBake 레시피 파일 (hello-world_1.0.bb):

# recipes-example/hello-world/hello-world_1.0.bb
SUMMARY = "Simple C Hello World Application"
DESCRIPTION = "Target user space C application recipe for Yocto Project."
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835de3cd26e6f02b2a9bbed79f2b1d4"

SRC_URI = "file://hello.c"

S = "${WORKDIR}/sources"
UNPACKDIR = "${S}"

do_compile() {
    # Use Cross-Compiler with environment CFLAGS and LDFLAGS
    ${CC} ${CFLAGS} ${LDFLAGS} ${UNPACKDIR}/hello.c -o hello
}

do_install() {
    # Create target directory and install binary
    install -d ${D}${bindir}
    install -m 0755 hello ${D}${bindir}/hello
}

Yocto BitBake 개발 및 디버깅 팁

  1. BitBake Environment Variable 확인:
    bitbake -e hello-world | grep ^S=
  1. 특정 레시피에 설정된 변수값을 확인할 때 bitbake -e 명령어를 사용합니다.
  2. Devshell 활용을 통한 Compile 및 Patch 테스트:
    bitbake -c devshell hello-world
  1. Cross-compilation 환경이 구성된 쉘에 직접 진입하여 소스 코드를 수정하고 테스트할 수 있습니다.
  2. Task Clean 및 Rebuild:
    bitbake -c cleansstate hello-world
    bitbake hello-world
  1. 특정 레시피의 작업 디렉토리를 초기화하고 다시 빌드합니다.

Yocto Recipe 작성 시 흔히 하는 실수 및 예외 처리

1. Cross-Compiler 하드코딩 오류

  • Problem: do_compile() 내에서 gcc를 직접 호출하면 Target Architecture(예: ARM64)가 아닌 Host PC(x86_64) 바이너리가 생성되어 실행 시 Exec format error가 발생합니다.
  • Solution: 반드시 Yocto Toolchain 변수인 ${CC}와 관련 플래그 ${CFLAGS}, ${LDFLAGS}를 사용해야 합니다.

2. ${D} 및 Destination Directory 미생성 오류

  • Problem: do_install() 실행 시 install 명령어가 디렉토리가 존재하지 않아 실패합니다.
  • Solution: 파일 복사 전 install -d ${D}${bindir}를 호출하여 Target rootfs 내 목적지 디렉토리를 선제적으로 생성해야 합니다.

3. QA Issue: non -dev package contains SYMLINK .so 및 FILES Mismatch

  • Problem: 생성된 바이너리나 라이브러리가 올바른 Package 변수(FILES:${PN})에 포함되지 않아 do_package_qa 단계에서 빌드가 중단될 수 있습니다.
  • Solution: 표준 경로(${bindir}, ${libdir}, ${sysconfdir})에 올바르게 배치하고 필요한 경우 FILES:${PN} 변수를 명시적으로 지정합니다.

Yocto Build System 활용 결론

Yocto Project는 BitBake Task Engine과 OE-Core Metadata Layer, 하드웨어별 Machine Configuration이 유기적으로 결합된 시스템입니다. 표준 레시피 구조와 변수 규칙을 준수하여 작성된 BSP 및 Application Recipe는 코드의 재사용성을 높이고 맞춤형 임베디드 리눅스 이미지 구축을 용이하게 합니다.

반응형