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:
cd ~/yocto/poky
source oe-init-build-envXem các lệnh con của devtool:
devtool -hCá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.bbappendghi lại thay đổi khi bạnmodifyhoặcupgrade.conf/: cấu hình layer.recipes/: recipe mới tạo bằngdevtool 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:
devtool add hello-devtool https://github.com/<ten-ban>/<kho-ma>.git --srcbranch mainNế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:
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:
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:
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:
IMAGE_INSTALL:append = " hello-devtool"Build lại image và chạy QEMU:
bitbake core-image-minimal
runqemu qemux86-64 core-image-minimal nographicKiể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:
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:
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:
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:
devtool finish hello-devtool ../meta-helloworldCấ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:
devtool modify hello-devtoolLệ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:
devtool finish hello-devtool ../meta-helloworld7.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:
devtool reset hello-devtool8.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:
cd workspace/sources/hello-devtool
git add -A
git commit -m "Update-recipe"Sau đó cập nhật recipe:
devtool update-recipe hello-devtoolDevtool 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.
