Yocto 빌드 시스템에서 메타데이터는 빌드 과정을 정의하고 관리하는 주요 요소이다. 메타데이터는 빌드 구성 요소, 빌드 타겟 및 빌드 방법을 지정하는 여러 파일과 디렉토리로 구성된다. 이를 통해 복잡한 빌드를 체계적이고 효율적으로 관리할 수 있다.

레시피(Recipe)

레시피는 소프트웨어 패키지를 구체적으로 빌드하고 배포하기 위해 필요한 지침을 포함하고 있는 .bb 확장자를 가진 파일이다. 주로 다음을 포함한다. - SRC_URI: 소프트웨어 소스 코드의 위치를 지정한다. - DEPEND: 빌드에 필요한 다른 패키지들과의 종속성을 정의한다. - do_compile(): 소스 코드를 컴파일하는 방법을 정의한다. - do_install(): 빌드된 바이너리를 설치하는 방법을 정의한다.

패키지 그룹(Package Groups)

패키지 그룹은 여러 패키지들을 하나의 논리적 그룹으로 묶어주는 역할을 한다. 이러한 그룹은 다양한 빌드 옵션과 이미지를 정의할 때 유용하다. - ROOTFS_POSTPROCESS: 루트 파일 시스템 생성 이후의 후처리 작업을 정의한다. - PACKAGE_INSTALL: 설치할 패키지 목록을 정의한다.

레이어(Layers)

레이어는 관련 메타데이터를 논리적으로 그룹화한 것이다. 이를 통해 독립적인 단위로 관리가 가능하여, 코드 재사용성과 유연성을 높일 수 있다. - conf/layer.conf: 레이어 구성을 정의하는 파일이다. 이 파일은 레이어의 기본 설정 및 종속성을 나타낸다. - recipes-*/: 특정 레시피를 포함하는 디렉토리 구조이다. 예를 들어, recipes-core, recipes-kernel 등이 있다.

클래스(Classes)

클래스 파일(.bbclass 확장자)은 공통 빌드 로직을 정의하여 여러 레시피에서 재사용할 수 있도록 한다. - base.bbclass: 모든 레시피가 기본적으로 상속하는 클래스이다. - autotools.bbclass: Autotools 기반 빌드를 지원하는 클래스이다.

BitBake 버전 및 호환성

메타데이터는 특정 버전의 BitBake와 호환되도록 설계되어야 한다. 버전에 따라 지원되는 기능이나 메타데이터 문법이 달라질 수 있다.

Yocto 프로젝트의 주요 변수와 함수

주요 변수

패키지와 빌드 과정을 제어하기 위해 Yocto는 다양한 변수들을 사용한다. 이 변수들은 레시피, 클래스, 레이어의 구성 요소로 포함된다.

SRC_URI

SRC_URI 변수는 소프트웨어 소스 코드의 위치를 지정한다. 이는 HTTP, FTP, Git, 로컬 파일 시스템 등의 다양한 프로토콜을 지원한다.

SRC_URI = "http://example.com/path/to/source.tar.gz"
SRC_URI = "git://git.example.com/repository.git;branch=main"

DEPENDS

DEPENDS 변수는 현재 패키지가 빌드되기 전에 빌드되어야 할 종속 패키지들을 지정한다.

DEPENDS = "dependency1 dependency2"

PV

PV 변수는 패키지의 버전 번호를 지정한다. 이는 주로 소프트웨어 버전을 표시하는 데 사용된다.

PV = "1.0.0"

FILES

FILES 변수는 패키지를 구성하는 파일 목록을 지정한다.

FILES_${PN} = "/usr/bin/*"

주요 함수

빌드 과정에서 자주 사용되는 함수들은 다음과 같다.

do_fetch

이 함수는 SRC_URI에서 소스 코드를 다운로드하는 데 사용된다.

do_fetch() {
    # 다운로드 로직
}

do_patch

이 함수는 소스 코드에 패치를 적용하는 데 사용된다.

do_patch() {
    # 패치 로직
}

do_compile

이 함수는 소스 코드를 컴파일하는 데 사용된다.

do_compile() {
    oe_runmake
}

do_install

이 함수는 빌드된 바이너리 및 기타 파일을 타겟 파일 시스템에 설치하는 데 사용된다.

do_install() {
    install -d ${D}${bindir}
    install -m 0755 mybinary ${D}${bindir}
}

Task 및 Task Dependencies

Yocto의 빌드 시스템은 수천 개의 개별 작업(Task)으로 구성되어 있으며, 각각은 특정 순서에 따라 실행된다. 주요 작업은 다음과 같다. - do_fetch - do_unpack - do_patch - do_configure - do_compile - do_install

이러한 작업들은 서로 종속성을 가질 수 있으며, addtask, before, after 등의 키워드를 사용하여 종속성을 정의할 수 있다.

addtask do_configure before do_compile

이러한 변수와 함수들은 Yocto 프로젝트에서 빌드 프로세스를 세밀하게 제어하고, 패키지를 효율적으로 관리하는 데 사용된다. 이를 통해 복잡한 빌드를 효과적으로 처리할 수 있다.

커스텀 레시피 작성

Yocto 프로젝트에서 커스텀 레시피를 작성하는 것은 자신만의 소프트웨어 패키지를 빌드하고 배포하는 핵심 기술이다. 여기서는 간단한 예제를 통해 커스텀 레시피를 작성하는 방법을 알아보겠다.

기본 커스텀 레시피

먼저, 간단한 "Hello World" 프로그램을 빌드하는 커스텀 레시피 예제를 살펴보겠다.

  1. 디렉토리 구조 설정 Yocto 프로젝트의 작업 디렉토리 내에서 다음과 같은 디렉토리 구조를 설정한다. plaintext meta-<your-layer>/ recipes-example/ hello-world/ hello-world_1.0.bb files/ hello.c

  2. hello.c 파일 작성 meta-<your-layer>/recipes-example/hello-world/files/hello.c 경로에 소스 코드를 작성한다. ```c #include

int main() { printf("Hello, World!\n"); return 0; } ```

  1. 레시피 파일 작성 meta-<your-layer>/recipes-example/hello-world/hello-world_1.0.bb 경로에 레시피 파일을 작성한다. ```plaintext DESCRIPTION = "Simple Hello World program" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=3c94f25ada2134c0b3afce670e2b0794"

SRC_URI = "file://hello.c"

S = "${WORKDIR}"

do_compile() { {CC}{CFLAGS} ${LDFLAGS} -o hello hello.c }

do_install() { install -d {D}{bindir} install -m 0755 hello {D}{bindir} }

FILES_{PN} = "{bindir}/hello" ```

상세 설명

이 레시피는 간단한 "Hello World" 프로그램을 컴파일하고 그 결과물을 타겟 파일 시스템의 /usr/bin 디렉토리에 설치한다.

레시피 테스트

작성한 커스텀 레시피를 테스트하기 위해 Yocto 빌드 시스템을 실행한다.

  1. 빌드 디렉토리로 이동 bash cd <path-to-yocto-build-directory>

  2. 레이어 추가 meta-<your-layer> 레이어를 빌드 구성에 추가한다. bash bitbake-layers add-layer <path-to-meta-your-layer>

  3. 패키지 빌드 커스텀 레시피를 빌드한다. bash bitbake hello-world

이제 Yocto 프로젝트에서 커스텀 레시피를 작성하고 테스트하는 방법을 이해하였다. 이를 바탕으로 자신의 요구에 맞는 소프트웨어 패키지를 Yocto 빌드 시스템에 쉽게 통합할 수 있다.