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 開發板了。
下一章繼續。