Yocto 프로젝트에서 레시피(recipe)를 작성할 때 가장 중요한 단계 중 하나는 소스 코드를 다운로드하고 필요한 패치를 적용하는 것이다. 이 단계에서는 소스 코드의 출처를 지정하고, 다운로드 방법을 정의하며, 필요한 경우 소스 코드에 패치를 추가하여 빌드 과정에서 문제를 해결하거나 기능을 추가할 수 있다.

소스 코드 다운로드

Yocto 레시피에서 소스 코드를 다운로드하는 방법은 SRC_URI 변수를 사용하여 정의할 수 있다. 일반적으로 SRC_URI 변수에는 소스 코드의 위치를 URL 형식으로 지정한다. 아래는 SRC_URI 변수의 예제이다.

SRC_URI = "http://example.com/path/to/source.tar.gz"

Yocto는 다양한 소스 유형을 지원한다. 예를 들어, Git 리포지토리, tarball 파일, 패치 파일 등이 있다. 여러 소스를 동시에 지정할 수도 있으며, 각 소스는 공백으로 구분된다.

아래는 다양한 소스 유형을 사용한 예제이다.

SRC_URI = " \
    git://git.example.com/path/to/repo.git;branch=master;protocol=http \
    http://example.com/path/to/another/source.tar.gz \
    file://localfile.patch \
"

각 소스 유형에 대한 설명은 다음과 같다.

소스 코드도 다운로드 예제

아래는 Git 리포지토리에서 소스를 클론하여 빌드하는 레시피 예제이다.

SRC_URI = "git://git.example.com/path/to/repo.git;branch=master;protocol=https"

SRCREV = "a1b2c3d4e5f6789abcdef01234567890abcdef12"

S = "${WORKDIR}/git"

여기서 SRCREV 변수는 특정 커밋 해시를 지정하여 해당 커밋을 체크아웃하게 한다. S 변수는 소스 코드가 다운로드될 디렉토리를 지정한다.

패치 적용

패치를 적용하기 위해서는 SRC_URI 변수에 file:// 형식을 사용하여 패치 파일을 추가한다. 아래는 패치 파일을 적용하는 예제이다.

SRC_URI = " \
    git://git.example.com/path/to/repo.git;branch=master;protocol=https \
    file://fix-issue.patch \
    file://add-feature.patch \
"

패치 파일은 레시피 파일과 동일한 디렉토리 또는 files 서브 디렉토리에 위치해야 한다.

Yocto는 다운로드된 소스 코드에 자동으로 패치를 적용한다. 패치 파일의 순서는 SRC_URI 변수에 정의된 순서에 따른다.

패치 파일의 예제

아래는 간단한 패치 파일의 예제이다. 이 패치는 main.c 파일에서 특정 버그를 수정한다.

diff --git a/main.c b/main.c
index 1234567..89abcdef 100644
--- a/main.c
+++ b/main.c
@@ -10,7 +10,7 @@ int main() {
     int x = 10;
     int y = 20;
     // 버그 수정: 올바른 변수명 사용
-    printf("%d\n", x + z);
+    printf("%d\n", x + y);
     return 0;
 }

이는 기존의 main.c 파일에서 z 변수를 y 변수로 수정하는 패치이다. 패치 파일은 일반적으로 .patch 확장자를 가지며, diff 명령어를 사용해 생성할 수 있다.

패치를 포함한 Yocto 레시피

지금까지 설명한 내용을 바탕으로 Git 리포지토리에서 소스를 다운로드하고 패치를 적용하는 Yocto 레시피 예제를 작성해보겠다.

DESCRIPTION = "A description of my package"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT"

SRC_URI = " \
    git://git.example.com/path/to/repo.git;branch=master;protocol=https \
    file://fix-issue.patch \
    file://add-feature.patch \
"

SRCREV = "a1b2c3d4e5f6789abcdef01234567890abcdef12"
S = "${WORKDIR}/git"

inherit autotools

do_configure() {
    oe_runconf
}

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 ${S}/mybinary${D}${bindir}/mybinary
}

SRC_URI[fix-issue.patch.md5sum] = "d41d8cd98f00b204e9800998ecf8427e"
SRC_URI[fix-issue.patch.sha256sum] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
SRC_URI[add-feature.patch.md5sum] = "d41d8cd98f00b204e9800998ecf8427e"
SRC_URI[add-feature.patch.sha256sum] = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"

설명

  1. 패키지 메타 데이터 정의:
  2. DESCRIPTION: 패키지에 대한 간단한 설명.
  3. LICENSE: 패키지의 라이선스. 여기서는 MIT 라이선스를 사용한다.
  4. LIC_FILES_CHKSUM: 라이선스 파일의 체크섬이다.

  5. SRC_URI 정의:

  6. Git 리포지토리에서 소스를 다운로드하고, 두 개의 패치 파일을 적용한다.

  7. SRCREV:

  8. 다운로드할 소스의 특정 커밋을 지정한다.

  9. S 변수:

  10. 소스 코드가 다운로드될 디렉토리를 지정한다.

  11. 빌드 과정 정의:

  12. inherit autotools: Autotools 빌드 시스템을 사용한다.
  13. do_configure, do_compile, do_install 함수는 빌드 과정에서 각각의 단계를 정의한다.

  14. 패치 파일의 체크섬 (선택 사항):

  15. 각각의 패치 파일에 대한 MD5 및 SHA256 체크섬을 정의하여 파일 무결성을 확인할 수 있다.

이 레시피를 사용하면 Yocto 빌드 시스템은 지정된 Git 리포지토리에서 소스를 다운로드하고, 패치 파일을 적용한 후, 빌드 및 설치 과정을 거치게 된다.