패키징 형식
패키징은 Yocto 프로젝트의 핵심 작업 중 하나로, 완성된 빌드 산출물들을 효율적으로 배포 및 설치할 수 있도록 한다. Yocto 프로젝트에서는 기본적으로 RPM, DEB, IPK 형식의 패키지를 지원한다. 패키지 형식은 conf/local.conf
파일의 PACKAGE_CLASSES
변수에서 설정할 수 있다.
PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"
위 설정은 RPM, DEB, IPK 형식의 패키지를 모두 생성하도록 Yocto 빌드 시스템에 지시한다. 특정 형식의 패키지만 필요하다면, 해당 형식만 지정하면 된다:
PACKAGE_CLASSES ?= "package_rpm"
레시피 패키지 설치
각 레시피는 특정한 디렉토리 구조를 가지고 있으며, 보통 files
, patches
, recipes
디렉토리를 포함한다. 레시피 파일(.bb
파일)은 패키지를 빌드하고 설치하는 과정에서 어떤 작업을 수행할지 명시하고 있다.
주요 디렉토리 및 파일
files/
: 소스 코드와 패치 파일patches/
: 패치 파일recipes/
: 레시피 파일(.bb
)
레시피 파일은 특정 디렉토리 구조를 가지며, 일반적으로 다음과 같은 구조로 구성된다:
helloworld/
└── helloworld_1.0.bb
예제: helloworld 레시피
helloworld
라는 예제 레시피가 있다고 가정해보겠다. 이 레시피는 간단한 'Hello, World!' 프로그램을 빌드하고 패키징하는 방법을 설명한다.
DESCRIPTION = "Simple helloworld application"
SECTION = "examples"
LICENSE = "MIT"
SRC_URI = "file://helloworld.c"
S = "${WORKDIR}"
do_compile() {
${CC} helloworld.c -o helloworld
}
do_install() {
install -d ${D}${bindir}
install -m 0755 helloworld ${D}${bindir}
}
FILES_${PN} = "${bindir}/helloworld"
레시피 구성 설명
DESCRIPTION
: 패키지에 대한 간단한 설명SECTION
: 패키지 소속 섹션LICENSE
: 패키지의 라이선스SRC_URI
: 소스 파일 경로 (file://
접두어를 사용하면 레시피와 같은 디렉토리 내부의 파일을 가리킨다)S
: 작업 디렉토리 설정do_compile()
: 컴파일 단계. 변수${CC}
는 컴파일러를 가리키며, 지원되는 소스 파일을 컴파일 한다.do_install()
: 설치 단계. 여기서는 빌드된helloworld
바이너리를 설치할 디렉토리를 생성하고 복사한다.FILES_${PN}
: 패키지에 포함될 파일 경로를 설정한다.
RDEPENDS 및 DEPENDS
패키지가 다른 패키지에 의존하는 경우, 이를 명시해야 한다. 두 가지 주요 의존성 변수는 DEPENDS
와 RDEPENDS
이다:
DEPENDS
: 빌드 시 의존성을 의미한다. 예를 들어 컴파일러를 설치할 필요가 있는 경우.RDEPENDS
: 런타임 의존성을 의미한다. 실행 시 필요한 다른 패키지를 지정한다.
예제: 의존성 설정
DEPENDS = "zlib"
RDEPENDS_${PN} = "bash"
위 예제에서는 zlib
패키지가 빌드 시 필요하고, bash
패키지가 실행 시 필요하다는 것을 의미한다.
필수 의존 패키지
의존 패키지를 지정할 때, 기본적으로 사용할 수 있는 다양한 패키지들이 기본 이미지에 포함될 수 있다. 예를 들어, busybox
와 같은 패키지는 많은 임베디드 환경에서 기본적인 유틸리티들을 제공하기 때문에 종종 필요하다.
예제: 기본 환경과 busybox 포함
IMAGE_INSTALL = "busybox"
위 설정은 core-image-minimal
과 같은 기본 이미지에 busybox
패키지를 포함한다. 추가적으로 다른 패키지가 필요하다면 IMAGE_INSTALL
변수에 해당 패키지들을 포함시키면 된다.
IMAGE_INSTALL = "busybox dropbear"
위 설정은 SSH 서버 패키지인 dropbear
를 기본 이미지에 포함시킨다.
패키지 그룹
여러 패키지를 그룹화하여 사용하는 것도 가능한다. 이는 설치 및 유지 관리를 단순화하는 데 유용하다. 패키지 그룹은 meta/meta-Yocto 디렉토리의 layer.conf에서 정의된다.
예제: 패키지 그룹 정의
PACKAGES = "${PN}-base${PN}-extras"
FILES_${PN}-base = "${bindir}/helloworld"
FILES_${PN}-extras = "${bindir}/extra-binary"
위 설정에서 패키지 helloworld
의 기본 바이너리는 -${PN}-base
그룹에 포함되고, 추가 바이너리는 -${PN}-extras
그룹에 포함된다.
패키지 배포 및 설치
Yocto 프로젝트에서는 여러 가지 방법으로 패키지를 배포 및 설치할 수 있다.
RPM 기반 배포
RPM 기반 패키지 시스템은 패키지를 쉽게 관리할 수 있도록 해준다. rpm 명령어를 사용하여 패키지를 설치, 제거 및 업데이트 할 수 있다.
rpm -ivh helloworld-1.0-r0.armv7a.rpm
위 명령어는 컴파일된 helloworld 패키지를 설치한다.
DEB 기반 배포
DEB 기반 패키지 시스템은 주로 Debian 및 Ubuntu 같은 배포판에서 사용된다. dpkg
명령어를 사용하여 DEB 패키지를 설치 할 수 있다.
dpkg -i helloworld_1.0-r0_armv7a.deb
IPK 기반 배포
IPK 패키지 시스템은 오픈소스 임베디드 장치에서 많이 사용된다. opkg
명령어를 사용하여 IPK 패키지를 설치할 수 있다.
opkg install helloworld_1.0-r0_armv7a.ipk
패키지 피드 구성
패키지 피드(Package Feed)를 설정하여, 네트워크를 통해 패키지를 다운로드하고 설치할 수 있게 할 수 있다. 이를 위해서는 패키지 서버를 구성하고, local.conf
파일에서 패키지 피드 URL을 설정해야 한다.
예제: 패키지 피드 설정
FEED_URIS = "http://myserver.com/packages/"
위 설정으로, Yocto 빌드 시스템은 myserver.com
에 있는 패키지 피드를 참조하여 패키지를 다운로드한다.
지금까지 Yocto 프로젝트를 사용하여 패키지를 빌드, 구성 및 설치하는 방법에 대해 다루었다. 패키지 형식, 레시피 작성, 의존성 정의, 배포 및 설치 방법 등을 설명하였다. 이 과정은 대부분의 임베디드 시스템 빌드와 배포에서 중요한 역할을 한다.
이 외에도 Yocto 프로젝트는 다양한 커스터마이징 옵션과 확장성을 제공한다. 각각의 프로젝트 요구사항에 맞는 적절한 설정과 구성 방법을 탐색하고 적용하는 것이 중요하다.