BitBake使用攻略--從HelloWorld講起



寫在前面

《BitBake使用攻略》系列文章將從今天開始不定時的更新,主要講解BitBake的背景,基本語法,功能及其命令等知識,旨在為即將從事Yocto項目和OpenEmbedded項目的同學做一些預備知識,由於本人能力有限,一些紕漏還望各位指出,話不多說,我們馬上進入正題。


1. 什么是BitBake

BitBake就是比特燒烤,哈哈,皮一下。BitBake是一個開源的構建工具,通過提供必要的元數據,其能構建出從bootloader到應用層各種各樣的軟件包,可以將其對標GNU Make工具,而BitBake需要的菜譜文件就是GNU Make的CMakeList文件,當然了,也包括各種配置文件,引用官方的解釋,BitBake的介紹如下:

Fundamentally, BitBake is a generic task execution engine that allows shell and Python tasks to be run efficiently and in parallel while working within complex inter-task dependency constraints. One of BitBake's main users, OpenEmbedded, takes this core and builds embedded Linux software stacks using a task-oriented approach.

BitBake如此強大,為何我們好像基本沒有聽說過呢?這是因為BitBake作為Yocto和OpenEmbedded項目的核心構建工具,主要服務於嵌入式工程的構建過程,上手不是特別簡單,所以在一般領域不是特別出名,但這不代表他的功能遜色,相反,通過通過編寫相應元數據文件和配置文件,你可以構建任何你想要的包。
BitBake有幾個比較突出的特點:

  • BitBake是以任務為單位進行構建的,而這些任務通常是由菜譜文件(后綴為bb)、配置文件(后綴conf)以及類文件(后綴bbclass)所提供。
  • 通過添加一些變量,BitBake可以從本地,甚至是遠程服務器獲取要用到的源碼或補丁等文件。
  • BitBake采用CS架構,這就提供了一種遠程構建的可能。

大致介紹完BitBake后,你可能會覺得這玩意這么厲害是不是特別難學,其實還好,畢竟是一個工具性的軟件,只要按着規則來基本沒有太大的難度。接下來,我將從一個學習新工具或者新語言必學的項目HelloWorld來為大家介紹BitBake的基本用法。

2. BitBake的安裝

首先,我們先要下載BitBake軟件,大致有三種方式可以供我們獲得BitBake:

  • 直接克隆OpenEmbedded維護的BitBake源碼包。

  • 從你下載的Yocto或者OpenEmbedded項目代碼中取出BitBake源碼包。

  • 直接下載官方打包好的BitBake軟件包,可以運行下面的命令:

    $ wget http://git.openembedded.org/bitbake/snapshot/bitbake-1.17.0.tar.gz
    $ tar zxpvf bitbake-1.17.0.tar.gz
    

我們使用推薦使用第一種方式,因為我們可以得到一個最穩定的版本,運行下面的命令:

git clone git://git.openembedded.org/bitbake

運行完成后,你將獲得BitBake的源碼目錄:

cxy@ubuntu:~/Repository/BitBake/bitbake$ ls -al 
total 108
drwxrwxr-x  9 cxy cxy  4096 Dec 21 23:12 .
drwxrwxr-x  4 cxy cxy  4096 Dec 21 23:12 ..
-rw-rw-r--  1 cxy cxy   365 Dec 21 23:12 AUTHORS
drwxrwxr-x  2 cxy cxy  4096 Dec 21 23:12 bin
-rw-rw-r--  1 cxy cxy 16501 Dec 21 23:12 ChangeLog
drwxrwxr-x  2 cxy cxy  4096 Dec 21 23:12 classes
drwxrwxr-x  2 cxy cxy  4096 Dec 21 23:12 conf
drwxrwxr-x  4 cxy cxy  4096 Dec 21 23:12 contrib
drwxrwxr-x  6 cxy cxy  4096 Dec 21 23:12 doc
drwxrwxr-x  8 cxy cxy  4096 Dec 21 23:12 .git
-rw-rw-r--  1 cxy cxy    31 Dec 21 23:12 .gitattributes
-rw-rw-r--  1 cxy cxy   392 Dec 21 23:12 .gitignore
drwxrwxr-x 13 cxy cxy  4096 Dec 21 23:24 lib
-rw-rw-r--  1 cxy cxy  1224 Dec 21 23:12 LICENSE
-rw-rw-r--  1 cxy cxy 15394 Dec 21 23:12 LICENSE.GPL-2.0-only
-rw-rw-r--  1 cxy cxy  1286 Dec 21 23:12 LICENSE.MIT
-rw-rw-r--  1 cxy cxy   229 Dec 21 23:12 MANIFEST.in
-rw-rw-r--  1 cxy cxy  1949 Dec 21 23:12 README
-rw-rw-r--  1 cxy cxy    43 Dec 21 23:12 toaster-requirements.txt
-rw-rw-r--  1 cxy cxy  2887 Dec 21 23:12 TODO

