第三章:在 buildroot 框架中添加本地的 hello_world 軟件包以及給包打patch
在第二章介紹了在buildroot框架下快樂編譯 ffmpeg之后,本章就記錄下如何在buildroot 的編譯框架中添加一個(gè)新的軟件包實(shí)現(xiàn)開發(fā)的一致性,這樣做的好處是保持整個(gè)構(gòu)建過程的統(tǒng)一,要不然可能還需要自己構(gòu)建自己工程的編譯環(huán)境,兼容buildroot編譯框架的好處會(huì)隨著開發(fā)軟件包的復(fù)雜度提高逐漸顯示出來這種做法的優(yōu)越性。所以,本章就演示下如何根據(jù) The Buildroot User Manual.pdf 的指導(dǎo)一步步完成 hello_world 工程到 builderoot package 的集成工作。
- 將本地的 hello_world 工程集成到 buildroot package 的編譯框架
- 如何集成 patch 的合并工作,在構(gòu)建 hello_world 的自動(dòng)打上這個(gè) patch
主要參考資料:[The Buildroot User Manual.pdf](The Buildroot User Manual.pdf)
1. hello_world 到 buildroot 的集成
首先看一下 hello_world 工程本身的結(jié)構(gòu)和內(nèi)容:
下面就是準(zhǔn)備將 hello_world 集成到 buildroot 中作為一個(gè) package 進(jìn)行構(gòu)建,這部分首先看下一 buildroot 的 manual 是怎么描述的(The Buildroot User Manual.pdf中有詳細(xì)的描述):
這里有關(guān)鍵的三類共計(jì)四個(gè)文件:
- config 文件(配置的文件)
- Config.in 文件,交叉編譯的工程,本次使用交叉編譯 hello_wolrd 工程,最后的可執(zhí)行程序運(yùn)行在 YY3568 上,所以使用這個(gè)文件
- Config.in.host 文件,編譯 host 的工程
- mk 文件(構(gòu)建的文件 xxx.mk 文件,這個(gè)因?yàn)槲覍?duì)傳統(tǒng)的 makefile 比較熟悉,所以本次使用的是就是 Makefiles for generic packages )
- hash 文件(下載的軟件包的 hash 校驗(yàn)文件,xxx.hash文件,因?yàn)楸敬螛?gòu)建是直接使用的 local 的源碼文件,所以不存在文件包的校驗(yàn),所以這個(gè)文件暫時(shí)沒有)
根據(jù)上面的介紹,所以首先在 buildroot 的 package 目錄中創(chuàng)建 hello_world 目錄,然后創(chuàng)建 Config.in 和 hello_world.mk 文件,這兩個(gè)文件的內(nèi)容分別如下:
Config.in 文件,本次為了演示,僅僅使用了開啟關(guān)閉編譯 hello_world 的選項(xiàng):
config BR2_PACKAGE_HELLO_WORLD
bool "hello_world"
help
This is a comment that explains how to add new package to buildroot
hello_world.mk 文件:
################################################################################
#
# hello_world
#
################################################################################
HELLO_WORLD_VERSION = 0.9
HELLO_WORLD_SOURCE = hello_world
HELLO_WORLD_SITE = /home/red/Public/buildroot_sample/hello_world
HELLO_WORLD_LICENSE = GPL-3.0+
HELLO_WORLD_LICENSE_FILES = COPYING
HELLO_WORLD_INSTALL_STAGING = YES
HELLO_WORLD_SITE_METHOD = local
define HELLO_WORLD_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) all
endef
define HELLO_WORLD_INSTALL_STAGING_CMDS
$(INSTALL) -D -m 0755 $(@D)/hello_world $(STAGING_DIR)/usr/bin
endef
define HELLO_WORLD_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/hello_world $(STAGING_DIR)/usr/bin
endef
$(eval $(generic-package))
在 hello_world.mk 文件,關(guān)鍵的地方有 HELLO_WORLD_SITE_METHOD
需要設(shè)置為 local
,這樣才會(huì)使用本地目錄的原始文件;HELLO_WORLD_SITE
需要設(shè)置為本地 hello_world 工程源碼的目錄,而非 hello_world 工程(文件夾)所在的目錄。
最后要修改的就是讓 buildroot 的 Config.in 引用的 hello_world 的 Config.in,即相關(guān)的 diff 文件:
diff --git a/buildroot/package/Config.in b/buildroot/package/Config.in
index d18c688..d06ec07 100644
--- a/buildroot/package/Config.in
+++ b/buildroot/package/Config.in
@@ -10,6 +10,7 @@ menu "Target packages"
source "package/skeleton-init-sysv/Config.in"
menu "Audio and video applications"
+ source "package/hello_world/Config.in"
source "package/alsa-utils/Config.in"
source "package/alsa-plugins/Config.in"
source "package/atest/Config.in"
因?yàn)槲視?huì)開發(fā)一個(gè)視頻處理有關(guān)的應(yīng)用,所以引用 hello_world 工程我就放在了 Audio and video applications
。
這樣啟動(dòng) buildroot menuconfig 配置找到 hello_world 的配置選項(xiàng),選中進(jìn)行構(gòu)建。
將編譯出來的 hello_world 通過 scp 發(fā)送到 YY3568,打印如下:
2. 給hello_world創(chuàng)建一個(gè) patch,并依靠 buildroot 在構(gòu)建的時(shí)候合并 patch 并編譯
有了第一部分的基礎(chǔ)后,我們進(jìn)階一下,給 hello_world 打一個(gè)補(bǔ)丁,讓 buildroot 在構(gòu)建這個(gè)工程的時(shí)候先打上補(bǔ)丁在進(jìn)行編譯。
這里我們需要參看這部分內(nèi)容:
首先我們創(chuàng)建這個(gè)補(bǔ)丁,補(bǔ)丁文件命名為0001-say-sth-else.patch:
diff --git a/main.c b/main.c
index dd0e127..fcbbe7e 100644
--- a/main.c
+++ b/main.c
@@ -2,6 +2,6 @@
int main(int argc, char *argv[])
{
- printf("red say hello world to YY3568n");
+ printf("red say sth else to YY3568 just for demonstate how to patch package in buildrootn");
return 0;
}
放在 buildroot/package/hello_world 目錄:
接著需要將原始的 hello_world 工程打包為一個(gè)壓縮包,比如 hello_world.tar。然后修改 hello_world.mk 文件如下:
--- /tmp/tar_o.txt 2023-08-12 12:41:28.772370902 +0800
+++ /tmp/tar.txt 2023-08-12 12:41:53.564330270 +0800
@@ -4,12 +4,12 @@
#
################################################################################
HELLO_WORLD_VERSION = 0.9
-HELLO_WORLD_SOURCE = hello_world
-HELLO_WORLD_SITE = /home/red/Public/buildroot_sample/hello_world
+HELLO_WORLD_SOURCE = hello_world.tar
+HELLO_WORLD_SITE = /home/red/Public/buildroot_sample
HELLO_WORLD_LICENSE = GPL-3.0+
HELLO_WORLD_LICENSE_FILES = COPYING
HELLO_WORLD_INSTALL_STAGING = YES
-HELLO_WORLD_SITE_METHOD = local
+HELLO_WORLD_SITE_METHOD = file
define HELLO_WORLD_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) all
endef
然后刪除 buildroot/output/rockchip_rk3568/build/hello_world-0.9 目錄,重新構(gòu)建:
運(yùn)行新編譯出來的hello_world 到 YY3568,可以看到打印提示就變了:
切記不能用之前的 HELLO_WORLD_SITE_METHOD = local
這種方法實(shí)際我測(cè)試發(fā)現(xiàn)不會(huì)有打 patch 這個(gè)動(dòng)作。
至此,就記錄了如何為 buildroot 添加一個(gè)本地的軟件包以及打 patch 的操作,將遠(yuǎn)端的軟件包納入 buildroot package 進(jìn)行構(gòu)建的方法是類似的,這里暫時(shí)就不記錄了。這里提示下,如果 patch 是在遠(yuǎn)端的,該怎么辦呢?需要就對(duì)應(yīng)的 patch 文件添加到變量 _PATCH,這部分 The Buildroot User Manual.pdf 也有介紹。
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209323 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5032瀏覽量
97371 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
RK3568
+關(guān)注
關(guān)注
4文章
514瀏覽量
5034 -
Buildroot
+關(guān)注
關(guān)注
1文章
48瀏覽量
1394
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論