什么是buildroot
Buildroot是Linux平台上一個開源的嵌入式Linux系統自動構建框架。
0.下載buildroot
Buildroot版本每2個月,2月,5月,8月和11月發布一次。版本號的格式為YYYY.MM,例如2013.02、2014.08。可以從http://buildroot.org/downloads/獲得發行包。
也可通過github倉庫獲取:
git clone git://git.busybox.net/buildroot
buildroot目錄結構
解壓buildroot源碼目錄如下:
-
arch: CPU架構相關的配置腳本
-
board: 在構建系統時,board默認的boot和Linux kernel配置文件,以及一些板級相關腳本
-
boot: uboot配置腳本目錄
-
configs: 板級配置文件,該目錄下的配置文件記錄着該機器平台或者方案使用的工具鏈,boot, kernel,各種應用軟件包的配置
-
dl: download的簡寫,下載一些開源包。第一次下載后,下次就不會再去從官網下載了,而是從dl/目錄下拿開源包,以節約時間
-
docs:
-
fs: 各種文件系統的自動構建腳本
-
linux: 存放Linux kernel的自動構建腳本
-
package: 第三方開源包的自動編譯構建腳本,用來配置編譯dl目錄下載的開源包
-
support:
-
system: 存放文件系統目錄的和設備節點的模板,這些模板會被拷貝到output/目錄下,用於制作根文件系統rootfs
-
toolchain/ 目錄中存放着各種制作工具鏈的腳本
編譯出的output輸出目錄介紹:
-
images/存儲所有映像(內核映像,引導加載程序和根文件系統映像)的位置。這些是您需要放在目標系統上的文件。
-
build/構建所有組件的位置(包括主機上Buildroot所需的工具和針對目標編譯的軟件包)。該目錄為每個組件包含一個子目錄。
-
host/包含為主機構建的工具和目標工具鏈。
-
staging/是到內部目標工具鏈host/的符號鏈接
-
target/它幾乎包含了目標的完整根文件系統。除了設備文件/dev/(Buildroot無法創建它們,因為Buildroot不能以root身份運行並且不想以root身份運行)之外,所需的一切都存在。
工具鏈
Buildroot為交叉編譯工具鏈提供了兩種解決方案:
- 內部工具鏈,稱為Buildroot toolchain在配置接口。
- 外部工具鏈External toolchain。
我們這里選擇的是外部工具鏈,工具鏈的來源可以選擇下載也可以選擇指定工具鏈前綴如:/opt/ali/ali-linux/Codescape.GNU.Tools.Package.2017.10-05.for.MIPS.MTI.Linux.CentOS-5.x86_64/usr/bin/mips-mti-linux-gnu-,我這里選擇的下載工具鏈源碼。下載完后,同時會對用來編譯工具鏈的原始工具鏈解壓到(BUILD_ROOT)/host/opt/ext-toolchain/目錄下,然后會對工具鏈源碼編譯安裝到$(BUILD_ROOT)/host/usr/bin下,這樣我們的工具鏈就可以使用了。
1.buildroot常用make命令
*make help: 可以看到buildroot下make的使用細節,包括對package、uclibc、busybox、linux以及文檔生成等配置。
-
make menuconfig(make linux-menuconfig...):進行圖形化配置
-
make:編譯
make命令通常將執行以下步驟:
- 下載源文件(根據需要);
- 配置、構建和安裝交叉編譯工具鏈,或僅導入外部工具鏈;
- 配置、構建和安裝選定的目標軟件包;
- 構建內核映像(如果選擇);
- 構建引導加載程序映像(如果選擇);
- 以選定的格式創建一個根文件系統
-
make clean:delete all build products (including build directories, host, staging and target trees, the images and the toolchain)
-
make distclean: 等於make clean+刪除配置
-
make show-targets:顯示出本次配置所要編譯所有的目標
-
make pkg-target:單獨編譯某個pkg模塊
-
make pkg-rebuild:重新編譯pkg
-
make pkg-extract:只下載解壓pkg,不編譯,pkg解壓后放在 output/build/對應的pkg-dir目錄下
-
make pkg-source:只下載某pkg,然后不做任何事情
2.buildroot框架
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文件,已經幫你自動實現了下載、解壓、依賴包下載編譯等一系列機械化的流程。
你只要需要按照格式寫app_pkg.mk,填充下載地址,鏈接依賴庫的名字等一些特有的構建細節即可。 總而言之,Buildroot本身提供構建流程的框架,開發者按照格式寫腳本,提供必要的構建細節,配置整個系統,最后自動構建出你的系統。
3.添加自己的軟件包
3.1添加package/Config.in入口
添加如下語句:
menu "myown(fuzidage) package"
source "package/helloworld/Config.in"
為自己的軟件包添加入口,這樣在make menuconfig的時候就可以找到自己的軟件包的Config.in,如果在make menuconfig的時候選中helloworld,那么‘BR2_PACKAGE_HELLOWORLD=y’也會同步到.config中去。
3.2配置APP對應的Config.in和mk文件
在package中新增目錄helloworld,並在里面添加Config.in和helloworld.mk
1)Config.in
config BR2_PACKAGE_HELLOWORLD
bool "helloworld"
help
This is a demo to add myown(fuzidage) package.
helloworld/Config.in文件,可以通過make menuconfig可以對helloworld進行選擇。只有在BR2_PACKAGE_HELLOWORLD=y條件下,才會調用helloworld.mk進行編譯
2)helloworld.mk
################################################################################
#
# helloworld
#
################################################################################
HELLOWORLD_VERSION:= 1.0.0
HELLOWORLD_SITE:= $(CURDIR)/work/helloworld
HELLOWORLD_SITE_METHOD:=local
HELLOWORLD_INSTALL_TARGET:=YES
define HELLOWORLD_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef
define HELLOWORLD_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin
endef
define HELLOWORLD_PERMISSIONS
/bin/helloworld f 4755 0 0 - - - - -
endef
$(eval $(generic-package))
helloworld.mk包括源碼位置、安裝目錄、權限設置等。
3.3編寫APP源碼和Makefile
3.4通過make menuconfig選中APP
通過上面對package/Config.in入口的配置, 我們可以通過make menuconfig,進入Target packages可以看見多了一個"myown(fuzidage) package"入口,選中helloworld。
然后make savedefconfig,對helloworld的配置就會保存到xxx_defconfig中.
3.5編譯使用APP
可以和整個平台一起編譯APP;或者make helloworld單獨編譯。
這兩個文件在選中此APP之后,都會被拷貝到output/build/helloworld-1.0.0文件夾中。
然后生成的bin文件拷貝到output/target/bin/helloworld,這個文件會打包到文件系統中。
如果需要清空相應的源文件,通過make helloworld-dirclean。
4如何重新編譯軟件包
經過第一次完整編譯后,如果我們需要對源碼包重新配置,我們不能直接在buildroot上的根目錄下直接make,buildroot是不知道你已經對源碼進行重新配置,它只會將第一次編譯出來的文件,再次打包成根文件系統鏡像文件。
那么可以通過以下2種方式重新編譯:
-
直接刪除源碼包,然后make all
例如我們要重新編譯helloworld,那么可以直接刪除output/build/helloworld目錄,那么當你make的時候,就會自動從dl文件夾下,解壓縮源碼包,並重新安裝。這種效率偏低
-
進行xxx-rebuild,然后make all
也是以helloworld為例子,我們直接輸入make helloworld-rebuild,即可對build/helloworld/目錄進行重新編譯,然后還要進行make all(或者make world 或者 make target-post-image)
-
如果要重新配置編譯安裝:
make <package>-reconfigure; make all
5.單獨生成目標(build out of tree)
make O=/home/lyb/output
效果如下:可以看見編譯產生的output目錄在/home/lyb下了:
具體的build訓練教程點擊如下鏈接.
buildroot官方訓練教程