Yocto · Bài 4/9

Bài 4: Tìm hiểu về devtool trong Yocto

2 lượt đọc5 phút đọc

Viết recipe bằng tay mất nhiều thời gian: tìm mã nguồn, điền giấy phép, sửa, build thử, lặp lại. devtool sinh ra để rút ngắn vòng lặp đó. Nó giúp bạn tạo, sửa và cập nhật recipe nhanh, build và thử phần mềm trước khi đưa vào image cuối cùng.

Bài này dùng nhánh scarthgap. Bạn cần đã có layer meta-helloworld ở bài trước và máy ảo QEMU chạy được.

1.Tổng quan về devtool

Trước hết, thiết lập môi trường build:

bash
cd ~/yocto/poky
source oe-init-build-env

Xem các lệnh con của devtool:

bash
devtool -h

Các lệnh con được chia theo nhóm việc. Nhóm "bắt đầu làm việc với recipe" gồm add (thêm recipe mới), modify (sửa mã của recipe có sẵn) và upgrade (nâng phiên bản recipe). Bài này tập trung vào các lệnh dùng nhiều nhất.

Khi dùng devtool, nó tạo thư mục workspace/ trong thư mục build. Đây là một layer tạm, nơi devtool để mã nguồn và recipe đang làm dở:

  • appends/: các tệp .bbappend ghi lại thay đổi khi bạn modify hoặc upgrade.
  • conf/: cấu hình layer.
  • recipes/: recipe mới tạo bằng devtool add.
  • sources/: mã nguồn. Nếu bạn dùng mã nằm sẵn trên máy, thư mục này sẽ không có mã đó.

2.devtool add: tạo recipe mới

Lệnh này tạo recipe từ mã nguồn trên máy hoặc trên máy chủ git. Ví dụ tạo recipe hello-devtool từ một kho git:

bash
devtool add hello-devtool https://github.com/<ten-ban>/<kho-ma>.git --srcbranch main

Nếu không chỉ nhánh, devtool lấy nhánh mặc định của kho. Sau khi chạy, recipe được tạo tại build/workspace/recipes/hello-devtool/hello-devtool_git.bb với nội dung tự sinh. Vì devtool không đoán được cách build, các hàm do_compile và do_install còn để trống:

bash
LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

SRC_URI = "git://github.com/<ten-ban>/<kho-ma>.git;protocol=https;branch=main"

PV = "1.0+git"
SRCREV = "<ma-commit>"

S = "${WORKDIR}/git"

do_configure () {
    :
}

do_compile () {
    :
}

do_install () {
    :
}

Hai điều cần nhớ:

  • LICENSE = "CLOSED" chỉ để bạn thử. Hãy đặt lại giấy phép đúng của phần mềm trước khi dùng thật.
  • Bạn phải tự điền cách biên dịch và cài đặt nếu mã nguồn không có sẵn Makefile mà devtool nhận ra.

3.devtool build: build recipe

Sửa recipe cho khớp với cấu trúc mã của bạn. Giả sử mã nằm ở thư mục con 00-devtool:

bash
do_compile () {
    ${CC} ${S}/00-devtool/hello_devtool.c ${LDFLAGS} -o ${S}/00-devtool/hello_devtool
}

do_install () {
    install -d ${D}${bindir}
    install -m 0755 ${S}/00-devtool/hello_devtool ${D}${bindir}
}

Rồi build:

bash
devtool build hello-devtool

Để thử trên máy đích, cách chậm nhưng chắc chắn là đưa vào image. Thêm vào local.conf:

bash
IMAGE_INSTALL:append = " hello-devtool"

Build lại image và chạy QEMU:

bash
bitbake core-image-minimal
runqemu qemux86-64 core-image-minimal nographic

Kiểm tra trong QEMU bằng cách chạy /usr/bin/hello_devtool. Devtool cũng có lệnh devtool build-image <ten-image> để build image có kèm các recipe trong workspace.

4.devtool deploy-target: thử nhanh không cần build lại image

Build lại cả image chỉ để thử một chương trình nhỏ rất tốn thời gian. Với deploy-target, devtool chép thẳng chương trình sang thiết bị đang chạy qua SSH. Điều kiện là máy của bạn phải SSH được vào thiết bị.

Thêm SSH vào image để thử với QEMU:

bash
IMAGE_INSTALL:append = " openssh"

Hoặc thêm tính năng ssh-server-openssh vào EXTRA_IMAGE_FEATURES. Sau khi build lại image và chạy QEMU (địa chỉ IP thường là 192.168.7.2), triển khai bằng:

bash
devtool deploy-target hello-devtool [email protected]

Tên recipe đứng trước, user@địa-chỉ-IP của thiết bị đứng sau. Muốn gỡ bỏ thì dùng:

bash
devtool undeploy-target hello-devtool [email protected]

5.devtool finish: đưa recipe vào layer chính thức

Khi đã thử xong và hài lòng, bạn đưa recipe từ workspace vào một layer thật, ví dụ meta-helloworld:

bash
devtool finish hello-devtool ../meta-helloworld

Cấu trúc layer sau khi hoàn tất sẽ có thêm thư mục recipe mới. Workspace được dọn bớt, recipe nằm đúng chỗ.

6.devtool modify: sửa mã của recipe có sẵn

modify lấy mã nguồn của một recipe đã tồn tại về workspace để bạn sửa:

bash
devtool modify hello-devtool

Lệnh này tạo workspace/sources/hello-devtool (một kho git) và một tệp bbappend. Bạn sửa mã, ví dụ thêm một dòng printf, rồi build và thử lại như các bước trên. Khi xong, ghi kết quả về layer:

bash
devtool finish hello-devtool ../meta-helloworld

7.devtool reset: bỏ các thay đổi

Nếu thấy không cần sửa nữa, xóa recipe khỏi workspace:

bash
devtool reset hello-devtool

8.devtool update-recipe: cập nhật recipe từ commit

Sau khi modify, bạn sửa mã trong workspace/sources/hello-devtool rồi commit bằng git:

bash
cd workspace/sources/hello-devtool
git add -A
git commit -m "Update-recipe"

Sau đó cập nhật recipe:

bash
devtool update-recipe hello-devtool

Devtool biến commit của bạn thành bản vá .patch đặt cạnh recipe, và cập nhật SRC_URI. Bạn sẽ thấy các dòng như "Adding new patch" và "Updating recipe". Build lại và thử để kiểm tra kết quả.

9.Bảng nhớ nhanh

  • devtool add: tạo recipe mới từ mã nguồn.
  • devtool modify: lấy mã của recipe có sẵn về để sửa.
  • devtool build: build recipe trong workspace.
  • devtool deploy-target: chép thẳng sang thiết bị để thử nhanh.
  • devtool update-recipe: biến commit thành bản vá trong recipe.
  • devtool finish: đưa recipe và bản vá vào layer rồi dọn workspace.
  • devtool reset: bỏ recipe khỏi workspace.

10.Kết luận

Devtool gom các bước tạo, sửa, build, thử và lưu recipe vào một quy trình ngắn gọn. Khi làm việc hằng ngày với Yocto, bạn sẽ dùng nó rất thường xuyên, đặc biệt là khi phát triển kernel module, như bài sau trong chuỗi.