본문 바로가기
Yocto 개발/Yocto

[Yocto 시리즈 2] 레시피·레이어·메타데이터 — .bb, .bbappend, .conf, .bbclass 해부

by khd0801 2026. 7. 14.
반응형

지난 1회차에서 Yocto가 "배포판을 만드는 도구"라는 큰 그림을 봤다면, 이번엔 그 도구를 실제로 움직이는 재료를 뜯어볼 차례예요. Yocto 작업 디렉터리를 열면 .bb, .bbappend, .conf, .bbclass 네 가지 확장자가 끝없이 나오는데, 이 넷의 역할 구분이 서면 Yocto 코드 읽기가 갑자기 쉬워집니다. 실무에서 벤더 BSP를 분석하거나 빌드 에러의 원인 파일을 추적할 때 매일 쓰게 되는 지식이에요.

 📑 목차

 1. 메타데이터 — Yocto를 움직이는 설계도

1.1 메타데이터란 무엇인가

공식 용어집의 정의부터 볼게요.

"A key element of the Yocto Project is the Metadata that is used to construct a Linux distribution and is contained in the files that the OpenEmbedded Build System parses when building an image."
Yocto Project Reference Manual, Terms

즉 메타데이터는 "리눅스 배포판을 어떻게 만들지"를 기술한 파일 전체를 가리키는 말이에요. 1회차에서 본 BitBake(엔진)가 이 메타데이터를 파싱해서 빌드를 실행하고, 레이어는 이 메타데이터를 역할별로 묶어 두는 폴더 구조입니다. 그리고 메타데이터의 실체가 바로 오늘의 네 파일 — 레시피(.bb), 어펜드(.bbappend), 클래스(.bbclass), 설정(.conf)이에요.

1.2 파일 확장자로 보는 메타데이터 지도

 2. 레시피(.bb) — 패키지 하나의 빌드 설명서

2.1 레시피가 담는 것

"A set of instructions for building packages. A recipe describes where you get source code, which patches to apply, how to configure the source, how to compile it and so on."
같은 용어집

레시피 하나는 소프트웨어 하나의 빌드 방법 전체를 담아요: 소스를 어디서 받는지, 어떤 패치를 적용하는지, 어떻게 configure/compile 하는지, 결과물을 어떻게 패키징하는지까지. busybox의 레시피, 커널의 레시피, 여러분이 만든 앱의 레시피가 각각 존재하고, 이미지는 결국 수백 개 레시피의 빌드 결과를 모은 것입니다.

2.2 파일명이 곧 정보 — 이름_버전.bb

레시피 파일명은 규칙이 있어요. 공식 문서의 예시로 matchbox-desktop_1.2.3.bb라면 밑줄 앞부분(matchbox-desktop)이 패키지 이름, 뒷부분(1.2.3)이 버전이 됩니다. BitBake는 이 파일명에서 이름(PN)과 버전(PV) 변수를 자동으로 뽑아내요. 그래서 bitbake busybox라고 치면 BitBake가 busybox_*.bb를 찾아 빌드하는 것이죠. 레시피 내부 문법(SRC_URI, 태스크 함수 등)은 9회차에서 한 줄씩 뜯어봅니다.

📌 실무 팁 — 빌드 에러 메시지에 나오는 busybox-1.36.1-r0 같은 문자열은 이름-버전-리비전(PN-PV-PR) 조합이에요. 이 이름만 보고 find . -name "busybox_*"로 해당 레시피 파일을 바로 찾아가는 것이 Yocto 디버깅의 첫걸음입니다.

 3. 클래스(.bbclass) — 반복을 없애는 상속

3.1 한 번 정의하고 여러 레시피에서 재사용

"Files that provide for logic encapsulation and inheritance so that commonly used patterns can be defined once and then easily used in multiple recipes."
같은 용어집

세상의 오픈소스 대부분은 몇 가지 정형화된 빌드 방식(GNU Autotools, CMake 등)을 따라요. 그 공통 절차를 레시피마다 복사해 넣는 대신, 클래스 파일에 한 번 정의하고 레시피에서 inherit로 가져다 쓰는 구조입니다. 예를 들어 레시피에 inherit autotools 한 줄을 쓰면 ./configure && make && make install에 해당하는 전 과정이 자동으로 붙어요.

3.2 자주 만나는 클래스들

공식 문서(Concepts)가 예시로 드는 클래스만 봐도 역할이 그려져요: autotools*(Autotools 빌드 공통 절차), deploy(산출물 배포), insane(패키지 품질 QA 검사), testimage(이미지 테스트), sstate(공유 상태 캐시 처리). 나중에 커스텀 이미지를 만들 때도 inherit core-image 식으로 클래스 상속이 계속 등장하니, "클래스 = 공통 빌드 로직의 부품"이라는 감각만 잡아두면 됩니다.

 4. 설정 파일(.conf) — 모든 것을 묶는 접착제

4.1 네 곳에 흩어져 있는 .conf

"Configuration data acts as the glue to bind everything together."
Overview Manual, Yocto Project Concepts

