天天看點

buildroot建構項目---buildroot介紹

轉載位址: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。 
  • 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建構項目---buildroot介紹

  buildroot/packages裡面有豐富的應用軟體的配置檔案,可以通過make menuconfig,出現圖形化界面進行選擇豐富的開源軟體包的編譯和建構。

1.4 建構JZ2440 開發環境

1.4.1 檢視一下目前的buildroot中支援的開發闆

  執行指令: make list-defconfigs

  

buildroot建構項目---buildroot介紹

  在 2017.02.9 版本中并沒有三星的子產品,這裡我們隻能自己慢慢的一步步建構了。

1.4.2 建構開發闆

  要建構自己的開發闆,首先要建立一個基本的 buildroot配置作為開發闆的基本編譯系統。這裡包括toolchain,kernel,bootloader,filesystem 和一個簡單的 busy-box 使用者空間。不要選擇特别的配置,這個配置必須要足夠小,并僅僅作為目标平台一個基本的 BusyBox 系統。

  執行 make menuconfig:

  

buildroot建構項目---buildroot介紹
  • 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指令。

  編譯報錯:

  

buildroot建構項目---buildroot介紹

  這是因為 u-boot-2017.11中不再支援 mini2440的開發闆了,找不到 mini2440_defconfig檔案。

  u-boot-2017.11 解壓到了 output/build 目錄中。

  在目錄中尋找 mini2440 開發闆:find -name "*" | xargs grep -s mini2440

  

buildroot建構項目---buildroot介紹

  可以看到 mini2440 在2014-01-13 被移除了。這樣我們必須添加一塊arm920t的開發闆了。

  查找 S3C24X0:grep -irn --color "S3C24X0"

  

buildroot建構項目---buildroot介紹

  S3C24X0的庫函數還存在。這樣得選擇一塊闆子,重新搭建起 2440 開發闆了。