.bbappend 레시피의 사용 목적

  • 일반적으로 프로젝트에는 필요한 기능을 이미 제공하는 일련의 레이어가 존재한다. 이러한 기존의 레이어에서 특정 요구사항을 반영하기 위해 변경을 가해야한다.
  • 이를 위해서 .bbappend 파일을 활용 할 수 있으며, 이를 통해 기존 레이어 구조를 유지한 채로 변경이 가능하다.
  • .bbappend의 파일명에는 % 와일드카드를 사용할 수 있으며, 주로 패키지의 버전별로 요구사항을 반영할 때 활용가능하다.
  • 예를 들어, app_1.2.3.bb 파일이 존재할 때 다음과 같은 규칙으로 .bbappend 파일을 생성할 수 있다.

 

.bbappend로 .bb에 작성된 태스크 확장방법

  • 앞 “3장: 비트베이크 문법”에서 :append와 :prepend 키워드를 살펴보았었다.
  • 이 두 키워드는 변수의 확장뿐만 아니라 태스크의 확장 또한 가능하다.
do_install:append() {
	# append task
}
  • 예를 들어, 기존 레시피의 do_install()에 추가 태스크를 작업하려면 위와 같이 작성 가능하다.

 

.bbappend로 .bb에 작성된 빌드 옵션 수정 방법

  • Yocto 프로젝트의 경우 다양한 Make, Cargo, Autotools 등 다양한 빌드 시스템을 제공한다. 따라서, Yocto에서는 이를 위해 각 빌드 시스템의 빌드 옵션을 수정할 수 있는 변수들을 제공한다.
빌드 시스템 변수
Autotools EXTRA_OECONF
Cargo EXTRA_OECARGO
CMake EXTRA_OECMAKE
Make EXTRA_OEMAKE
Meson EXTRA_OEMESON
NPM EXTRA_OENPM
SCons EXTRA_OESCONS
WAF EXTRA_OEWAF
  • Autotools 기반의 애플리케이션을 빌드하기 위한 빌드 옵션은 다음과 같이 작성할 수 있다.
# 새 기능 활성화 및 예전 기능 비활성화
EXTRA_OECONF += “--enable-new-feature --disable-old-feature”

# arm 환경일 경우, 새 기능 활성화
EXTRA_OECONF:append:arm = “--enable-new-feature”

 

.bbappend로 .bb에 작성된 소스에 패치를 적용하는 방법

  • 새 패치를 적용해야 하는 경우, 패치 파일을 비트베이크가 찾을 수 있도록 해주어야 한다.
  • 비트베이크는 패키지를 빌드하기 위한 소스 파일의 경로를 FILESPATH 변수로 검색한다.
  • 레시피에서는 일반적으로 FILESPATH를 건들이지 않고 FILESEXTRAPATH를 수정한다.
# 예시 1. 새 패치 적용 방법

FILESEXTRAPATHS:prepend := “${THISDIR}/${PN}-${PV}:”
SRC_URI += “file://newpatch.patch”

—
# 예시 2. 새 설정 설치 방법

FILESEXTRAPATHS:prepend := “${THISDIR}/${PN}-${PV}:”
SRC_URI += “file://newconfig.conf

do_install:append() {
install -D -m 644 ${WORKDIR}/newconfig.conf ${D}${sysconfdir}/newconfig.conf
}
  • 예시 1은 새 패치를 적용하기 위한 .patch 파일을 등록하는 .bbappend 예시이다.
  • 예시 2는 새 설정을 이미지에 설치하기 위한 .conf 파일을 등록하는 .bbappend 예시이다.
  • 예시 1과 2에 사용된 THISDIR과 PN 그리고 PV 변수는 다음과 같은 역할을 한다.
    • THISDIR: 현재 .bbappend가 위치한 디렉터리 경로
    • PN: 패키지 이름 (Ex. app_1.2.3.bbappend에서 app 부분)
    • PV: 패키지 버전 (Ex. app_1.2.3.bbappend에서 1.2.3. 부분) 
  • 비트베이크는 패키지를 빌드하기 위한 소스 파일을 다음과 같은 순서로 검색한다.
    1. <recipe>-<version>/
    2. <recipe>/
    3. files/

  • 주로 패치 파일은 <recipe>/files/ 하위에 존재한다.

 

  • FILESPATH 혹은 FILESEXTRAPATH 등과 같은 변수가 잘 설정되었는지 확인하기 위해 bitbake-getvar 명령을 확인해볼 수 있다.

 

