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.

Các đầu vào dạng layer của hệ thống build

2.Tạo layer mới

Thiết lập môi trường

Trong thư mục poky:

bash
source oe-init-build-env

Tạo layer bằng bitbake-layers

bash
bitbake-layers create-layer ../meta-helloworld

Lệ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:

bash
meta-helloworld/
├── conf
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-example
    └── example
        └── example_0.1.bb

Thêm layer vào dự án

Cách nên dùng là để công cụ tự sửa bblayers.conf:

bash
bitbake-layers add-layer ../meta-helloworld
bitbake-layers show-layers

Bạ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

bash
mkdir -p ../meta-helloworld/recipes-example/helloworld/files

Viết mã nguồn

Tạo tệp meta-helloworld/recipes-example/helloworld/files/helloworld.c:

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:

bash
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:

  • LICENSE và 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ục files/.
  • S: thư mục chứa mã sau khi giải nén, ở đây là WORKDIR vì 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ùng gcc củ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:

bash
bitbake helloworld

4.Đưa chương trình vào image

Mở build/conf/local.conf và thêm dòng:

bash
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:

bash
bitbake core-image-minimal

5.Chạy thử

bash
runqemu qemux86-64 nographic

Đăng nhập root, rồi gõ:

bash
helloworld

Kế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ục files/ cạnh recipe.
  • Chạy helloworld báo "not found": kiểm tra IMAGE_INSTALL:append đã đúng và đã build lại image.
  • Muốn xem log: tìm trong build/tmp/work/.../helloworld/.../temp/ các tệp log.do_compile và 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.