# 커스텀 패키지 생성 및 배포

Yocto 프로젝트에서 커스텀 패키지를 생성하고 배포하는 것은 임베디드 시스템 개발에 매우 중요하다. 이 과정을 통해 사용자 정의 소프트웨어를 빌드 환경에 통합하고, 배포 가능하게 할 수 있다. 다음은 커스텀 패키지 생성 및 배포 과정을 단계별로 상세히 설명한다.

#### 커스텀 레시피 작성

레시피는 `meta` 레이어 안에 배치된다. 일반적으로 레시피는 `meta-yourlayer/recipes-example/example` 디렉토리 구조를 따른다. 만약 `meta-yourlayer` 레이어가 존재하지 않는다면 새로 생성할 수 있다.

```sh
yocto@build $ source oe-init-build-env
yocto@build $ bitbake-layers create-layer meta-yourlayer
yocto@build $ mkdir -p meta-yourlayer/recipes-example/example
```

새 레시피 파일을 생성한다. 예를 들어, `example_1.0.bb` 파일을 다음과 같이 작성할 수 있다:

```sh
yocto@build $ nano meta-yourlayer/recipes-example/example/example_1.0.bb
```

이 파일의 내용은 다음과 같다:

```none
SUMMARY = "An example application"
DESCRIPTION = "This is an example application to demonstrate custom package creation with Yocto Project."
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835c6786c9b48a03588f3b5bc16f9b4"
SRC_URI = "file://example-1.0.tar.gz"
SRC_URI[md5sum] = "d41d8cd98f00b204e9800998ecf8427e"
SRC_URI[sha256sum] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

S = "${WORKDIR}/example-1.0"

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

FILES:${PN} = "${bindir}"
```

#### 소스 코드 및 보조 파일 준비

위 레시피 파일 중 `SRC_URI` 에 명시된 소스 코드를 준비해야 한다. 예제 소스 코드는 다음과 같이 작성할 수 있다:

예제 소스 코드 `example.c` 파일을 작성하고 컴파일 한다:

```c
#include <stdio.h>

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

컴파일 후 tar.gz 파일로 압축한다:

```sh
yocto@build $ gcc -o example example.c
yocto@build $ mkdir example-1.0
yocto@build $ mv example example-1.0/
yocto@build $ tar -czvf example-1.0.tar.gz example-1.0/
yocto@build $ cp example-1.0.tar.gz meta-yourlayer/recipes-example/example/
```

#### 레시피 테스트 및 빌드

커스텀 레시피를 테스트하고 빌드해볼 필요가 있다. 이를 위해 `bitbake` 커맨드를 사용한다.

```sh
yocto@build $ bitbake example
```

#### 결과 확인

빌드가 성공하면, 생성된 패키지는 `tmp/deploy/ipk` 또는 `tmp/deploy/rpm` 디렉토리에 위치하게 된다. 생성된 패키지 파일은 지정한 형식에 따라 다를 수 있다.

```sh
yocto@build $ ls tmp/deploy/ipk/*/example_1.0-r0_*.ipk
```

#### 패키지 배포

생성된 패키지를 최종 목표 장치에 배포하려면 패키지 관리 시스템을 활용할 수 있다. 예를 들어 `opkg`를 사용하는 경우 다음과 같이 할 수 있다:

```sh
root@target $ opkg install /path/to/example_1.0-r0_*.ipk
```

커스텀 패키지를 성공적으로 생성한 후에는 이러한 패키지를 포함한 전체 이미지를 만들어 배포해야 한다. 다음은 Yocto 프로젝트를 통해 커스텀 이미지를 생성하고 배포하는 과정을 상세히 설명한다.

#### 커스텀 이미지 레시피 작성

Yocto 프로젝트는 다양한 이미지 레시피를 제공한다. 예를 들어 `core-image-minimal.bb` 같은 레시피가 있다. 새로운 커스텀 이미지를 생성하려면 기존의 레시피를 참고하여 새로운 레시피 파일을 작성한다.

```sh
yocto@build $ mkdir -p meta-yourlayer/recipes-core/images
yocto@build $ nano meta-yourlayer/recipes-core/images/custom-image.bb
```

`custom-image.bb` 파일의 예시는 다음과 같다:

```none
DESCRIPTION = "Custom Image with example package"
LICENSE = "MIT"

inherit core-image

IMAGE_INSTALL += "example"

```

#### 빌드 환경 설정

`bblayers.conf` 파일에서 커스텀 레이어를 추가하여 빌드 환경을 설정한다.

```sh
yocto@build $ nano conf/bblayers.conf
```

다음 줄을 추가하여 커스텀 레이어 경로를 포함시킨다:

```none
BBLAYERS += " ${BSPDIR}/meta-yourlayer"
```

#### 커스텀 이미지 빌드

이미지 빌드를 시작한다. `bitbake` 커맨드를 사용하여 이미지를 빌드한다.

```sh
yocto@build $ bitbake custom-image
```

#### 결과 확인

빌드가 성공적으로 완료되면, 생성된 이미지 파일은 `tmp/deploy/images/<machine>` 디렉토리에 위치하게 된다.

```sh
yocto@build $ ls tmp/deploy/images/<machine>/
```

예시로 `qemu_x86-64` 머신을 사용한 경우:

```sh
yocto@build $ ls tmp/deploy/images/qemu-x86-64/
```

#### 이미지 배포

생성된 이미지를 최종 장치에 배포하려면 다양한 방식이 있다. 예를 들어, SD 카드나 USB 드라이브를 사용할 수 있다. 이미지 파일을 디스크에 쓰기 위해 `dd` 명령어를 사용한다. 여기서, `/dev/sdX`는 실제 장치 파일 경로로 교체해야 한다.

```sh
yocto@build $ sudo dd if=tmp/deploy/images/qemu-x86-64/custom-image.ext4 of=/dev/sdX bs=4M
yocto@build $ sync
```

#### 테스트

이미지를 최종 장치로 부팅한다. 제대로 부팅되며 커스텀 패키지가 포함된 목적 이미지가 실행되는지 확인한다.

***

이와 같은 과정을 통해 Yocto 프로젝트를 이용하여 맞춤형 이미지를 만들어 배포할 수 있다. 이 과정은 커스텀 패키지가 포함된 보다 구체적인 시스템을 구축하는 데 매우 유용하다.
