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 有兩個重點:

  1. src_uri 的 protocol 參數需要改為 file.
  2. 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, EXTERNALSRCEXTERNALSRC_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 最底下加入 INHERITEXTERNALSRC_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 進行修改與編譯. 而在使用中有遇到的問題:
    1. 有些地方無法與 yocto 工具進行搭配使用. e.g. 透過 devtool 產生 patch 之類.
    2. 有些 recipe 改為 external source code. 使用其中一個方法不通時候, 需要嘗試另一個方式.

Reference

  1. Yocto Project Development Tasks Manual: Building Software from an External Source
  2. externalsrc-example_0.1.bb
  3. BitBake User Manual: Fetchers
  4. Yocto Project Reference Manual : Var-S

留言

這個網誌中的熱門文章

yocto recipe : (1) 撰寫 recipe

yocto recipe : (2) 撰寫 bbappend