yocto recipe : (3) 使用 External Source 來編譯軟體
Yocto 有提供許多 fetch code 的方式[3], 大都是以抓取外網的方式. 雖然很齊全, 但是開發時候多少需要以本機上的 source code 作為來源進行編譯. 這邊就紀錄如何讓 yocto 直接抓取本機上的 source code
使用本機上的 source code
這邊介紹兩種方式. 使用硬碟上的 source code, 而不是透過 yocto fetch 去網路上抓取
(1) git fetcher: 基於 git fetcher, 僅修改 src_uri 參數, 就可以用本機上的 source code
(2) external source: 基於 externalsrc class. 有兩種方式達成: (1) 於 recipe 直接新增 external source 變數 (2)於 local.conf 新增特定 recipe 的 external source 參數.
事前準備
於 build 目錄底下建立 3rd-pkgs. 把下載的 giflib 程式碼放置於此
[yijyun@localhost build]$ pwd /media/disk1-1/Github/poky/build [yijyun@localhost build]$ ls 3rd-pkgs/ giflib-5.1.4.tar.bz2
新增 meta-test 於 yocto. 並在此 meta-layer 底下新增 giflib 目錄. 存放之後的 bb files
[yijyun@localhost build]$ bitbake-layers create-layer meta-test [yijyun@localhost build]$ bitbake-layers add-layer meta-test [yijyun@localhost build]$ mkdir meta-test/recipes-example/giflib
git fetcher
使用 git fetcher 有兩個重點:
- src_uri 的 protocol 參數需要改為 file.
- S 的路徑要改為 S="${WORKDIR}/git
(2)的原因可參考[4]. yocto 設置 source code 目錄名稱會根據來源而修改. 當為 tar 之類的壓縮檔, 名稱通常為 S="${WORKDIR}/${BPN}-${PV}". 當為 git 的話, 則為 S="${WORKDIR}/git
範例
首先進入在 3rd-pkgs 解壓說 giflib, 並進入 giflib 的目錄. 建立一個 repository. commit 之後, 記錄下 commit id.
# 解壓縮 [yijyun@localhost build]$ ls 3rd-pkgs/ giflib-5.1.4 giflib-5.1.4.tar.bz2 # 新增 repository [yijyun@localhost giflib-5.1.4]$ git init . [yijyun@localhost giflib-5.1.4]$ git add * [yijyun@localhost giflib-5.1.4]$ commit -m "add package" [yijyun@localhost giflib-5.1.4]$ git log -1 commit 5f3c226d8962abcb353b4a716943416fc912bedd Author: yijyun <yijyun@localhost.localdomain> Date: Sun May 13 11:26:57 2018 -0400 add package
在 meta-test/recipes-example/giflib 新增 giflib-git_5.1.4.bb. 裡面的設定如下. 如上所述, 重點位於 src_uri 以及 S 的數值. SRCREV 則填入剛剛所記錄的 commit id 即可.
LICENSE = "Unknown" LIC_FILES_CHKSUM = "file://COPYING;md5=ae11c61b04b2917be39b11f78d71519a" S = "${WORKDIR}/git" SRC_URI = "git:///media/disk1-1/Github/poky/build/3rd-pkgs/giflib-5.1.4;protocol=file;branch=master" SRCREV = "5f3c226d8962abcb353b4a716943416fc912bedd" EXTRA_OECONF = "" inherit autotools
執行 bitbake giflib-git 看編譯結果
[yijyun@localhost build]$ bitbake giflib-git
external source
這邊有修改 recipe 的方式與 local.conf 的方式. 以下個別示範.
注意: 記得一定要 inherit externalsrc. 不管是用全域(local.conf)或者區域(.bb or .bbappend)的方式達成.
1. recipe 方法
只需在 recipe 設定 external source 變數, 就可以使用 external source code.
範例
先在 3rd-pgks 目錄底下解壓縮 giflib-5.1.4.tar.bz2, 並更名為 giflib-5.1.4_ext. 作為 source 來源.
[yijyun@localhost build]$ ls 3rd-pkgs/ giflib-5.1.4 giflib-5.1.4_ext giflib-5.1.4.tar.bz2
在 meta-test/recipes-example/giflib 新增 giflib-ext_5.1.4.bb. 設定如下. 主要在 bb file 加上 inherit externalsrc, EXTERNALSRC 與 EXTERNALSRC_BUILD 三個參數.
LICENSE = "Unknown" LIC_FILES_CHKSUM = "file://COPYING;md5=ae11c61b04b2917be39b11f78d71519a" EXTRA_OECONF = "" #SRC_URI = "" inherit autotools inherit externalsrc EXTERNALSRC = "/media/disk1-1/Github/poky/build/3rd-pkgs/giflib-5.1.4_ext" EXTERNALSRC_BUILD = "${B}"
進行編譯
[yijyun@localhost build]$ bitbake giflib-ext
2. local.conf 方法
直接在 local.conf 修改. 這邊以 giflib-git_5.1.4.bb 為例子. 強迫使用 libunistring 為 external source code
範例
首先下載 libunistring-0.9.9.tar.xz 於 3rd-pgks. 解壓縮後, 把 giflib-5-1.4 目錄裡的 COPYING 複製至 libunistring-0.9.9. 主要是因為 giflib-git_5.1.4.bb 的 LIC_FILES_CHKSUM 有針對 COPYING 進行驗證
[yijyun@localhost build]$ pwd /media/disk1-1/Github/poky/build # 解壓縮 [yijyun@localhost build]$ ls 3rd-pkgs/ | grep string libunistring-0.9.9 libunistring-0.9.9.tar.xz # 複製 COPYING 檔案 [yijyun@localhost 3rd-pkgs]$ cp -fa giflib-5.1.4/COPYING libunistring-0.9.9
接著在 conf/local.conf 最底下加入 INHERIT 與 EXTERNALSRC_pn-recipe-name.
這邊故意使用 giflib-git 作為示範. 凸顯是以外部的 libunistring 程式碼進行編譯.
INHERIT += "externalsrc" EXTERNALSRC_pn-giflib-git = "/media/disk1-1/Github/poky/build/3rd-pkgs/libunistring-0.9.9"
進行編譯, 可以看到從 giflib 的程式轉為 libunistring 的結果
# 編譯 giflib-git, 但實際是編譯 libunistring [yijyun@localhost build]$ bitbake giflib-git # 看到 giflib-git 內容變為 libunistring [yijyun@localhost build]$ ls tmp/work/i586/giflib-git/5.1.4-r0/image/usr/lib/ libunistring.so libunistring.so.2 libunistring.so.2.1.0
摘要
上述兩者都可以使用本機上的 source code 為來源, 但是這兩者還是些差異.
- git fetcher: 只適合對 source code 進行編譯, 不適合頻繁修改. 原因是每當你修改 source code, 則必須 commit. 再接著修改 recipe 的 SRCREV 變數
- exteranl src: 只適合對 source code 進行修改與編譯. 而在使用中有遇到的問題:
- 有些地方無法與 yocto 工具進行搭配使用. e.g. 透過 devtool 產生 patch 之類.
- 有些 recipe 改為 external source code. 使用其中一個方法不通時候, 需要嘗試另一個方式.
留言
張貼留言