Skip to content

Overview

Terms and definitions in Yocto

Các khái niệm này được mô tả tại Yocto Reference Manual.

Build Directory

Là khu vực Yocto sử dụng để build hệ thống. Trong trường hợp của Petalinux 2017.4, Build Dir là /build. TOPDIR được sử dụng để lưu trữ đường dẫn đến Build Dir.

Package

Đối tượng tác động đến trong Yocto là Package. Trong đó một application, library, bootloader hay kernel đều được định nghĩa và coi là Package trong phạm vi của Yocto project. Người dùng cần cung cấp các thông tin để Yocto có thể "bake" được từng package, thông tin này được lưu trữ dưới dạng các Recipes file (with .bb extention).

Một package được đặt tên theo dạng: ${PN}-${EXTENDPE}${PV}-${PR}. Trong đó:

  • PN: package name, đồng thời là recipe name của package đó.
  • PV: version of recipe
  • PR: revision of recipe

Các khái niệm này rất hữu ích trong quá trình đọc các recipe files

Bitbake

References

Concept

Yocto xem các packages (khái niệm packages trong Yocto rất rộng, nó có thể là SDK, Linux Kernel, bootloader, gói ứng dụng, thư viên, ...) như là các món ăn, trong đó Bitbake là đầu bếp.

*Bitbake được viết từ Python

Đầu bếp Bitbake nấu các món ăn dưới các công thức được viết sẵn bởi người yêu cầu gọi là recipe (/ˈresəpi/). recipe bản chất là một file có phần mở rộng là .bb. Yocto có một bộ cú pháp dành riêng cho viết recipe.

Working flow

Refer in 4.3.5 tại [2].

Trong Yocto, để thuận tiện cho việc "nấu ăn" được chuyên nghiệp, quá trình "bake" của Bitbake được chia ra các quá trình nhỏ. Tất cả các món ăn đều phải được kiểm tra và thực hiện qua các bước này. Các bước này được định nghĩa tại một class: base.bbclass. Và tất nhiên, người dùng có thể không sử dụng công thức nấu mặc định mà thay đổi các bước này bằng các định nghĩa trong recipe của họ. Các bước đó là

Source Fetching, Patching

do\_fetch -> do_unpack -> do_patch

Configuration, Compilation, and Staging

do_configure -> do_compile -> do_install

do_configure tiến hành các tác vụ cấu hình trước khi build một gói phần mềm. Có thể hình dung quá trình này giống như chạy ./configure trước khi make một chương trình.

do_compile đa phần sẽ tiến hành gọi make đến Makefile của mã nguồn gói phần mềm. Kết quả của quá trình được lưu trữ ngay cùng mới mã nguồn vừa được build. Gọi là directory S/B.

do_install

Copy binarry file from S/B (kết quả của task do_compile) dir to D (image - destination dir). Binary lưu trữ tại thư mục D sẽ được sử dụng cho quá các quá trình do_package, do_packagedatado_populate_sysroot

Package Splitting

do_package, do_packagedata

Một bộ mã nguồn có thể compile một lúc ra rất nhiều ứng dụng, các ứng dụng này có thể được nhóm lại với nhau thành các packages. Ví dụ với mã nguồn libiio có thể build ra được các gói như: libiio, libiio-test (chứa iio_infor), libiio-iiod (chứa IIO Deamon)... Tác dụng của do_package là phân tác các binary (cũng như dữ liệu đi kèm nếu có) thành các gói phần mềm khác nhau.

do_populate_sysroot

Được định nghĩa trong layers/core/meta/classes/staging.bbclass sử dụng để staging kết quả build tail build directory temporary đến build/tmp/work/cortexa9hf-neon-xilinx-linux-gnueabi/libiio/0.15+gitAUTOINC+6ecff5d46e-r0/sysroot-destdir/.

Quá trình -c do_populate_sysroot sẽ tiến hành thêm do_qa_stagingsstate_task_postfunc (được định nghĩa trong sstate.bbclass).

Hàm sstate_task_postfunc sẽ tiến hành stagging file từ sysroot-destdir đến build/tmp/sysroots/plnx_arm. Hiện tại vẫn chưa tìm hiểu được tác dụng của thư mục này cũng như tác dụng của do_populate_sysroot.

RPM Package Generation

do_package_write_rpm

