buildroot介绍
1.1 什么是buildroot
Buildroot是Linux平臺上一個構(gòu)建嵌入式Linux系統(tǒng)的框架。整個Buildroot是由Makefile腳本和Kconfig配置文件構(gòu)成的。你可以和編譯Linux內(nèi)核一樣,通過buildroot配置,menuconfig修改,編譯出一個完整的可以直接燒寫到機器上運行的Linux系統(tǒng)軟件(包含boot、kernel、rootfs以及rootfs中的各種庫和應(yīng)用程序)。
下載:git clone git://git.buildroot.net/buildroot
解壓:tar -xzvf buildroot-2017.02.9.tar.gz
1.2 buildroot 的目錄結(jié)構(gòu)
- buildroot/package/:下面放著應(yīng)用軟件的配置文件,每個應(yīng)用軟件的配置文件有Config.in和soft_name.mk,其中soft_name.mk(這種其實就Makefile腳本的自動構(gòu)建腳本)文件可以去下載應(yīng)用軟件的包。
- buildroot/output/:是編譯出來的輸出文件夾,里面的build/目錄存放著解壓后的各種軟件包編譯完后的現(xiàn)場。
- host:是由各類源碼編譯后在你主機上運行的工具(build for host)的安裝目錄,如arm-linux-gcc就是安裝在這里.
- 編譯出來的主機工具在host/usr下
- 根目錄所需要的庫及一些基本目錄就在host/< tuple >/sysroot/或host/usr/< tuple >/sysroot/里 (< tuple >:arm-buildroot-linux-gnueabi),如果是外部toolchain,比如lirano的就在libc里,名字不一樣而已
- build:所有源碼包解壓出來的文件存放地和編譯的發(fā)生地
- staging:軟鏈接到host/< tuple >/sysroot/ 就是上面說到的文件系統(tǒng)需要的庫等目錄,方便查看
- target: 目錄是用來制作rootfs的,里面放著Linux系統(tǒng)基本的目錄結(jié)構(gòu),以及各種編譯好的應(yīng)用庫和bin可執(zhí)行文件。不能用來nfs mount到開發(fā)板,因為buildroot不是root權(quán)權(quán)運行的,所以現(xiàn)dev/,etc/等一些文件無法創(chuàng)建,所以目錄還不完整,要用images/里的rootfs.tar解壓出來的根文件目錄才能mount.使用如下命令:sudo tar -C /destination/of/extraction -xf images/rootfs.tar
- Images:目錄下就是最終生成的可燒寫到板子上的各種image。
- host:是由各類源碼編譯后在你主機上運行的工具(build for host)的安裝目錄,如arm-linux-gcc就是安裝在這里.
- buildroot/dl:存放下載的源碼包及應(yīng)用軟件的壓縮包
- buildroot/fs:放各種文件系統(tǒng)的源代碼
- buildroot/fs/skeleton:放生成文件系統(tǒng)鏡像的地方,及板子里面的系統(tǒng)
- buildroot/linux: 存放著Linux kernel的自動構(gòu)建腳本。
- buildroot/configs:放置開發(fā)板的一些配置參數(shù)
- buildroot/dl:目錄存放從官網(wǎng)上下載的開源軟件包,第一次下載后,下次就不會再去從官網(wǎng)下載了,而是從dl/目錄下拿開源包,以節(jié)約時間。本身下載通常都是很慢的,你可以手動找到相關(guān)包下載后放到這里就OK了,make時會自動檢測這個目錄.
- buildroot/docs: 存放相關(guān)的參考文檔。
- buildroot/arch: 目錄存放CPU架構(gòu)相關(guān)的配置腳本,如arm/mips/x86 ,這些CPU相關(guān)的配置,在制作工具鏈,編譯boot和內(nèi)核時很關(guān)鍵。
- buildroot/board:存放了一些默認開發(fā)板的配置補丁之類的
- buildroot/boot:
- buildroot/build:
- buildroot/support:
- buildroot/system:這里就是根目錄的主要骨架了和相關(guān)的啟動初始化配置,當制作根目錄時就是將此處的文件cp到output里去.然后再安裝toolchain的動態(tài)庫和你勾選的package的可執(zhí)行文件之類的.
- buildroot/toolchain:
1.3 buildroot 的工作原理
Buildroot原則上是一個自動構(gòu)建框架,雖然說u-boot、linux kernel這些經(jīng)典的開源軟件包的構(gòu)建腳本,官方社區(qū)都在幫你實現(xiàn)了,但是有時候你還是需要加入你自己特有的app_pkg軟件包,用以構(gòu)建自己的應(yīng)用。
buildroot的編譯流程是先從dl/xxx.tar下解壓出源碼到output/build/xxx,然后它利用本身的配置文件(如果有的話)覆蓋output/build/xxx下的配置文件,在開始編譯連接完成后安裝到output/相應(yīng)文件夾下.
Buildroot提供了函數(shù)框架和變量命令框架,采用它的框架編寫的app_pkg.mk這種Makefile格式的自動構(gòu)建腳本,將被package/pkg-generic.mk 這個核心腳本展開填充到buildroot主目錄下的Makefile中去。最后make all執(zhí)行Buildroot主目錄下的Makefile,生成你想要的image。
package/pkg-generic.mk中通過調(diào)用同目錄下的pkg-download.mk、pkg-utils.mk文件,已經(jīng)幫你自動實現(xiàn)了下載、解壓、依賴包下載編譯等一系列機械化的流程。你只要需要按照格式寫Makefile腳app_pkg.mk,填充下載地址,鏈接依賴庫的名字等一些特有的構(gòu)建細節(jié)即可。
總而言之,Buildroot本身提供構(gòu)建流程的框架,開發(fā)者按照格式寫腳本,提供必要的構(gòu)建細節(jié),配置整個系統(tǒng),最后自動構(gòu)建出你的系統(tǒng)。
?
buildroot/packages里面有豐富的應(yīng)用軟件的配置文件,可以通過make menuconfig,出現(xiàn)圖形化界面進行選擇豐富的開源軟件包的編譯和構(gòu)建。
1.4 構(gòu)建JZ2440 開發(fā)環(huán)境
1.4.1 查看一下當前的buildroot中支持的開發(fā)板
執(zhí)行命令: make list-defconfigs
?
在 2017.02.9 版本中并沒有三星的模塊,這里我們只能自己慢慢的一步步構(gòu)建了。
1.4.2 構(gòu)建開發(fā)板
要構(gòu)建自己的開發(fā)板,首先要創(chuàng)建一個基本的 buildroot配置作為開發(fā)板的基本編譯系統(tǒng)。這里包括toolchain,kernel,bootloader,filesystem 和一個簡單的 busy-box 用戶空間。不要選擇特別的配置,這個配置必須要足夠小,并僅僅作為目標平臺一個基本的 BusyBox 系統(tǒng)。
執(zhí)行 make menuconfig:
- Target options:目標板的配置
- Target Architecture:目標架構(gòu),這里選擇 ARM(little endian),ARM小端模式
- Target Binary Format:二進制格式,為 ELF
- Target Architecture Variant:架構(gòu)變體為 arm920t,內(nèi)核類型
- Target ABI:應(yīng)用程序二進制接口,為EABI
- Floating point strategy:浮點數(shù)的策略,選擇為 Soft float
- ARM instruction set:arm 匯編指令集,選擇? ARM
- Build options:主要是一些編譯時用到的選項,比如dl的路徑,下載代碼包使用的路徑,同時運行多個編譯的上限,是否使能編譯器緩沖區(qū)等等,這里按照默認就行了.
- Toolchain:工具鏈選項
- Toolchain type:Buildroot提供兩種方式使用toolchain
- external toolthain:非Buildroot提供的交叉編譯器
- Buildroot toolchain:Buildroot本身編譯生成的Buildroot toolchain,直接選擇此項
- custom toolchain vendor name:填上S3C2440
- C library:C庫選擇,選擇 glibc
- Kernel Headers:內(nèi)核頭文件,Linux 4.9.x kernel headers
- glibc version:glibc版本選擇,2.24
- Binutils Version:binutils版本:2.27
- Additional binutils options:附加的 binutils 選擇,不填即可
- GCC compiler Version:GCC版本選擇,gcc 6.x
- Additional gcc options:附件的GCC選項,不填寫即可
- Enable C++ support:使能C++支持,選上
- Enable Fortran support:使能Fortran語言支持,不選
- Enable compiler link-time-optimization support:是否支持LTO,不選,LTO是什么:http://blog.csdn.net/fickyou/article/details/52381776
- Enable compiler OpenMP support:支持OpenMP?OpenMP用于共享內(nèi)存并行系統(tǒng)的多處理器程序設(shè)計,OpenMP并不適合需要復雜的線程間同步和互斥的場合,OpenMp的另一個缺點是不能在非共享內(nèi)存系統(tǒng)(如計算機集群)上使用。不選擇
- Enable graphite support :是否支持graphite。Graphite是應(yīng)用WEB應(yīng)用的一套開源的編程接口。不選擇。具體看百度百科:https://baike.baidu.com/item/Graphite/9810474?fr=aladdin
- Build cross gdb for the host:主機上運行g(shù)db進行調(diào)試,不選
- Copy gconv libraries:拷貝 gconv庫,gconv庫用于在不同字符集之間進行轉(zhuǎn)換。默認不選即可
- Enable MMU support:使能 MMU,S3C2440支持MMU,選上
- Target Optimizations:不選
- Target linker options:不選
- Register toolchain within Eclipse Buildroot plug-in:eclipse插件支持,不選
- Toolchain type:Buildroot提供兩種方式使用toolchain
- System configuration:系統(tǒng)配置
- Root FS skeleton:
- System hostname:填寫JZ2440
- System banner
- Passwords encoding
- Init system:系統(tǒng)初始化,選擇 BusyBox
- /dev management:設(shè)備文件管理,選擇Dynamic using devtmpfs + mdev,即使用mdev動態(tài)加載設(shè)備節(jié)點的方式
- Path to the permission tables:設(shè)備節(jié)點的配置表設(shè)置,一定要選擇system/device_table_dev.txt,否則后面在dev目錄下將不會生成各種設(shè)備節(jié)點。當然我們也可以手動的配置該文件,添加必要的節(jié)點或刪除不需要的節(jié)點。
- support extended attributes in device tables
- Use symlinks to /usr for /bin, /sbin and /lib
- Enable root login with password
- Root password:進入linux控制臺終端后的密碼,為空則登錄時不需要密碼,默認登錄用戶名為root。為空。
- /bin/sh (busybox' default shell)
- Run a getty (login prompt) after boot:保持默認,默認為選中。
- TTY port:配置為 ttySAC3
- Baudrate :波特率,配置為 115200
- TERM environment variable:默認即可
- other options to pass to getty:默認即可
- remount root filesystem read-write during boot
- Network interface to configure through DHCP
- Purge unwanted locales
- Locales to keep
- Generate locale data
- Install timezone info
- Path to the users tables
- Root filesystem overlay directories:
- Custom scripts to run before creating filesystem images
- Custom scripts to run inside the fakeroot environment
- Custom scripts to run after creating filesystem images
- Kernel:內(nèi)核配置
- Kernel version:內(nèi)核版本,選擇用戶自定義,Custom version
- Kernel version:填上自己所需要的版本,4.14.12
- Custom kernel patches:自定義的內(nèi)核補丁,無
- Kernel configuration:內(nèi)核配置,選擇?Using an in-tree defconfig file
- Defconfig name:填寫為 mini2440
- Additional configuration fragment files:暫且不填寫
- Kernel binary format:內(nèi)核二進制文件格式,zImage
- Kernel compression format:內(nèi)核壓縮格式,選擇gzip即可
- Build a Device Tree Blob:設(shè)備樹?暫且不填寫
- Install kernel image to /boot in target:暫且不填
- Linux Kernel Extensions:內(nèi)核擴展,默認不選擇
- Linux Kernel Tools:內(nèi)核工具,默認不選擇
- Target packages
- Filesystem images:文件系統(tǒng)選擇,選擇 yaffs2 root filesystem
- Bootloaders:硬件啟動程序,選擇為 U-boot
- Build system:u-boot系統(tǒng)選擇為Kconfig
- legacy:若是選擇2015.04之前的u-boot 選擇此項
- Kconfig:2015.04之后的 u-boot 選擇此項,勾選此項
- U-boot Version:U-boot版本,默認為 2017.01,選擇為Custom version
- U-Boot version:填寫為2017.11
- Custom U-boot patches:U-boot補丁,不添加
- U-Boot configuration:U-boot配置,暫時還沒有U-BOOT,所以選擇為:Using an in-tree board defconfig file
- Board defconfig:板子的配置,選擇與架構(gòu)一樣的板子的默認文件,mini2440。后期再修改
- U-boot needs dtc:是否需要設(shè)備樹,默認,后期調(diào)試
- U-boot needs OpenSSL:是否需要 OpenSSL,默認,后期調(diào)試修改
- U-boot binary format:二進制文件,選擇 .bin文件
- produce a .ift signed image:默認
- Install U-boot SPL binary image:默認
- Environment image:默認
- Build system:u-boot系統(tǒng)選擇為Kconfig
- Host utilities
- Legacy config options
配置完成后,執(zhí)行make命令。
編譯報錯:
這是因為 u-boot-2017.11中不再支持 mini2440的開發(fā)板了,找不到 mini2440_defconfig文件。
u-boot-2017.11 解壓到了 output/build 目錄中。
在目錄中尋找 mini2440 開發(fā)板:find -name "*" | xargs grep -s mini2440
可以看到 mini2440 在2014-01-13 被移除了。這樣我們必須添加一塊arm920t的開發(fā)板了。
查找 S3C24X0:grep -irn --color "S3C24X0"
?
S3C24X0的庫函數(shù)還存在。這樣得選擇一塊板子,重新搭建起 2440 開發(fā)板了。
下一章繼續(xù)。
轉(zhuǎn)載于:https://www.cnblogs.com/kele-dad/p/8231434.html
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的buildroot介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QtCreator中的Sysroot的含
- 下一篇: flash简单制作遮罩动画效果