buildroot構建項目(一)---buildroot介紹


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。
  • 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插件支持,不選
  • 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:默認
  • 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 開發板了。

  下一章繼續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM