Friday, January 10, 2025

 Nhân build YOCTO - Build SDK

1. Mục tiêu

- Bình thường chúng ta cần phải download source của kernal về và một số BSP để build OS. Thay vì vậy mình sử dụng yocto project để build SDK cho đồng bộ

2. Build SDK

vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build$ bitbake core-image-minimal -c populate_sdk

Loading cache: 100% |#############################################################################################################################| Time: 0:00:00

Loaded 1306 entries from dependency cache.

NOTE: Resolving any missing task queue dependencies


Build Configuration:

BB_VERSION           = "1.44.0"

BUILD_SYS            = "x86_64-linux"

NATIVELSBSTRING      = "universal"

TARGET_SYS           = "i686-poky-linux"

MACHINE              = "qemux86"

DISTRO               = "poky"

DISTRO_VERSION       = "3.0.4"

TUNE_FEATURES        = "m32 core2"

TARGET_FPU           = ""

meta                 

meta-poky            

meta-yocto-bsp       

meta-skeleton        = "zeus:daf096e295121ea49ebf21f8070e9a6e28f5d46c"


Initialising tasks: 100% |########################################################################################################################| Time: 0:00:01

Sstate summary: Wanted 352 Found 0 Missed 352 Current 472 (0% match, 57% complete)

NOTE: Executing Tasks

NOTE: Setscene tasks completed

NOTE: Tasks Summary: Attempted 3058 tasks of which 2051 didn't need to be rerun and all succeeded.


3. Run SDK installer

- Đầu tiên chúng ta cần cài đặt SDK vào host (cái máy dùng để build kernel). Cái SDK installer này là mấy file .sh (shell script), nó sẽ được tìm thấy trong "build/tmp/deploy/sdk" ở đây mình sử dụng "core-image-minimal" nên mọi người có thể sử dụng "poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.sh" để cài đặt SDK.  


vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build$ cd tmp/deploy/sdk

vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build/tmp/deploy/sdk$ tree -L 1 .

.

├── poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.host.manifest

├── poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.sh

├── poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.target.manifest

└── poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.testdata.json


0 directories, 4 files



***Chú ý: SDK installer sẽ hỏi mọi nguời thư mục cài đặt SDK

vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build/tmp/deploy/sdk$ ./poky-glibc-x86_64-core-image-minimal-core2-32-qemux86-toolchain-3.0.4.sh 

Poky (Yocto Project Reference Distro) SDK installer version 3.0.4

=================================================================

Enter target directory for SDK (default: /opt/poky/3.0.4): /home/vbuser/Desktop/selfstudy/SDK

You are about to install the SDK to "/home/vbuser/Desktop/selfstudy/SDK". Proceed [Y/n]? Y

Extracting SDK.............................................done

Setting it up...done

SDK has been successfully set up and is ready to be used.

Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.

 $ . /home/vbuser/Desktop/selfstudy/SDK/environment-setup-core2-32-poky-linux



4. Using the SDK

- Chúng ta có thể sử dụng cái SDK để dev application

4.1. Run SDK environment setup script

- Tạo một cái working directory để chứa một cái example app để sử dụng SDK.
- Sao đó chúng ta chúng ta chạy environment để sử dụng SDK, à chú ý: chúng ta đứng ở thư mục mới tạo và source environment trong thư mục SDK đã cài đặt

vbuser@Ubuntu18:~/Desktop/selfstudy$ mkdir App_Workspace

vbuser@Ubuntu18:~/Desktop/selfstudy$ cd App_Workspace/

vbuser@Ubuntu18:~/Desktop/selfstudy/App_Workspace$ source ../SDK/

environment-setup-core2-32-poky-linux  site-config-core2-32-poky-linux        sysroots/                              version-core2-32-poky-linux

vbuser@Ubuntu18:~/Desktop/selfstudy/App_Workspace$ source ../SDK/environment-setup-core2-32-poky-linux 


4.2. Bây giờ chúng ta tạo hello world bằng code C thôi


vbuser@Ubuntu18:~/Desktop/selfstudy/App_Workspace$ cat helloworld.c 

#include <stdio.h>



void main()

{

printf("Hello world \r\n");

}


vbuser@Ubuntu18:~/Desktop/selfstudy/App_Workspace$ cat Makefile 

all: helloworld

$(CC) helloworld.c -o helloworld

clean:

rm helloworld


vbuser@Ubuntu18:~/Desktop/selfstudy/App_Workspace$ make

i686-poky-linux-gcc  -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/home/vbuser/Desktop/selfstudy/SDK/sysroots/core2-32-poky-linux  -O2 -pipe -g -feliminate-unused-debug-types   -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -fstack-protector-strong -Wl,-z,relro,-z,now  helloworld.c   -o helloworld

i686-poky-linux-gcc  -m32 -march=core2 -mtune=core2 -msse3 -mfpmath=sse -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/home/vbuser/Desktop/selfstudy/SDK/sysroots/core2-32-poky-linux helloworld.c -o helloworld


--> Mọi người có thể thấy rằng, nó sử dụng i686-poky-linux-gcc (cái này là compiler của yocto build cho core-image-minimal) mọi người có thể copy vào máy ảo chạy ./helloworld để xem kết quả.

Wednesday, January 8, 2025



