Yocto · Bài 6/9
Bài 6: Build SDK bằng Yocto
3 lượt đọc4 phút đọc
Khi hệ điều hành đã chạy trên thiết bị, bạn cần một cách để viết và biên dịch ứng dụng cho nó mà không phải build lại cả image mỗi lần. Đó là việc của SDK (Software Development Kit). Bài này hướng dẫn tạo SDK bằng Yocto nhánh scarthgap, cài lên máy host và biên dịch thử một chương trình để chạy trên máy ảo QEMU.
1.SDK gồm những gì?
Một SDK chuẩn cho hệ thống nhúng gồm:
- Toolchain biên dịch chéo (cross-compile): trình biên dịch, trình gỡ lỗi... chạy trên máy host nhưng tạo ra tệp chạy được trên thiết bị đích.
- Thư viện và tệp header: những gì ứng dụng cần để liên kết với hệ thống đích.
- Script thiết lập môi trường: để các biến như
CCtrỏ đúng sang toolchain.


2.Cách 1: cài công cụ phát triển ngay trên image
Nếu muốn có gcc, make ngay trên thiết bị, thêm vào build/conf/local.conf:
EXTRA_IMAGE_FEATURES += "tools-sdk"Tên tính năng là tools-sdk (có dấu gạch ngang). Build lại image và kiểm tra:
bitbake core-image-minimal
runqemu qemux86-64 nographicTrong QEMU, gõ gcc --version và make --version để kiểm tra. Cách này tiện để thử nhanh, nhưng nó làm image lớn hơn nhiều và biên dịch trực tiếp trên thiết bị yếu thì rất chậm. Vì vậy với phát triển thật, người ta thường dùng cách 2.
3.Cách 2: tạo bộ cài SDK để dùng trên máy host
Yocto tạo ra tệp cài đặt SDK bằng tác vụ populate_sdk:
bitbake core-image-minimal -c populate_sdkHoặc tạo SDK mở rộng (extensible SDK, eSDK):
bitbake core-image-minimal -c populate_sdk_extpopulate_sdk: SDK tiêu chuẩn, gồm toolchain, thư viện và header.populate_sdk_ext: SDK mở rộng, có thêm công cụdevtoolnhư đã giới thiệu ở bài trước, giúp thêm và sửa recipe ngay trong SDK. Dung lượng lớn hơn đáng kể.
Sau khi build xong, tệp cài đặt nằm trong build/tmp/deploy/sdk/:
ls -l tmp/deploy/sdk/Bạn sẽ thấy tệp .sh có tên dạng poky-glibc-x86_64-core-image-minimal-core2-64-qemux86-64-toolchain-<phiên-bản>.sh, cùng các tệp manifest liệt kê gói trong SDK.
4.Cài SDK lên máy host
Chạy tệp .sh đó. Bạn có thể chọn thư mục cài hoặc dùng mặc định /opt/poky/<phiên-bản>:
cd ~/yocto/poky/build/tmp/deploy/sdk
./poky-glibc-x86_64-core-image-minimal-core2-64-qemux86-64-toolchain-<phiên-bản>.shKhi được hỏi thư mục đích, nhập ví dụ ~/yocto/sdk_install/qemux86-64/. Sau khi cài xong, thư mục có dạng:
~/yocto/sdk_install/qemux86-64$ ls
environment-setup-core2-64-poky-linux
site-config-core2-64-poky-linux
sysroots
version-core2-64-poky-linuxCác thư mục trong sysroots gồm một phần cho máy host (công cụ biên dịch) và một phần cho máy đích (thư viện, header).

5.Dùng SDK: nạp môi trường
Mỗi cửa sổ terminal mới cần nạp môi trường SDK trước khi biên dịch:
source ~/yocto/sdk_install/qemux86-64/environment-setup-core2-64-poky-linuxKiểm tra biến PATH sẽ thấy đường dẫn của toolchain SDK đứng đầu. Các biến CC, CXX, CFLAGS, LDFLAGS cũng đã được đặt đúng để biên dịch chéo.
echo $CC6.Thử nghiệm: biên dịch chương trình Hello SDK
Tạo tệp ~/hello_SDK.c:
#include <stdio.h>
int main()
{
printf("Hello SDK\n");
return 0;
}Biên dịch bằng $CC của SDK (không dùng gcc của máy host):
$CC -o ~/hello_SDK_app ~/hello_SDK.c
file ~/hello_SDK_appLệnh file sẽ cho thấy đây là tệp chạy được cho kiến trúc x86-64 nhưng liên kết với thư viện của hệ thống đích. Chạy QEMU ở một cửa sổ khác rồi chép tệp sang thiết bị:
scp ~/hello_SDK_app [email protected]:~/Chạy thử trong QEMU:
root@qemux86-64:~# ./hello_SDK_app
Hello SDK7.Lưu ý thực tế
- SDK gắn với image và machine bạn đã build. Đổi thư viện trong image thì nên tạo lại SDK.
- Muốn có header của thêm một thư viện (ví dụ
curl) trong SDK, thêm bản-devcủa nó vàoTOOLCHAIN_TARGET_TASK, ví dụTOOLCHAIN_TARGET_TASK:append = " curl-dev", rồi tạo lại SDK. - Khi chia sẻ SDK cho cả nhóm, chỉ cần gửi tệp
.sh. Mọi người cài và dùng được ngay mà không cần build Yocto.
8.Kết luận
SDK giúp tách việc phát triển ứng dụng khỏi việc build hệ điều hành. Nhà phát triển ứng dụng chỉ cần cài SDK, nạp môi trường và biên dịch như bình thường, còn người quản lý Yocto lo việc tạo ra SDK phù hợp.