.conf는 전역 변수 정의를 담는 파일인데, 어느 폴더에 있느냐로 역할이 나뉩니다:

  • build/conf/local.conf — 사용자 설정. MACHINE(타깃 보드), DL_DIR(소스 캐시), PACKAGE_CLASSES(RPM/DEB/IPK) 같은 내 빌드 환경 결정
  • build/conf/bblayers.conf — "이번 빌드에 어떤 레이어들을 쓸 것인가"의 목록
  • conf/machine/*.conf (BSP 레이어 안) — 프로세서·부트로더·커널 등 하드웨어 설정
  • conf/distro/*.conf (Distro 레이어 안) — 배포판 정책 (예: meta-poky/conf/distro/poky.conf)
  • conf/layer.conf (모든 레이어 안) — 레이어 자신의 등록 정보와 우선순위

4.2 누가 이기는가 — 로딩 순서와 우선순위

같은 변수를 여러 곳에서 정의하면 어떻게 될까요? 공식 문서는 설정 파일이 site.confauto.conflocal.conf 순서로 읽히고, 뒤에 읽힌 값이 덮어쓴다고 설명해요. 또 하나 중요한 규칙 — 배포판 정책 파일의 설정은 local.conf의 같은 설정을 이깁니다:

"Settings you provide in conf/distro/distro.conf override similar settings that BitBake finds in your conf/local.conf."
같은 문서

"local.conf에서 바꿨는데 안 먹힌다"는 단골 증상의 원인이 대부분 여기 있어요. 6회차(local.conf·bblayers.conf)에서 변수 단위로 자세히 다룹니다.

 5. .bbappend와 레이어 우선순위 — 원본을 안 건드리는 수정

5.1 .bbappend의 병합 동작

벤더 레이어의 레시피에 패치 하나만 추가하고 싶을 때, 원본 .bb를 직접 고치면 벤더 업데이트 때마다 충돌 지옥이 열립니다. 대신 내 레이어에 같은 이름의 .bbappend 파일을 만들면 BitBake가 원본 레시피를 읽은 뒤 그 내용을 이어 붙여요.

"Files that append build information to a recipe file."
같은 용어집

파일명 규칙은 원본과 같은 루트 이름이어야 해요. 버전 자리에 % 와일드카드를 쓴 busybox_%.bbappend는 busybox의 어느 버전 레시피에든 적용됩니다 — 벤더가 버전을 올려도 append가 계속 따라붙게 하는 실무 표준 패턴이에요.

5.2 여러 레이어가 겹치면 — BBFILE_PRIORITY

같은 레시피에 여러 레이어가 .bbappend를 붙이면 레이어 우선순위(BBFILE_PRIORITY, 각 레이어의 layer.conf에 정의) 순서대로 차례차례 적용돼요. 숫자가 클수록 우선순위가 높아 나중에 적용되고, 최종 값을 결정합니다.

📌 실무 팁 — "내 bbappend가 안 먹는다" 싶으면 십중팔구 ① 파일명 루트가 원본과 다르거나 ② 다른 레이어가 더 높은 우선순위로 같은 변수를 덮은 경우예요. bitbake-layers show-appends (8회차 예정)로 어떤 append들이 어떤 순서로 붙는지 즉시 확인할 수 있습니다.

 6. 🧪 직접 해보기

1회차에서 클론한 poky 트리에서 오늘 배운 네 가지 파일을 전부 눈으로 찾아봅시다. 파일 위치는 공식 문서 Yocto Project Concepts의 표준 레이어 구조 설명을 따른 것이에요.

cd poky

# 1. 레시피(.bb) — busybox의 빌드 설명서 찾기
ls meta/recipes-core/busybox/
# busybox_x.y.z.bb 파일명에서 이름_버전 규칙 확인

# 2. 클래스(.bbclass) — 공통 로직 부품 창고
ls meta/classes*
# autotools.bbclass, cmake.bbclass 등이 보이는지 확인

# 3. 설정(.conf) — 배포판 정책과 레이어 등록 정보
head -30 meta-poky/conf/distro/poky.conf   # Poky 배포판 정책
cat meta-poky/conf/layer.conf              # BBFILE_PRIORITY 항목 찾아보기

# 4. 어펜드(.bbappend) — 원본을 안 건드리는 수정의 실례
find . -name "*.bbappend" | head

기대 결과: 1번에서 busybox_버전.bb 파일명 규칙을, 2번에서 클래스 파일들을, 3번의 layer.conf에서 BBFILE_PRIORITY_yocto 같은 우선순위 정의를, 4번에서 실제 .bbappend 파일 경로들을 확인하면 오늘 배운 네 파일을 모두 실물로 본 것입니다.

✍️ 내 실행 결과

busybox 레시피


bbclass


poky.conf 배포판 정책


.bbappend 파일

 마무리

오늘은 Yocto 메타데이터의 네 기둥을 정리했어요 — 레시피(.bb)는 패키지 하나의 빌드 설명서, 클래스(.bbclass)inherit로 재사용하는 공통 로직, 설정(.conf)은 위치에 따라 역할이 나뉘는 전역 변수, 어펜드(.bbappend)는 원본을 건드리지 않는 수정 수단. 다음 3회차에서는 이 재료들이 실제로 빌드될 때 내부에서 무슨 일이 벌어지는지 — 태스크 파이프라인(fetch→unpack→patch→…)과 sstate 캐시 — 를 따라가 봅니다.

참고 링크

반응형

댓글