Nhân build YOCTO - How to add a custom app (such as helloworld) to Root File System


1. Tạo meta layer để chứa recipe example để chứa app hellowold của mình

vbuser@Ubuntu18:~/Desktop/selfstudy$ tree -L 1 .

.

├── meta-example

└── poky


2. tạo file conf cho meta-example trong folder conf

vbuser@Ubuntu18:~/Desktop/selfstudy/meta-example$ cat conf/layer.conf 

# We have a conf and classes directory, add to BBPATH

BBPATH .= ":${LAYERDIR}"


# We have recipes-* directories, add to BBFILES

BBFILES += "${LAYERDIR}/recipe-*/*/*.bb \

${LAYERDIR}/recipe-*/*/*.bbappend"


BBFILE_COLLECTIONS += "meta-example"

BBFILE_PATTERN_meta-example = "^${LAYERDIR}/"

BBFILE_PRIORITY_meta-example = "6"


*** chú ý:

BBFILE_COLLECTIONS: theo sao đó là tên của meta của mình

BBFILE_PATTERN_meta-example: BBFILE_PATTERN theo vào sao là tên của meta

BBFILE_PRIORITY_meta-example: cái này cũng vậy, theo sao BBFILE_PRIORITY là tên của meta

BBFILES: nó sẽ search những file recipe ở trong pattern này, do đó khi mình đặt tên theo format recipe-<name>


3. tạo recipe-custom trong đây sẽ chứa những app của mình

vbuser@Ubuntu18:~/Desktop/selfstudy/meta-example$ tree -L 4 .

.

├── conf

│   └── layer.conf

└── recipe-custom

    └── helloworld

        ├── files

        │   └── helloworld.c

        └── helloworld_0.1.bb


4. tạo file helloworld_0.1.bb 

cái tên file cũng phải theo format: <tên recipe>_<version recipe>.bb

Dưới đây là nội dung của file .bb:

vbuser@Ubuntu18:~/Desktop/selfstudy/meta-example$ cat recipe-custom/helloworld/helloworld_0.1.bb 

DESCRIPTION = "Simple helloworld application"

LICENSE = "CLOSED"


SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"


TARGET_CC_ARCH += "${LDFLAGS}"


do_compile() {

${CC} helloworld.c -o helloworld

}


do_install() {

install -d ${D}${bindir}

install -m 0755 helloworld ${D}${bindir}

}


chú ý:

+ TARGET_CC_ARCH += "${LDFLAGS}": để bypass lỗi QA, "ERROR: helloworld-0.1-r0 do_package_qa: QA Issue: No GNU_HASH in the ELF binary /home/vbuser/Desktop/selfstudy/poky/build/tmp/work/core2-32-poky-linux/helloworld/0.1-r0/packages-split/helloworld/usr/bin/helloworld, didn't pass LDFLAGS? [ldflags]"


5. tạo file helloworld.c vào lưu nó vào thư mục "files"


vbuser@Ubuntu18:~/Desktop/selfstudy/meta-example$ cat recipe-custom/helloworld/files/helloworld.c 

#include <stdio.h>


int main()

{

printf("hello world \r\n");

return 0;

}


6. Bây giờ tiến hành sử dụng bitbake để build helloworld xem được không

- Trước khi chạy bitbake thì mình cần phải qua về build trước nha.

vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build$ bitbake helloworld

WARNING: Layer meta-example should set LAYERSERIES_COMPAT_meta-example in its conf/layer.conf file to list the core layer names it is compatible with.

WARNING: Layer meta-example should set LAYERSERIES_COMPAT_meta-example in its conf/layer.conf file to list the core layer names it is compatible with.

Loading cache: 100% |#############################################################################################################################| Time: 0:00:00

Loaded 1302 entries from dependency cache.

NOTE: Resolving any missing task queue dependencies


Build Configuration:

BB_VERSION           = "1.44.0"

BUILD_SYS            = "x86_64-linux"

NATIVELSBSTRING      = "universal"

TARGET_SYS           = "i686-poky-linux"

MACHINE              = "qemux86"

DISTRO               = "poky"

DISTRO_VERSION       = "3.0.4"

TUNE_FEATURES        = "m32 core2"

TARGET_FPU           = ""

meta                 

meta-poky            

meta-yocto-bsp       = "zeus:daf096e295121ea49ebf21f8070e9a6e28f5d46c"

meta-example         = "master:8148d045406cbb2b66a6848ea93371808d206323"


Initialising tasks: 100% |########################################################################################################################| Time: 0:00:00

Sstate summary: Wanted 0 Found 0 Missed 0 Current 76 (0% match, 100% complete)

NOTE: Executing Tasks

NOTE: Setscene tasks completed

NOTE: Tasks Summary: Attempted 476 tasks of which 476 didn't need to be rerun and all succeeded.


Summary: There were 2 WARNING messages shown.


--> Đấy, nó build thành công rồi đó


7. Bây giờ build lại image xem nó có được add vào root file system chưa nhé.!!!


vbuser@Ubuntu18:~/Desktop/selfstudy/poky/build$ runqemu qemux86 nographic


8. Chạy máy ảo lên xem đã có helloworld trong đó chưa nhé.!!! 


qemux86 login: root

root@qemux86:~# helloworld 

hello world 


--> Đấy nó in được hello world ra rồi đó