轉載位址:https://www.cnblogs.com/kele-dad/p/8231434.html
1.1 什麼是buildroot
Buildroot是Linux平台上一個建構嵌入式Linux系統的架構。整個Buildroot是由Makefile腳本和Kconfig配置檔案構成的。你可以和編譯Linux核心一樣,通過buildroot配置,menuconfig修改,編譯出一個完整的可以直接燒寫到機器上運作的Linux系統軟體(包含boot、kernel、rootfs以及rootfs中的各種庫和應用程式)。
下載下傳:git clone git://git.buildroot.net/buildroot
解壓:tar -xzvf buildroot-2017.02.9.tar.gz
1.2 buildroot 的目錄結構
- buildroot/package/:下面放着應用軟體的配置檔案,每個應用軟體的配置檔案有Config.in和soft_name.mk,其中soft_name.mk(這種其實就Makefile腳本的自動建構腳本)檔案可以去下載下傳應用軟體的包。
- buildroot/output/:是編譯出來的輸出檔案夾,裡面的build/目錄存放着解壓後的各種軟體包編譯完後的現場。
- 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:所有源碼包解壓出來的檔案存放地和編譯的發生地
- staging:軟連結到host/< tuple >/sysroot/ 就是上面說到的檔案系統需要的庫等目錄,友善檢視
- target: 目錄是用來制作rootfs的,裡面放着Linux系統基本的目錄結構,以及各種編譯好的應用庫和bin可執行檔案。不能用來nfs mount到開發闆,因為buildroot不是root權權運作的,是以現dev/,etc/等一些檔案無法建立,是以目錄還不完整,要用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:存放下載下傳的源碼包及應用軟體的壓縮包
- buildroot/fs:放各種檔案系統的源代碼
- buildroot/fs/skeleton:放生成檔案系統鏡像的地方,及闆子裡面的系統
- buildroot/linux: 存放着Linux kernel的自動建構腳本。
- buildroot/configs:放置開發闆的一些配置參數
- buildroot/dl:目錄存放從官網上下載下傳的開源軟體包,第一次下載下傳後,下次就不會再去從官網下載下傳了,而是從dl/目錄下拿開源包,以節約時間。本身下載下傳通常都是很慢的,你可以手動找到相關包下載下傳後放到這裡就OK了,make時會自動檢測這個目錄.
- buildroot/docs: 存放相關的參考文檔。
- buildroot/arch: 目錄存放CPU架構相關的配置腳本,如arm/mips/x86 ,這些CPU相關的配置,在制作工具鍊,編譯boot和核心時很關鍵。
- buildroot/board:存放了一些預設開發闆的配置更新檔之類的
- buildroot/boot:
- buildroot/build:
- buildroot/support:
- buildroot/system:這裡就是根目錄的主要骨架了和相關的啟動初始化配置,當制作根目錄時就是将此處的檔案cp到output裡去.然後再安裝toolchain的動态庫和你勾選的package的可執行檔案之類的.
- buildroot/toolchain:
1.3 buildroot 的工作原理
Buildroot原則上是一個自動建構架構,雖然說u-boot、linux kernel這些經典的開源軟體包的建構腳本,官方社群都在幫你實作了,但是有時候你還是需要加入你自己特有的app_pkg軟體包,用以建構自己的應用。
buildroot的編譯流程是先從dl/xxx.tar下解壓出源碼到output/build/xxx,然後它利用本身的配置檔案(如果有的話)覆寫output/build/xxx下的配置檔案,在開始編譯連接配接完成後安裝到output/相應檔案夾下.
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本身提供建構流程的架構,開發者按照格式寫腳本,提供必要的建構細節,配置整個系統,最後自動建構出你的系統。
buildroot/packages裡面有豐富的應用軟體的配置檔案,可以通過make menuconfig,出現圖形化界面進行選擇豐富的開源軟體包的編譯和建構。
1.4 建構JZ2440 開發環境
1.4.1 檢視一下目前的buildroot中支援的開發闆
執行指令: make list-defconfigs
在 2017.02.9 版本中并沒有三星的子產品,這裡我們隻能自己慢慢的一步步建構了。
1.4.2 建構開發闆
要建構自己的開發闆,首先要建立一個基本的 buildroot配置作為開發闆的基本編譯系統。這裡包括toolchain,kernel,bootloader,filesystem 和一個簡單的 busy-box 使用者空間。不要選擇特别的配置,這個配置必須要足夠小,并僅僅作為目标平台一個基本的 BusyBox 系統。
執行 make menuconfig:
- Target options:目标闆的配置
- Target Architecture:目标架構,這裡選擇 ARM(little endian),ARM小端模式
- Target Binary Format:二進制格式,為 ELF
- Target Architecture Variant:架構變體為 arm920t,核心類型
- Target ABI:應用程式二進制接口,為EABI
- Floating point strategy:浮點數的政策,選擇為 Soft float
- ARM instruction set:arm 彙編指令集,選擇 ARM
- Build options:主要是一些編譯時用到的選項,比如dl的路徑,下載下傳代碼包使用的路徑,同時運作多個編譯的上限,是否使能編譯器緩沖區等等,這裡按照預設就行了.
- Toolchain:工具鍊選項
- Toolchain type:Buildroot提供兩種方式使用toolchain
- external toolthain:非Buildroot提供的交叉編譯器
- Buildroot toolchain:Buildroot本身編譯生成的Buildroot toolchain,直接選擇此項
- custom toolchain vendor name:填上S3C2440
- C library:C庫選擇,選擇 glibc
- Kernel Headers:核心頭檔案,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用于共享記憶體并行系統的多處理器程式設計,OpenMP并不适合需要複雜的線程間同步和互斥的場合,OpenMp的另一個缺點是不能在非共享記憶體系統(如計算機叢集)上使用。不選擇
- Enable graphite support :是否支援graphite。Graphite是應用WEB應用的一套開源的程式設計接口。不選擇。具體看百度百科:https://baike.baidu.com/item/Graphite/9810474?fr=aladdin
- Build cross gdb for the host:主機上運作gdb進行調試,不選
- Copy gconv libraries:拷貝 gconv庫,gconv庫用于在不同字元集之間進行轉換。預設不選即可
- 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:系統配置
- Root FS skeleton:
- System hostname:填寫JZ2440
- System banner
- Passwords encoding
- Init system:系統初始化,選擇 BusyBox
- /dev management:裝置檔案管理,選擇Dynamic using devtmpfs + mdev,即使用mdev動态加載裝置節點的方式
- Path to the permission tables:裝置節點的配置表設定,一定要選擇system/device_table_dev.txt,否則後面在dev目錄下将不會生成各種裝置節點。當然我們也可以手動的配置該檔案,添加必要的節點或删除不需要的節點。
- 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:核心配置
- Kernel version:核心版本,選擇使用者自定義,Custom version
- Kernel version:填上自己所需要的版本,4.14.12
- Custom kernel patches:自定義的核心更新檔,無
- Kernel configuration:核心配置,選擇 Using an in-tree defconfig file
- Defconfig name:填寫為 mini2440
- Additional configuration fragment files:暫且不填寫
- Kernel binary format:核心二進制檔案格式,zImage
- Kernel compression format:核心壓縮格式,選擇gzip即可
- Build a Device Tree Blob:裝置樹?暫且不填寫
- Install kernel image to /boot in target:暫且不填
- Linux Kernel Extensions:核心擴充,預設不選擇
- Linux Kernel Tools:核心工具,預設不選擇
- Target packages
- Filesystem images:檔案系統選擇,選擇 yaffs2 root filesystem
- Bootloaders:硬體啟動程式,選擇為 U-boot
- Build system:u-boot系統選擇為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:闆子的配置,選擇與架構一樣的闆子的預設檔案,mini2440。後期再修改
- U-boot needs dtc:是否需要裝置樹,預設,後期調試
- U-boot needs OpenSSL:是否需要 OpenSSL,預設,後期調試修改
- U-boot binary format:二進制檔案,選擇 .bin檔案
- produce a .ift signed image:預設
- Install U-boot SPL binary image:預設
- Environment image:預設
- Build system:u-boot系統選擇為Kconfig
- Host utilities
- Legacy config options
配置完成後,執行make指令。
編譯報錯:
這是因為 u-boot-2017.11中不再支援 mini2440的開發闆了,找不到 mini2440_defconfig檔案。
u-boot-2017.11 解壓到了 output/build 目錄中。
在目錄中尋找 mini2440 開發闆:find -name "*" | xargs grep -s mini2440
可以看到 mini2440 在2014-01-13 被移除了。這樣我們必須添加一塊arm920t的開發闆了。
查找 S3C24X0:grep -irn --color "S3C24X0"
S3C24X0的庫函數還存在。這樣得選擇一塊闆子,重新搭建起 2440 開發闆了。