為了可以在任意位置使用bitbake的命令,我們需要將bin目錄添加到PATH環境變量中,例如,我可以執行如下命令:

$ export PATH=/home/cxy/Repository/BitBake/bitbake/bin:$PATH

這時,嘗試運行一下你的bitbake,看看是否能正確輸出版本號:

cxy@ubuntu:~/Repository/BitBake/bitbake$ bitbake --version
BitBake Build Tool Core version 1.53.0

到此,你的BitBake環境已經准備好啦!

3. 使用BitBake構建一個HelloWorld工程

我們最后要到達的效果是使用BitBake工具輸出HelloWorld的字樣,你可能會覺得這一部分簡單,實際上是我想使用官網的一個案例帶你去學習BitBake的構建邏輯,同時也提供了一個我們今后學習BitBake使用的工程。
我們先新建一個hello工程,並進入到這個目錄下:

$ mkdir hello
$ cd hello

這時,我們不禁在想,在這一個空空的目錄下怎么去輸出HelloWorld呢,你不妨現在試着運行一下構建工具看看會發生什么,運行命令:

$ bitbake

可以發現(有點版本可能不會輸出),輸出信息里提示BBPATH變量未設置,這個變量是干嘛的呢,它是BitBake構建過程中最核心的變量,用於指定bb文件以及conf文件的存儲位置,而bb文件中又定義了構建任務,所以在干所有事之前我們要先定義BBPATH變量,將其指定為我們的工程目錄,例如:

$ BBPATH="/home/cxy/Repository/BitBake/hello/"
$ export BBPATH

隨后,我們重新使用bitbake命令編譯一下工程,這時你會發現系統提示找不到conf/bitbake.conf,而這個文件是bitbake運行時第一個要找到文件,其記錄了許多bitbake很重要的全局變量,因此我們創建它:

$ mkdir conf
$ cd conf/
$ touch bitbake.conf

並在bitbake.conf中添加如下內容:

TMPDIR  = "${TOPDIR}/tmp"
CACHE   = "${TMPDIR}/cache"
STAMP   = "${TMPDIR}/stamps"
T       = "${TMPDIR}/work"
B       = "${TMPDIR}"

我們對上面的變量分別做一個簡單的介紹:

  • TMPDIR:用於存放構建生成的文件,類似於輸出目錄,其中TOPDIR由系統自動賦值為工程目錄路徑。
  • CACHE:指定存放緩存文件的地方,通過這些文件,bitbake可以在重新構建時省去很多工作。
  • STAMP:戳記文件存放目錄。
  • T:存放臨時文件,如log文件。
  • B:bitbake在這個目錄下進行構建工作。

再次運行bitbake命令你會發現這次又提示缺少classes/base.bbclass文件,這個文件是一個類文件。在BitBake中,類文件會提供菜譜共有的內容,而base.bbclass是所有菜譜文件(bb文件)的公共基類,是必須提供的,因此我們創建這個文件:

$ mkdir classes
$ cd classes/
$ touch base.bbclass

同時,添加如下內容到這個文件中:

addtask build

