---
# System prepended metadata

title: Yocto 自訂 Layer 與映像檔編譯完整流程
tags: [yocto]

---


# Yocto 添加自訂 Layer 與編譯 HelloWorld 測試

## 1. 初始化環境
```sh
$ source poky/oe-init-build-env helloqemu_build
```

## 2. 建立自訂 Layer
```sh
$ bitbake-layers create-layer hello
$ mv hello ../poky/meta-hello
```

## 3. 添加 Layer
```sh
$ bitbake-layers add-layer ../poky/meta-hello
```

## 4. 確認 Layer 是否成功添加
```sh
$ bitbake-layers show-layers
```
### 預期輸出：
```
NOTE: Starting bitbake server...
layer                 path                                                                    priority
========================================================================================================
core                  /home/macd/test_qemu/poky/meta                                          5
yocto                 /home/macd/test_qemu/poky/meta-poky                                     5
yoctobsp              /home/macd/test_qemu/poky/meta-yocto-bsp                                5
hello                 /home/macd/test_qemu/poky/meta-hello                                    6
```
:::info
目的：
1.檢視當前環境的 Layers：列出目前 Yocto 构建环境中可用的所有層（layers），包含其路徑與優先級。
2.除錯與驗證：幫助開發者確認 layers 是否正確加入 bblayers.conf，確保 Yocto 環境設置無誤。
3.管理與維護 Layers：在開發過程中，隨著不同的 meta-layer（如 meta-openembedded、meta-custom）加入或移除，該指令可以用來檢查當前活躍的 layers。
:::
---

## 5. 設置目錄結構
```sh
$ cd ~/test_qemu/poky/meta-hello/recipes-local
$ tree ./
```
### 預期目錄結構：
```
./
└── helloworld
    ├── files
    │   └── helloworld.c
    └── helloworld_0.1.bb
```

---

## 6. 參考範例 `.bb` 配方檔  
```sh
DESCRIPTION = "A friendly program that prints Hello World!" 
PRIORITY = "optional" 
SECTION = "examples" 

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"


SRC_URI = "file://helloworld.c" 

S = "${WORKDIR}"
 
do_compile() { 
	${CC} ${CFLAGS} ${LDFLAGS} helloworld.c -o helloworld
} 

do_install() { 
	install -d ${D}${bindir} 
	install -m 0755 helloworld ${D}${bindir} 
}
```

::: danger

> LICENSE = "MIT"
> LIC_FILES_CHKSUM = > "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

這兩行可以參考其他 .bb 檔案的寫法，直接複製過來使用即可。
:::
---

## 7.  `local.conf`完整版
```sh

MACHINE ?= "qemuarm"

#
DISTRO ?= "poky"

EXTRA_IMAGE_FEATURES ?= "debug-tweaks"

#

USER_CLASSES ?= "buildstats"

#
# By default disable interactive patch resolution (tasks will just fail instead):
PATCHRESOLVE = "noop"


BB_DISKMON_DIRS ??= "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    HALT,${TMPDIR},100M,1K \
    HALT,${DL_DIR},100M,1K \
    HALT,${SSTATE_DIR},100M,1K \
    HALT,/tmp,10M,1K"


PACKAGECONFIG:append:pn-qemu-system-native = " sdl"

CONF_VERSION = "2"


IMAGE_INSTALL:append = " helloworld "
LICENSE_FLAGS_ACCEPTED = "commercial"

```
:::success
IMAGE_INSTALL:append = " helloworld "
MACHINE ?= "qemuarm"
1️⃣ `IMAGE_INSTALL:append = " helloworld "` → 將 `helloworld` 軟體包加入最終映像檔。  
2️⃣ `MACHINE ?= "qemuarm"` → 指定目標硬體為 QEMU 模擬的 ARM 架構。

:::
---



---

## 9. 編譯 Yocto 映像檔
```sh
$ bitbake core-image-minimal
```

---

## 10. 啟動 QEMU
```sh
$ runqemu qemuarm nographic
```

---
:::success
登入 : root
:::

## 11. 測試 HelloWorld
在 QEMU 內部：
```sh
$ cd /usr/bin
$ ls | grep he
```
### 預期輸出：
```
head
helloworld
hexdump
```

執行 `helloworld`：
```sh
$ helloworld
```

---

這樣就能成功在 Yocto 內建測試 `helloworld` 了 🚀

:::warning
> **如何退出qemu** 
`ps aux | grep qemu`
`kill -9 <PID>`
:::

#  .bb檔內的參數
:::info
使用情境 .bb檔案內有一堆參數，卻不知道參數代表甚麼值
:::
假設我希望知道helloword 內部的D參數，有三個做法**推薦第一個**
1.  `bitbake-getvar -r helloworld  D`
```shell=
macd@macsever:~/test_qemu/helloqemu_build$ bitbake-getvar -r helloworld  D
#
# $D [2 operations]
#   set /home/macd/test_qemu/poky/meta/conf/bitbake.conf:409
#     "${WORKDIR}/image"
#   set /home/macd/test_qemu/poky/meta/conf/documentation.conf:131
#     [doc] "The destination directory."
# pre-expansion value:
#   "${WORKDIR}/image"
D="/home/macd/test_qemu/helloqemu_build/tmp/work/cortexa15t2hf-neon-poky-linux-gnueabi/helloworld/0.1/image"
```
:::success
bitbake-getvar 命令是用來查詢 BitBake 變數的工具，它可以幫助你找到變數在哪些檔案中被定義或修改，並顯示變數的具體值。當你使用這個命令時，除了顯示變數的值，還會告訴你該變數的設定來自於哪個檔案或路徑，這對於調試和追蹤變數的來源非常有用。
:::
2. 透過命令行
```shell! 
bitbake helloworld  -e | grep ^D=
```
```shell!
D="/home/macd/test_qemu/helloqemu_build/tmp/work/cortexa15t2hf-neon-poky-linux-gnueabi/helloworld/0.1/image"
```
3.查看官網(先看官網)
[Variables Glossary](https://docs.yoctoproject.org/ref-manual/variables.html#term-PKGDATA_DIR)

bitbake -c clean helloworld 
會將`<構建目錄>/tmp/work/cortexa15t2hf-neon-poky-linux-gnueabi/helloworld`裡的資料夾全部清除