# 새로운 레이어 생성 및 설정

#### 1. 새로운 레이어 생성

Yocto 프로젝트에서 커스텀 레이어를 만드는 첫 번째 단계는 새로운 레이어를 생성하는 것이다. 이는 주로 `bitbake-layers create-layer` 명령어를 사용하여 수행된다. 예를 들어 `meta-mycustomlayer`라는 이름의 레이어를 생성하려면 다음과 같이 명령어를 입력한다:

```bash
bitbake-layers create-layer meta-mycustomlayer
```

이 명령어는 기본 디렉토리 구조와 몇 가지 필수 파일 및 폴더를 포함하는 새로운 레이어를 생성한다.

#### 2. 레이어 디렉토리 구조 이해

생성된 레이어 디렉토리 구조는 다음과 같다:

```
meta-mycustomlayer/
├── conf
│   ├── layer.conf
├── COPYING.MIT
├── README
```

각 파일 및 디렉토리의 역할은 다음과 같다:

* `conf/layer.conf`: 레이어 설정 파일로, 이 파일에는 레이어의 우선순위와 포함해야 하는 다른 레이어 등을 설정한다.
* `COPYING.MIT`: MIT 라이선스 파일로, Yocto 프로젝트는 기본적으로 MIT 라이선스를 사용한다.
* `README`: 레이어에 대한 설명을 포함할 수 있는 읽기 전용 파일이다.

#### 3. layer.conf 파일 설정

`conf/layer.conf` 파일은 레이어의 동작을 정의하는 중요한 파일이다. 이 파일에는 빌드 시스템에 해당 레이어를 어떻게 취급할지 알리는 여러 가지 설정이 포함된다. 기본 `layer.conf` 파일의 예는 다음과 같다:

```bash
BBPATH .= ":${LAYERDIR}"

BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "mycustomlayer"
BBFILE_PATTERN_mycustomlayer = "^${LAYERDIR}/"
BBFILE_PRIORITY_mycustomlayer = "7"

LAYERSERIES_COMPAT_mycustomlayer = "sumo"
```

여기서 중요한 설정 항목들은 다음과 같다:

* `BBPATH`: 빌드 시스템이 레이어의 `conf` 디렉토리와 클래스 디렉토리를 찾을 수 있도록 경로를 추가한다.
* `BBFILES`: 레이어 내의 모든 레시피 파일(.bb 및 .bbappend)을 설정한다.
* `BBFILE_COLLECTIONS`: 레이어의 이름을 정의한다.
* `BBFILE_PATTERN`: 이 레이어의 레시피 파일들이 위치해 있는 경로 패턴을 정의한다.
* `BBFILE_PRIORITY`: 레이어의 우선순위를 설정한다. 값이 클수록 우선순위가 높아진다.
* `LAYERSERIES_COMPAT`: 지원하는 Yocto 버전을 정의한다. 예: "sumo", "thud" 등.

#### 4. 레이어를 빌드 시스템에 추가하기

생성한 레이어를 빌드 환경에서 사용하려면, `bblayers.conf` 파일에 방금 만든 레이어의 경로를 추가해야 한다.

`conf/bblayers.conf` 파일을 열고, 다음 줄을 추가한다:

```bash
BBLAYERS += "${TOPDIR}/../mycustomlayer"
```

이렇게 하면 빌드 시스템이 정의된 레이어를 포함하여 빌드를 수행할 수 있게 된다.

#### 5. 레시피 작성 및 추가

레이어를 생성하고 설정한 후, 원하는 소프트웨어를 빌드하기 위한 레시피를 작성해야 한다. 새로운 레시피를 추가하려면 레이어 디렉토리에 적절한 폴더를 만들어야 한다.

예를 들어, `helloworld`라는 소프트웨어의 레시피를 작성하려면 `meta-mycustomlayer` 디렉토리 내에 `recipes-example/helloworld` 디렉토리를 만들고 그 안에 `.bb` 파일을 생성한다:

```bash
mkdir -p meta-mycustomlayer/recipes-example/helloworld
touch meta-mycustomlayer/recipes-example/helloworld/helloworld_0.1.bb
```

`helloworld_0.1.bb` 파일의 기본 내용은 다음과 같다:

```bash
DESCRIPTION = "Simple helloworld application"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835c4aadcc9f856815b4b026f65342d"

SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"

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

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

FILES_${PN} = "${bindir}/helloworld"
```

위 레시피는 간단한 `helloworld` 프로그램을 빌드하고 설치하는 방법을 정의한다. `SRC_URI`는 소스 파일(`helloworld.c`)이 위치한 경로를 지정한다. `do_compile`과 `do_install` 함수는 각각 컴파일과 설치 과정을 정의한다.

#### 6. 소스 파일 추가

소스 파일(`helloworld.c`)도 레시피 경로에 추가해야 한다. 이를 위해 `files` 디렉토리를 생성하고 소스 파일을 그 안에 넣습니다:

```bash
mkdir -p meta-mycustomlayer/recipes-example/helloworld/files
```

그리고 `helloworld.c` 파일의 내용은 다음과 같다:

```c
#include <stdio.h>

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

이 파일을 `meta-mycustomlayer/recipes-example/helloworld/files` 디렉토리에 저장한다.

#### 7. 빌드 시스템 준비 및 빌드

모든 설정이 완료되면 Yocto 빌드 시스템을 통해 새로운 레시피를 빌드한다. 터미널에서 Yocto 빌드 디렉토리로 이동한 후, 새로운 레시피를 빌드한다:

```bash
bitbake helloworld
```

성공적으로 빌드되었는지 확인하려면 다음 명령어를 사용하여 패키지가 생성되었는지 확인할 수 있다:

```bash
ls tmp/deploy/ipk/*/helloworld_0.1-r0_*.ipk
```

이제 커스텀 레이어를 생성하고 새로운 소프트웨어 레시피를 작성 및 빌드하는 방법을 완전히 이해하셨을 것이다. 이 과정은 실제 프로젝트에 적용될 수 있으며, 다양한 소프트웨어와 설정을 Yocto 프로젝트를 통해 효율적으로 관리하고 배포할 수 있는 방법을 제공한다.