Được định nghĩa trong layers/core/meta/classes/package_rpm.bbclass có nhiệm vu creates RPM packages (i.e. *.rpm files) and places them in the ${DEPLOY_DIR_RPM} directory in the package feeds area. Trong Petalinux 2017.4 (một thực thể ứng dụng Yocto) thì ${DEPLOY_DIR_RPM} được định nghĩa là build/tmp/deploy/rpm. Các gói phần mềm đã được đóng gói dưới định dạng RPM sẽ được đưa đến thư mục này. Ví dụ như các gói trong libiio: (liệt kê các gói tại đây).

Bản chất hàm do_package_rpm trong package_rpm.bbclass sẽ gọi đến công cụ rpmbuild - linux.die.net (một công cụ được sử dụng để build RPM package). Quá trình chạy rpmbuild cần đến SPEC File. Tham khảo thêm về SPEC file tại đây. Quá trình thực hiện rpmbuild được thực hiện tại khu vực build của từng package. Ví dụ trong trường hợp package là libiio:

build/tmp/work/cortexa9hf-neon-xilinx-linux-gnueabi/libiio/0.15+gitAUTOINC+6ecff5d46e-r0

For checking an un-installed RPM pkg, use rpm -qip <name>.rpm. Read more at: https://www.tecmint.com/20-practical-examples-of-rpm-commands-in-linux/

Như vậy, từ các binary được build bởi các tác vụ do_configure/do_compile/do_install, do_package_write_rpm sẽ đóng gói thành các rpm package sẵn sàng cho cài đặt.

Rootfs Generation

do_rootfs

Tiến hành theo package petalinux-user-image.

do_rootfs được định nghĩa tại layers/core/meta/classes/image.bbclass thực hiện tìm một danh sách các package (.rpm, .deb) (thông tin về các packages này được chứa trong biến môi trường PACKAGE_INSTALL) để tiến hành copy đến IMAGE_ROOTFS. Theo định nghĩa của Yocto, IMAGE_ROOTFS là "The location of the root filesystem while it is under construction". Trong một trường hợp thực tế, IMAGE_ROOTFS là:

build/tmp/work/plnx_arm-xilinx-linux-gnueabi/petalinux-user-image/1.0-r0/rootfs

  • What is relation ship between PACKAGE_INSTALL and IMAGE_INSTALL?
  • how Yocto creates these .rpm, .deb packages?

IMAGE_ROOTFS là nơi chứa rootfs, kết quả build của hệ thống. Từ rootfs có thể được đóng gói thành các định dạng khác nhau như: cpio, ext4, ext3, jffs2, ...

do_image_ext3/4

Đóng gói rootfs trong IMAGE_ROOTFS thành các định dạng filesystem ext3/ext4.

Tiến hành đóng gói rootfs dưới định dạng ext3. Bản chất của hàm này sẽ gọi đến oe_mkext234fs được định nghĩa trong layers/core/meta/classes/image_types.bbclass.

Hàm oe_mkext234fs gọi đến mkfs.ext3/4 (là một bộ công cụ đóng gói một bộ tập tin dưới dạng file có thể được sử dụng cho các định dạng ext3/ext4) để tiến hành đóng gói rootfs.

SDK Generation

Recipe syntax

Sharing Functionality

BitBake allows for metadata sharing through include files (.inc) and class files (.bbclass).

inherit: là directive. Ví dụ inherit autotools được sử dụng để kế thừa toàn bộ hàm của class autotools.bbclass. Người dùng có thể "override" các hàm của class được kế thừa bằng cách phát triển các hàm hoặc biến đó sau directive inherit.

Terms and definitions in Bitbake

File Download Support

Bitbake cung cấp cơ chế download/unpack/patching source code. Fetcher (Downloader) tiến hành download source code từ local/remote repository.

Quá trình unpack thực hiện giải nén source code ngay sau quá trình download source code. Unpacker hỗ trợ decompress/extract các file có phần mở rộng như sau: ".Z", ".z", ".gz", ".xz", ".zip", ".jar", ".ipk", ".rpm". ".srpm", ".deb" and ".bz2".

Bitbake variables

${SRC_URI}

The list of source files - local or remote.

Được sử dụng trong recipe file để thông báo cho Yocto source code nào của package sẽ được sử dụng để build. Yocto Fetcher (Downloader) tiến hành download và bổ sung các bản vá vào source code trước khi tiến hành các bước tiếp theo.

${IMAGE_INSTALL}
Used by recipes to specify the packages to install into an image through the image class

${PACKAGES}
The list of packages the recipe creates.

Back to top