Yocto · Bài 3/9
Bài 3: Tạo layer đơn giản và thêm chương trình Helloworld trong Yocto
3 lượt đọc3 phút đọc
Trong bài này bạn sẽ tạo một layer riêng và thêm vào đó chương trình Helloworld bằng C, rồi build vào image và chạy thử trên QEMU. Đây là mẫu đầu tiên mà hầu hết dự án Yocto thực tế đều lặp lại: đặt phần mềm của mình vào layer riêng, không sửa trực tiếp layer của Poky.
Bài dùng nhánh scarthgap. Bạn đã có thư mục poky và đã build được core-image-minimal như ở bài đầu tiên.
1.Layer là gì và vì sao cần layer riêng?
Layer là một thư mục gom các recipe, bản vá và cấu hình cùng chủ đề. Layer có thể là:
- Layer phần cứng, ví dụ
meta-raspberrypi. - Layer phần mềm, ví dụ
meta-openembedded. - Layer riêng của dự án, nơi bạn đặt mã và recipe của mình.
Tách riêng layer giúp bạn nâng cấp Poky mà không mất phần việc của mình.

2.Tạo layer mới
Thiết lập môi trường
Trong thư mục poky:
source oe-init-build-envTạo layer bằng bitbake-layers
bitbake-layers create-layer ../meta-helloworldLệnh này tạo layer tên meta-helloworld. Tiền tố meta- là quy ước, helloworld là tên bạn đặt. Layer mới có sẵn cấu trúc cơ bản:
meta-helloworld/
├── conf
│ └── layer.conf
├── COPYING.MIT
├── README
└── recipes-example
└── example
└── example_0.1.bbThêm layer vào dự án
Cách nên dùng là để công cụ tự sửa bblayers.conf:
bitbake-layers add-layer ../meta-helloworld
bitbake-layers show-layersBạn cũng có thể mở build/conf/bblayers.conf và thêm đường dẫn vào biến BBLAYERS bằng tay. Biến này liệt kê các layer mà BitBake sẽ dùng khi build.
3.Thêm chương trình Helloworld
Tạo thư mục recipe
mkdir -p ../meta-helloworld/recipes-example/helloworld/filesViết mã nguồn
Tạo tệp meta-helloworld/recipes-example/helloworld/files/helloworld.c:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}Viết recipe
Tạo tệp meta-helloworld/recipes-example/helloworld/helloworld.bb:
DESCRIPTION = "Simple helloworld application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://helloworld.c"
S = "${WORKDIR}"
do_compile() {
${CC} helloworld.c ${LDFLAGS} -o helloworld
}
do_install() {
install -d ${D}${bindir}
install -m 0755 helloworld ${D}${bindir}
}Giải thích nhanh:
LICENSEvàLIC_FILES_CHKSUM: Yocto bắt buộc khai báo giấy phép, và kiểm tra tệp giấy phép bằng mã băm.SRC_URI: nguồn mã.file://nghĩa là tệp nằm cạnh recipe, trong thư mụcfiles/.S: thư mục chứa mã sau khi giải nén, ở đây làWORKDIRvì chỉ có một tệp.c.do_compile: biên dịch bằng${CC}, trình biên dịch chéo của Yocto, không dùnggcccủa máy host.do_install: chép chương trình vào thư mục ảo${D}.${bindir}thường là/usr/bin.
Thử build riêng recipe này trước khi đưa vào image:
bitbake helloworld4.Đưa chương trình vào image
Mở build/conf/local.conf và thêm dòng:
IMAGE_INSTALL:append = " helloworld"Lưu ý có một dấu cách đứng đầu trong chuỗi " helloworld". Nếu thiếu, tên gói sẽ dính vào gói trước đó.
Build lại image:
bitbake core-image-minimal5.Chạy thử
runqemu qemux86-64 nographicĐăng nhập root, rồi gõ:
helloworldKết quả mong đợi là dòng Hello, World!. Thoát QEMU bằng Ctrl+A rồi X.
6.Nếu có lỗi
- Báo thiếu tệp giấy phép hoặc sai mã băm: kiểm tra lại dòng
LIC_FILES_CHKSUM. - Không tìm thấy
helloworld.c: kiểm tra tệp nằm trong thư mụcfiles/cạnh recipe. - Chạy
helloworldbáo "not found": kiểm traIMAGE_INSTALL:appendđã đúng và đã build lại image. - Muốn xem log: tìm trong
build/tmp/work/.../helloworld/.../temp/các tệplog.do_compilevàlog.do_install.
7.Kết luận
Bạn đã tạo layer riêng, viết recipe đầu tiên, đưa nó vào image và chạy được. Từ đây bạn có thể thêm nhiều recipe, nhiều ứng dụng vào cùng layer. Bài tiếp theo sẽ giới thiệu devtool, công cụ giúp viết và sửa recipe nhanh hơn rất nhiều.