레시피에서 참조하는 rootfs 경로 변수

  • 아래 예시와 같이 레시피에 sysconfdir 등의 경로 변수가 사용되는 경우가 존재한다.
  • 이는 일반적인 리눅스의 rootfs 이미지의 루트(/) 경로를 기반한다.
변수 기본 경로
base_bindir /bin
base_sbindir /sbin
sysconfdir /etc
localstatedir /var
datadir /usr/share
bindir /usr/bin
sbindir /usr/sbin
libdir /usr/lib 또는 /usr/lib64
libexecdir /usr/libexec
includedir /usr/include
  • 기본적으로 이 경로들은 poky/meta/conf/bitbake.conf 파일에서 시작되어 설정된다.
FILESEXTRAPATHS:prepend := “${THISDIR}/${PN}-${PV}:”
SRC_URI += “file://newconfig.conf

do_install:append() {
install -D -m 644 ${WORKDIR}/newconfig.conf ${D}${sysconfdir}/newconfig.conf
}
  • 예를 들어, 위와 같은 .bbappend 레시피 파일이 존재할 경우,
    • ${D}${sysconfdir}은 /tmp/.../image/etc/를 나타낸다.
    • 이렇듯 레시피 결과물은 rootfs 구조를 따라 최종적으로 이미지로 변환되기 전에 임시 저장된다.

 

레시피를 활용해 커널 컴파일 옵션을 변경하는 방법

  • 리눅스 커널은 오픈소스로 관리되는 커널이기 때문에 매우 방대한 소스를 가지고 있다.
  • 그렇기에 커널 컴파일 옵션 설정 또한 패키지 관리에 중요한 능력이라고 볼 수 있다.
  • 본 절에서는 리눅스 커널 컴파일 옵션을 .cfg 파일로 생성하는 방법을 알아본다.
  • 가장 먼저, 아래 명령을 통해서 커널 컴파일 옵션 메뉴를 실행시킨다.
$ bitbake virtual/kernel -c menuconfig
  • 컴파일 옵션 메뉴를 실행시켰으면, 필요한 옵션을 활성화/비활성화한다.
  • 본 절에서는 커널에 CAN 버스를 활성화시키는 것을 예시로 든다.

  • menuconfig을 통해 CAN 버스를 활성화하였다면 Save하여 .config 파일로 저장한다.
  • 그후 아래 명령을 통해서 기존 컴파일 옵션과 다른 부분을 .cfg 파일로 생성해낸다.
$ bitbake virtual/kernel -c diffconfig

  • 생성된 설정 파일(.cfg)에 대한 경로가 출력되는 것을 볼 수 있다.

  • .cfg 파일은 일반적인 리눅스 커널 컴파일을 위한 설정 파일과 동일한 형식임을 확인가능하다.
  • 이렇게 생성된 .cfg 파일과 .bbappend 레시피 파일을 함께 활용해 커널 등의 컴파일 옵션을 수정 가능하다.
  • 이는 KConfig을 활용하는 여러 프로젝트(U-Boot, Linux Kernel, BusyBox 등)에서 활용가능한 방법이다.

 

# 다음 장에서는 실제로 레이어를 구성하고 이를 위한 레시피를 작성해서 컴파일을 완료한 뒤에 라즈베리파이를 부팅시키는 예제를 설명한다.

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기