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://
: Git 리포지토리에서 소스를 가져온다.branch
와protocol
을 통해 원하는 브랜치와 프로토콜을 지정할 수 있다.http://
: HTTP 프로토콜을 사용하여 소스를 다운로드한다.file://
: 로컬 파일 시스템에서 파일을 참조한다. 이 방법은 주로 패치를 적용할 때 사용된다.
소스 코드도 다운로드 예제
아래는 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"
설명
- 패키지 메타 데이터 정의:
DESCRIPTION
: 패키지에 대한 간단한 설명.LICENSE
: 패키지의 라이선스. 여기서는 MIT 라이선스를 사용한다.-
LIC_FILES_CHKSUM
: 라이선스 파일의 체크섬이다. -
SRC_URI 정의:
-
Git 리포지토리에서 소스를 다운로드하고, 두 개의 패치 파일을 적용한다.
-
SRCREV:
-
다운로드할 소스의 특정 커밋을 지정한다.
-
S 변수:
-
소스 코드가 다운로드될 디렉토리를 지정한다.
-
빌드 과정 정의:
inherit autotools
: Autotools 빌드 시스템을 사용한다.-
do_configure
,do_compile
,do_install
함수는 빌드 과정에서 각각의 단계를 정의한다. -
패치 파일의 체크섬 (선택 사항):
- 각각의 패치 파일에 대한 MD5 및 SHA256 체크섬을 정의하여 파일 무결성을 확인할 수 있다.
이 레시피를 사용하면 Yocto 빌드 시스템은 지정된 Git 리포지토리에서 소스를 다운로드하고, 패치 파일을 적용한 후, 빌드 및 설치 과정을 거치게 된다.