본문 바로가기
Yocto

Raspberry Pi 4를 써서 Yocto Project 입문

by 코딩스미스 2022. 9. 19.

준비

우분투에 필요한 패기지 설치

 

$ sudo apt update && sudo apt upgrade -y
$ sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev

라즈베리파이4 타겟으로 빌드

yocto 프로젝트를 설치한다.

poky를 git로 클론한다.

$ mkdir -p ~/Projects/Yocto/
$ cd ~/Projects/Yocto
$ git clone git://git.yoctoproject.org/poky
$ git checkout denfell

raspberrypi용 BSP 레이어와 의존 레이어를 git에서 추가한다.

$ cd ~/Projects/Yocto/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b dunfell
$ git clone git://git.openembedded.org/meta-openembedded -b dunfell

oe-init-build-env를 실행하여 환경을 설정한다.

$ source oe-init-build-env ~/Projects/Yocto/raspberrypi4

raspberrypi용 BSP레이어와 의존 레이어를 추가한다.

conf/bblayers.conf를 직접 편집해도 좋다.

$ bitbake-layers add-layer ../poky/meta-raspberrypi
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-oe
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-python
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-multimedia
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-networking

conf/local.conf 파일을 편집한다.

MACHINE ?= "raspberrypi4-64"

DL_DIR ?= "/home/user/Yocto/downloads"
SSTATE_DIR ?= "/home/user/Yocto/sstate"


## configure username and password
INHERIT_append = " extrausers"
EXTRA_USERS_PARAMS = "usermod -P root root; useradd -P user user;"

# configure build image to wic
IMAGE_FSTYPES = "wic"

# add additional image
## gdbserver for remote debugging
IMAGE_INSTALL_append = " gdbserver"

## ssh server for remote login
EXTRA_IMAGE_FEATURES += "ssh-server-openssh"

## text editor and mc
IMAGE_INSTALL_append = " nano"
IMAGE_INSTALL_append = " mc"

# add sdk on Yocto / not for kernel build
IMAGE_FEATURES += "dev-pkgs tools-debug"
IMAGE_INSTALL_append = " packagegroup-core-buildessential "
TOLLCHAIN_HOST_TASK += "nativesdk-cmake"

크로스 개발을 위한 SDK로 빌드한다.

$ bitbake core-image-minimal
$ bitbake core-image-minimal -c populate_sdk

 

빌드가 완료하면 ~/Projects/Yocto/raspberrypi4/tmp/deploy/images/raspberrypi4-64에 OS이미지가 만들어진다.

bmaptool 명령어를 사용하여 core-image-base-raspberrypi4-64.wic.bz2를 SD카드에 붙여넣는다.

$ cd ~/Projects/Yocto/raspberrypi4/tmp/deploy/images/raspberrypi4-64
$ sudo apt install -y bmap-tools
$ sudo bmaptool copy core-image-base-raspberrypi4-64.wic.bz2 /dev/sdX #sd 카드 디바이스 이름

 

간단한 레시지를 작성

간단하게 소스코드를 작성하여 컴파일한 실행파일을 설치하는 방법을 소개한다.

아래의 문서를 참고한다.

Creating a General Layer Using the bitbke-layers Script

 

$ cd ~/Projects/Yocto/poky
$ bitbake-layers create-layer meta-hello
$ ls meta-hello/
COPYING.MIT  README  conf  recipes-example
$ cd ~/Projects/Yocto/raspberrypi4
$ bitbake-layers add-layer ../poky/meta-hello/
$ cat conf/bblayers.conf
$ cd ~/Projects/Yocto/poky/meta-hello
$ mkdir -p recipes-hello/hello && cd recipes-hello/hello
$ mkdir files && cd files
$ vim hello.c
#include <stdio.h>

int main(int argc, char const *argv[])
{
    printf("Hello, world!\n");
    return 0;
}

다음에 레시피(패키지 빌드하기 위해 사용하는 메타 데이터)를 작성한다.

$ cd ~/Projects/Yocto/poky/meta-hello/recipes-hello/hello
$ vim hello_1.0.bb

레시피 파일 작성방법은 아래 링크를 참조한다.

Hello World .c File Package

그러나, 이대로 빌드하면 실패하므로 TARGET_CC_ARCH += "${LDFLAGS}"을 추가한다.

Default Linker Hash Style Changed

LIC_FILES_CHKSUM 의 md5 를 모를 때는 공백으로 설정하여 빌드 에러 발생과 동시에 올바른 값이 표시되므로 수정하면 된다.

 

SUMMARY = "Simple helloworld application"
SECTION = "hello"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

TARGET_CC_ARCH += "${LDFLAGS}"

SRC_URI = "file://hello.c"

S = "${WORKDIR}"

do_compile() {
    ${CC} hello.c -o hello
}

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

local.conf 파일을 수정하여 이미지 추가를 지정한다.

IMAGE_INSTALL_append = " hello"  # hello 앞에 공백을 넣어야 한다
$ bitbake core-image-minimal

로그인해서 hello 명령어를 실행하면 Hello, World! 가 표시된다.