這句代碼表示繼承該類的菜譜必須執行do_build任務,這時候你再運行一下就會發現bitbake沒有報錯,而是提示沒有事情可做,也就是沒有提供任務。因此,接下來我們提供一個菜譜文件去指定一些可供bitbake執行的任務。另外為了維護目錄的整潔性,我們使用bitbake中層的概念(每個層之間菜譜是獨立的,大的工程中都有好多層,用於分離不同種類的文件)。我們新建層meta-mylayer,同時每個層需要又一個配置文件conf/layer.conf

$ mkdir meta-mylayer
$ cd meta-mylayer/
$ mkdir conf
$ cd conf/
$ touch layer.conf

在這個配置文件中,我們需要為其填充一些配置項,內容如下:

BBPATH .= ":${LAYERDIR}"

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

BBFILE_COLLECTIONS += "mylayer"
BBFILE_PATTERN_mylayer := "^${LAYERDIR}/"

在這個文件中,我們先設置了BBPATH變量,.=表示的是追加,所以我們將LAYERDIR(這個變量會被自動設定為當前層的根路徑)內容追加到BBPATH中,表示在這個路徑下也可以找到BB文件。而BBFILES是一個正則表達式,使用這個規則可以匹配到我們的菜譜文件。另外,最后的兩個變量我們暫時先不說,以后具體講到菜譜文件再聊,或者你可以參考一下官方的解釋:BBFILE_COLLECTIONS , BBFILE_PATTERN
之后,我們還需要編寫我們的第一個菜譜文件,去告訴BitBake我們要做些什么,在meta-mylayer目錄下新建一個菜譜文件printhello.bb,內容如下:

DESCRIPTION = "Prints Hello World"
PN = 'printhello'
PV = '1'

python do_build() {
    bb.plain("********************");
    bb.plain("*                  *");
    bb.plain("*  Hello, World!   *");
    bb.plain("*                  *");
    bb.plain("********************");
}

在這個文件中,我們定義了三個變量,分別表示描述信息,菜譜名稱以及菜譜的版本號。另外我們還定義了一個任務do_build(任務名稱以do_開頭),內容是使用bb.plain函數打印若干字符串。由於所有BB文件都要繼承基類base.bbclass,因此這個BB文件也就必須要執行do_build任務了(參考上面所講)。
此時,你再次回到根目錄下運行bitbake printhello命令(表示我們要構建printhello.bb菜譜),你會發現BitBake似乎並沒有找到這個菜譜,這是因為我們還需要一個變量去將新建的層包含到我們的工程中,而這個變量需要定義到conf/bblayers.conf文件中,我們新建conf/bblayers.conf文件,內容如下:

BBLAYERS ?= " \
        /home/cxy/Repository/BitBake/hello/meta-mylayer \
        "

其中,BBLAYERS變量指定了我們要使用的層的絕對路徑(你需要把你的層路徑替換掉我的)。
現在你檢查一下自己的目錄是否和我一樣:

cxy@ubuntu:~/Repository/BitBake/hello$ tree -L 3 .
.
├── classes
│   └── base.bbclass
├── conf
│   ├── bblayers.conf
│   └── bitbake.conf
└── meta-mylayer
    ├── conf
    │   └── layer.conf
    └── printhello.bb

4 directories, 5 files

如果沒有文件和內容沒有問題,運行bitbake printhello命令,你將獲得如下內容:

result

恭喜你,到此你已經成功的完成了你的BitBake初次旅行,讓我們給自己慶祝一下吧!!!

后續

本文案例及介紹參考自Yocto中的文檔,有興趣的同學可以去啃一啃這篇手冊。
雖然我們只是輸出了一些無用信息,但是我們已經掌握了BitBake最核心的運行邏輯,也對其使用的文件有了一個較為直觀的感受。在之后的時間里,我們將繼續學習相應的語法知識,命令用法以及怎樣使用它完成一個復雜的工程構建任務。當然啦,也希望大家能多多支持一下博主,碼字不易,還望一鍵三連,如果想請博主喝杯茶也可以,右下角可以打賞哦,再次謝謝大家能看到這個地方。


我是chegxy,歡迎關注!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM