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à
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
-
[1] Bitbake User Manual - yoctoproject.org
-
[2] Yocto Project Overview and Concepts Mannual - yoctoproject.org
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_packagedata
và do_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_staging
và sstate_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
andIMAGE_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
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
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
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.