Yuan のノート
心之所至,隨意亂書
Yocto First Layer
Wed Jul 28, 2021
🏷️

前言

在準備完開發環境之後,接下來就要開始加上我們的設定、服務或是應用了。

主要內容

在進行下列操作前,我們需要先初始化 Yocto 環境,如果還不知道要如何進行的同學,可以參考這邊

建立我們的 “層”

建議是將我們的 Layer 放在建置資料夾( first-build )的外面。所以我們將在它的上一層目錄建立我們的 Layer meta-first-layer

1
2
3
4
cd ..
ls # first-build poky 
bitbake-layers create-layer meta-first-layer
ls # first-build meta-first-layer poky 

加入我們的 “層”

在建置資料夾( first-build ) 中執行下列指令,它會幫我們更新 conf/bblayer.bb 的內容。

1
2
cd first-build
bitbake-layers add-layer ../meta-first-layer

Recipes-example

我們在建立 meta-first-layer 時,bitbake-layers 會順便幫我們建立 recipes-example。 我們可以透過下列指令,看到它的輸出結果。

1
bitbake example

執行結果:

執行結果

執行結果

建立我們的 Recipes-Hello

Yocto 專案提供了許多便捷的工具,其中 recipetool 與 devtool 便是與 Recipes 較為相關。
接下來我們將會使用 recipetool 來建立我們的 Recipes。

建立 recipes-hello 資料夾,並在 files 中放入我們的源始碼。

1
2
mkdir -p recipes-hello/hello/files
cd recipes-hello/hello

main.c:

1
2
3
4
5
6
#include <stdio.h>

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

Makefile:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
SRCS := main.c
OBJS := $(SRCS:.c=.o)
bindir ?= /usr/bin

TARGET := hello

all: $(TARGET)

%.o : %.c
	$(CC) -c $< -o $@ ${LDFLAGS}

$(TARGET) : $(OBJS)
	$(CC) $^ -o $@ ${LDFLAGS}

install:
	install -d $(DESTDIR)$(bindir)
	install -m 755 $(TARGET) $(DESTDIR)$(bindir)/

使用 recipetool 建立 recipe

1
recipetool create -o hello_0.1.bb files

修改產生出的 hello_0.1.bb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

SRC_URI = " \
           file://main.c \
           file://Makefile \
           "

S = "${WORKDIR}"

do_configure () {
}

do_compile () {
	oe_runmake
}

do_install () {
    oe_runmake install 'DESTDIR=${D}'
}

回到 first-build 進行測試

1
bitbake hello

可以正常的進行編譯,但在最後出現了問題。

ERROR: hello-0.1-r0 do_package_qa: QA Issue: File /usr/bin/hello in package hello doesn’t have GNU_HASH (didn’t pass LDFLAGS?) [ldflags]
ERROR: hello-0.1-r0 do_package_qa: QA run found fatal errors. Please consider fixing them.
ERROR: Logfile of failure stored in: /home/yuan/first-build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/hello/0.1-r0/temp/log.do_package_qa.2726283
ERROR: Task (/home/yuan/meta-first-layer/recipes-hello/hello/hello_0.1.bb:do_package_qa) failed with exit code ‘1’

參考這篇文章修改 hello_0.1.bb

1
2
3
4
5
6
do_install () {
    oe_runmake install 'DESTDIR=${D}'
}
+
+ INSANE_SKIP_${PN} = "ldflags"
+ INSANE_SKIP_${PN}-dev = "ldflags"

建立我們的 image

在 recipes-hello 中建立 images 資料夾。

1
2
3
mkdir -p recipes-hello/images
cd recipes-hello/images
cp ../../../poky/meta/recipes-core/images/core-image-minimal.bb hello-image.bb

hello-image.bb:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SUMMARY = "A hello image that just for testing our layer"

LICENSE = "MIT"

IMAGE_INSTALL = "packagegroup-core-boot ${CORE_IMAGE_EXTRA_INSTALL} hello"

inherit core-image

IMAGE_ROOTFS_SIZE ?= "8192"
IMAGE_ROOTFS_EXTRA_SPACE_append = "${@bb.utils.contains("DISTRO_FEATURES", "systemd", " + 4096", "" ,d)}"

回到 first-build 進行測試

1
2
bitbake hello-image
runqemu hello-image nographic slirp

另一個建立 Recipes-hello 的方法

在工作目錄 ( first-build ) 使用 devtool 加入我們寫好的 hello 至 工作目錄中。

1
devtool add hello ../hello

這個動作會幫我們在 conf/bblayer.bb 中加入 workspace 層,並建立 workspace/recipes/hello 資料夾。

使用下列指令編譯 hello

1
2
devtool build hello
ls 

可以發現它確實多了 Workspace Layer

使用 devtool 建立臨時測試用的 image,並使用 qemu 進行驗證。

1
2
devtool build-image core-image-minimal
runqemu core-image-minimal nographic slirp

在測試沒有問題之後,再使用 devtool 將 hello 加入我們的 Layer

1
devtool finish hello ../meta-first-layer

小結

我們已經建立了自己的 Layer、Recipe 以及 Image。 接下來我們就可以試著建立屬於我們的 Distribution 和 Machine 了。

參考連結

相關頁面