前言
在準備完開發環境之後,接下來就要開始加上我們的設定、服務或是應用了。
主要內容
在進行下列操作前,我們需要先初始化 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
。
我們可以透過下列指令,看到它的輸出結果。
執行結果:
建立我們的 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 進行測試
可以正常的進行編譯,但在最後出現了問題。
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 了。
參考連結
相關頁面