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ư CC trỏ đúng sang toolchain.
Quá trình tạo SDK trong YoctoToolchain biên dịch chéo của SDK

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:

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

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

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

bash
bitbake core-image-minimal -c populate_sdk

Hoặc tạo SDK mở rộng (extensible SDK, eSDK):

bash
bitbake core-image-minimal -c populate_sdk_ext
  • populate_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ụ devtool như đã 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/:

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

bash
cd ~/yocto/poky/build/tmp/deploy/sdk
./poky-glibc-x86_64-core-image-minimal-core2-64-qemux86-64-toolchain-<phiên-bản>.sh

Khi đượ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:

bash
~/yocto/sdk_install/qemux86-64$ ls
environment-setup-core2-64-poky-linux
site-config-core2-64-poky-linux
sysroots
version-core2-64-poky-linux

Cá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).

Môi trường của SDK

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:

bash
source ~/yocto/sdk_install/qemux86-64/environment-setup-core2-64-poky-linux

Kiể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.

bash
echo $CC

6.Thử nghiệm: biên dịch chương trình Hello SDK

Tạo tệp ~/hello_SDK.c:

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

bash
$CC -o ~/hello_SDK_app ~/hello_SDK.c
file ~/hello_SDK_app

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

bash
scp ~/hello_SDK_app [email protected]:~/

Chạy thử trong QEMU:

bash
root@qemux86-64:~# ./hello_SDK_app
Hello SDK

7.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 -dev của nó vào TOOLCHAIN_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.