使用Buildroot,讓嵌入式Linux系統構建更加便捷。本文以Buildroot-2016.05的版本爲基礎來說解,不一樣版本之間有細節差別,須要根據讀者使用的版本自行調整。html
Buildroot是Linux平臺上一個開源的嵌入式Linux系統自動構建框架。整個Buildroot是由Makefile腳本和Kconfig配置文件構成的。你能夠和編譯Linux內核同樣,經過buildroot配置,menuconfig修改,編譯出一個完整的能夠直接燒寫到機器上運行的Linux系統軟件(包含boot、kernel、rootfs以及rootfs中的各類庫和應用程序)。python
以Buildroot官方開源社區維護的經典mini2440開發板的項目爲例,演示其使用方法。linux
1) 先從Buildroot官網: https://buildroot.org/download.html下載最新的穩定版Buildroot-2016.05壓縮包,放到Ubuntu系統下解壓web
2) 進入解壓後的Buildroot主目錄,其目錄結構圖以下redis
Figure1 Buildroot-2016.05 解壓後主目錄架構
3) make mini2440_defconfigapp
4) make all框架
5) 編譯完,生成的可燒寫文件鏡像,主目錄的在output/images/ 文件夾下,截圖以下:函數
Figure2 mini2440 開發板,用buildroot編譯生成的可燒寫鏡像工具
看起來,只要執行make *config和make all的命令,u-boot/linuxkernel/rootfs 都能一次性編譯好,並且編出來的鏡像能夠直接燒到mini2440開發板中運行,之後製做uboot, 編譯kenrel, 編譯各類app, 製做rootfs的繁瑣工做均可以自動化一步搞定,媽媽不再用擔憂我構建過程出錯了。Buildroot不愧是自動構建神器。
Buildroot大概有如下幾點優點:
a). 能夠通在make *config 以後,make menuconfig 配置須要編譯的軟件包,menuconfig目錄以下:
Figure3 make menuconfig的一級界面
Figure4 make menuconfig下的target packages 配置選項
實際上,uboot, linux kernel 還有 ffmpeg等這些應用包,並非強制都有編譯出來的,均可以經過make menuconfig進行選擇,編譯和構建。Buildroot原則上是提供自動構建框架,具體要編譯什麼包,都是用戶本身能夠選擇的。
b). 對豐富的開源應用軟件包的支持,誰說嵌入式軟件工程師都是搞內核驅動的,有了Buildroot, 這麼多開源應用都能移植構建到你的開發板中去,如下是Buildroot/package/ 目錄下支持的自動構建開源項目的截圖:
boost、python、ffmpeg、redis、opencv、opengl、webkit……這些開源應用軟件是否是耳熟能詳呢?沒錯,這些開源應用軟件包均可以在Buildroot下經過你的配置腳本,自動完成官網下載à解壓à系統環境配置à編譯à安裝到根文件系統等這一系列機械繁瑣的工做。
你不用再爲某某開源軟件如何移植到個人Linux 開發板而處處在QQ羣和論壇問人了,哪怕之後還要你本身開發的新的軟件包,全部繁瑣的移植工做,只要作了一次,均可以用Makefile寫成自動構建腳本,移植工做作了一次,就不用作第二次了,交給Buildroot自動來作就能夠了。
Figure5 Buildroot 所能構建的開源應用軟件包部分截圖a
Figure6 Buildroot 所能構建的開源應用軟件包部分截圖b
Figure7 Buildroot 所能構建的開源應用軟件包部分截圖c
c). 能夠一塊開發板屢次利用。一塊板子,能夠配置成手機,機頂盒,監控器,路由器或者各類想不到的有意思的應用。沒錯,只要把相應的配置文件加到configs/目錄下,下次編譯的時候,選擇該種配置,make all 。那麼立刻就能夠構建出相應的可燒寫鏡像,燒錄的開發板中,讓你的開發板瞬間從手機變成路由器,無需每次耗時地移植和改動了。
Figure8 Buildroot官方社區目前維護的各類開發板配置截圖
d). 團隊協做的利器。不用手把手告訴你的同事或者合做夥伴若是重頭構建某種系統的整個軟件包,把你配置好的Buildroot交給他,一切自動完成,不明白的步驟,看看各個軟件包的構建腳本,瞬間一目瞭然。
Buildroot原則上是一個自動構建框架,雖說u-boot、linux kernel這些經典的開源軟件包的構建腳本,官方社區都在幫你實現了,可是有時候你仍是須要加入你本身特有的app_pkg軟件包,用以構建本身的應用。
Buildroot提供了函數框架和變量命令框架(下一篇文章將介紹細節),採用它的框架編寫的app_pkg.mk這種Makefile格式的自動構建腳本,將被package/pkg-generic.mk 這個核心腳本展開填充到buildroot主目錄下的Makefile中去。最後make all執行Buildroot主目錄下的Makefile,生成你想要的image。
package/pkg-generic.mk中經過調用同目錄下的pkg-download.mk、pkg-utils.mk文件,已經幫你自動實現了下載、解壓、依賴包下載編譯等一系列機械化的流程。你只要須要按照格式寫Makefile腳app_pkg.mk,填充下載地址,連接依賴庫的名字等一些特有的構建細節便可。
總而言之,Buildroot自己提供構建流程的框架,開發者按照格式寫腳本,提供必要的構建細節,配置整個系統,最後自動構建出你的系統。
Figure9 Buildroot 的大概構建流程
Buildroot主目錄截圖以下,其中各個目錄存放的腳本簡要介紹。
Figure10 Buildroot主目錄截圖
arch/ 目錄存放CPU架構相關的配置腳本,如arm/mips/x86 ,這些CPU相關的配置,在製做工具鏈,編譯boot和內核時很關鍵。
board/ 目錄存放各類board 特有的一些配置腳本,在構建系統時,board默認的boot和Linux kernel配置文件,以及一些板相關特殊構建流程的腳本,都在該目錄下,等待自動構建時調用。
boot/ 目錄存在各類boot軟件的自動構建腳本,不僅是u-boot,還有grub等,也能夠經過Buildroot來構建。
configs/ 目錄存放這每種方案上層的全局配置文件,以前的make mini2440_defconfig實際上就是調用了該目錄下的mini2440方案的配置。該目錄下的配置文件記錄着該機器平臺或者方案使用的工具欄,boot, kernel,各類應用軟件包的配置和是否編譯選擇的狀態,以前所說的某個特殊開發板整個系統的配置文件,就在configs/目錄下。
dl/目錄存在從官網上下載的開源軟件包,第一次下載後,下次就不會再去從官網下載了,而是從dl/目錄下拿開源包,以節約時間。
docs/ 存放相關的參考文檔。
fs/ 存放着各類文件系統的自動構建腳本。
linux/ 存放着Linux kernel的自動構建腳本。
output/是編譯出來的輸出文件夾,裏面的build/目錄存放着解壓後的各類軟件包編譯完後的現場。host/目錄放着製做好的編譯工具鏈,target/ 目錄是用來製做rootfs的,裏面放着Linux系統基本的目錄結構,以及各類編譯好的應用庫和bin可執行文件。Images/目錄下就是最終生成的可燒寫到板子上的各類image。
package/ 目錄存放着各類第三方開源應用軟件包的自動編譯構建腳本,這些構建腳本通常都是通過測試,可以構建出相應的軟件包的。
support/目錄存放着一些固定的流程腳本,以備構建時調用執行。
system/ 目錄存放着文件系統目錄的和設備節點的模板,這些模板會被拷貝到output/目錄下,用於製做根文件系統rootfs。
toolchain/ 目錄中存放着各類製做工具鏈的腳本,buildroot能夠選擇從0開始,用gcc和linux 內核,glibc、uclibc庫等原材料製做一個本身工具鏈,也能夠下載第三方製做好的開源工具。
原文連接:http://blog.csdn.net/zhou_chenz/article/details/52346134