# 레이어 우선순위 설정

#### 레이어 우선순위의 개념

커스텀 레이어를 생성하여 Yocto 프로젝트에서 사용하려면, 각 레이어의 우선순위를 설정하는 것이 중요하다. 이는 특히 여러 레이어가 동일한 파일을 수정하거나 동일한 패키지를 제공할 때 유용하다. 레이어 우선순위는 Yocto 빌드 시스템(BitBake)에 어떤 레이어가 우선적으로 적용되어야 하는지 알려준다.

#### 우선순위 승인 방법

각 레이어의 우선순위는 `layer.conf` 파일 내에서 설정한다. 이 파일은 보통 레이어 디렉토리의 `conf` 폴더 안에 있다. 우선순위를 설정하는 방법은 `BBFILE_PRIORITY` 변수를 사용하는 것이다.

#### example-layer 레이어 설정 예시

```bash
BBFILE_PRIORITY_example-layer = "90"
```

위 설정은 `example-layer`라는 이름을 가진 레이어의 우선순위를 90으로 설정한다. 숫자가 클수록 높은 우선순위를 의미한다. 예를 들어, 우선순위가 90인 레이어가 80인 레이어보다 먼저 적용된다.

#### 우선순위 적용 시나리오

우선순위는 특정 시나리오에서 특히 유용하다. 예를 들어, 두 개의 레이어(A와 B)가 모두 동일한 레시피 파일을 수정한다고 가정해 봅시다. 이때 우선순위가 높은 레이어의 변경사항이 최종적으로 적용된다.

```plaintext
레이어 A (BBFILE_PRIORITY_A = 50)
레이어 B (BBFILE_PRIORITY_B = 60)
```

이 경우 레이어 B의 변경사항이 최종적으로 적용된다. 왜냐하면 B 레이어의 `BBFILE_PRIORITY` 값이 더 높기 때문이다.

#### 상위 우선순위 레이어의 예

대를 위한 실제 예를 들어보겠다. 상위 우선순위를 가진 레이어를 정의하는 것은 다음과 같은 시나리오에서 유용하다:

1. **하드웨어 특정 패키지 수정**: 특정 하드웨어를 위한 최적화 패치를 적용할 때, 하드웨어 관련 레이어에 더 높은 우선순위를 부여할 수 있다.
2. **보안 패치 빠른 적용**: 보안 레이어에 더 높은 우선순위를 설정하여 보안 패치가 다른 일반 수정사항들보다 먼저 적용되도록 할 수 있다.
3. **커스텀 애플리케이션 레이어**: 특정한 회사 애플리케이션이나 설정이 포함된 커스텀 레이어를 다른 모든 일반 레이어보다 높은 우선순위로 설정하여, 모든 커스터마이징이 확실히 적용되게 할 수 있다.

#### 레이어 종류별 추천 우선순위

일반적으로 사용되는 레이어들에 대해 추천되는 우선순위 값은 다음과 같다:

* **기본 레이어**: 5 - 10
* **기본 환경 설정 레이어**: 20 - 30
* **보안 패치 레이어**: 50 - 60
* **하드웨어 특정 레이어**: 70 - 80
* **프로그램 및 커스터마이징 레이어**: 90+

#### 우선순위 충돌 예방

둘 이상의 레이어가 동일한 우선순위를 가진 경우, Yocto는 무작위로 파일을 선택한다. 이는 예기치 않은 결과를 초래할 수 있으므로, 각 레이어에 고유한 우선순위를 주어 충돌을 예방해야 한다.

#### 예제: layer.conf 파일

아래는 `layer.conf` 파일의 예제이다.

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

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

BBFILE_COLLECTIONS += "example-layer"
BBFILE_PATTERN_example-layer := "^${LAYERDIR}/"
BBFILE_PRIORITY_example-layer = "90"
```

위 예제는 `example-layer`라는 레이어에 대한 설정이다. 이 레이어는 우선순위가 90으로 설정되어 있으며, `bb` 및 `bbappend` 파일들을 포함한다.

### 레이어 관리와 우선순위 최적화

#### 레이어 우선순위 변경 방법

기존 레이어의 우선순위를 변경하려면 해당 레이어의 `layer.conf` 파일을 수정하면 된다. 예를 들어, 다음과 같이 기존 레이어의 우선순위를 조정할 수 있다.

```bash
BBFILE_PRIORITY_existing-layer = "85"
```

이렇게 하면 `existing-layer` 레이어의 우선순위가 85로 변경된다. 필요에 따라 각 레이어의 우선순위를 조정하여 원하는 빌드 결과를 얻을 수 있다.

#### 주의사항

레이어의 우선순위를 조정할 때 몇 가지 주의사항이 있다:

1. **우선순위 중복 방지**: 동일한 값이 여러 레이어에 할당되지 않도록 주의하라. 중복된 우선순위 값은 예기치 않은 결과를 초래할 수 있다.
2. **레이어 의존성**: 특정 레이어가 다른 레이어에 의존하는 경우, 의존하는 레이어의 우선순위를 고려해야 한다. 예를 들어, 커스텀 레이어가 기본 기초 레이어에 의존하는 경우, 기초 레이어의 우선순위가 더 낮아야 한다.
3. **변경 추적**: `layer.conf` 파일을 수정하여 우선순위를 변경한 경우, 버전 관리 시스템을 통해 이러한 변경 사항을 추적하는 것이 좋다. 이는 나중에 문제가 발생했을 때 변경 이력을 확인하는 데 유용하다.

#### 레이어 충돌 해결

복수의 레이어가 동일한 파일을 수정하거나 동일한 패키지를 제공하는 경우 충돌이 발생할 수 있다. 이러한 충돌을 해결하는 방법에는 여러 가지가 있다:

1. **우선순위 재조정**: 우선순위를 조정하여 상위 우선순위를 가진 레이어의 변경 사항이 적용되도록 한다.
2. **파일 분할**: 동일한 기능을 제공하는 파일을 다른 파일로 분리하여 충돌을 피할 수 있다. 예를 들어, 하나의 레이어는 실제 소스 코드를 제공하고 다른 레이어는 설정 파일만 제공하도록 변경할 수 있다.
3. **상속 사용**: 레이어 간 상속을 통해 공통 기능을 재사용할 수 있다. 예를 들면, 공통 설정을 공통 베이스 레이어에 두고, 각 레이어가 이를 상속받아 사용하게 할 수 있다.

#### 우선순위와 비트베이크 노출 검토

BitBake 캐시의 내용을 검토하여 어떤 레이어가 어떤 파일을 제공하는지 확인할 수 있다. 이는 충돌 문제를 디버깅하는 데 유용하다. 예를 들어, `bitbake-layers` 명령을 사용하여 레이어 정보를 검토할 수 있다:

```bash
bitbake-layers show-layers
```

이 명령은 현재 환경에서 사용 가능한 모든 레이어와 그들의 우선순위를 보여준다.

#### 자동화된 우선순위 설정

여러 레이어의 우선순위를 설정하는 작업을 자동화하고 싶다면 스크립트를 작성하여 `layer.conf` 파일을 자동 수정할 수 있다. 예를 들어, Python 스크립트를 통해 여러 레이어의 우선순위를 일괄 변경하도록 할 수 있다.

```python
import os

layers = {
    "layerA": 50,
    "layerB": 60,
    "layerC": 70
}

for layer, priority in layers.items():
    layer_conf_path = f"./{layer}/conf/layer.conf"
    with open(layer_conf_path, 'r') as file:
        data = file.readlines()

    with open(layer_conf_path, 'w') as file:
        for line in data:
            if line.startswith("BBFILE_PRIORITY_"):
                file.write(f"BBFILE_PRIORITY_{layer} = \"{priority}\"\n")
            else:
                file.write(line)
```

이 스크립트는 각 레이어 디렉토리의 `layer.conf` 파일을 찾아 우선순위를 갱신한다.

***

레이어 우선순위 설정은 Yocto 프로젝트에서 매우 중요한 작업이다. 각각의 레이어에 적절한 우선순위를 설정하면 빌드 결과를 예측 가능하게 하고, 충돌을 피하며, 최적화된 빌드 환경을 유지할 수 있다. 위에서 설명한 가이드라인과 주의사항을 참고하여 각 레이어의 우선순위를 신중하게 설정하라.
