天天看點

1-OpenWrt編譯過程-1OpenWrt編譯過程

前言:接觸 op 已達四年,今年開始梳理整體所學,具體還參考了佐大的視訊,對 op 缺乏系統知識的可以嘗試,總體而言官方文檔和源碼是最好的教程。

文章目錄

  • OpenWrt編譯過程
    • OpenWrt編譯環境目錄
      • 目錄
      • 編譯之前
      • 編譯後新增加
        • bin
          • dtbs
        • build_dir
          • host
          • target
          • toolchain
        • dl
        • feeds
        • build_dir

OpenWrt編譯過程

OpenWrt的第一步就是編譯,将 OpenWrt 編譯環境目錄與具體的編譯過程兩者進行結合說明,本文先講解的是編譯環境目錄

OpenWrt 就是由腳本和 Makefile 檔案構成的

  1. toolchain
  2. build kernel + 使用者态
  3. 建立 rootfs 即根檔案(庫+程式)
  4. 建立 image(kernel+rootfs, rootfs一般使用 squashfs 和 romfs, 一般使用 romfs 時可以直接加載到 kernel)

OpenWrt編譯環境目錄

目錄

make時産生

  1. bin:編譯後的檔案
  2. build_dr:在此編譯程式
  3. dl:code
  4. feeds:第三方package
  5. staging_dir:交叉編譯工具鍊

在此以 ipq6010 的目錄結構舉例

編譯之前

❯ ls
BSDmakefile # free
build_bin.sh 
build_img.sh
config # 存放着整個系統的配置檔案
config-0303
Config.in # 和make menuconfig相關聯的檔案(在include/toplevel.mk中可看到)
docs # 包含了整個主控端的檔案源碼的介紹
feeds.conf # 包含了feeds的清單,每一行由三個部分組成,feeds的方法,feeds的名字和feeds的源。
feeds.conf.default # 同上
include # 包括了整個系統的編譯需要的頭檔案, 但是是以Make進行連接配接的,定義了編譯過程
LICENSE # 許可證
Makefile # 在頂層目錄執行make指令的入口檔案
meta-tools # 用于建構各個版本的核心,如emmc和nand (不确定)
new-config
package # 存放了openwrt系統中适用的軟體包,包含針對各個軟體包的Makefile。
prebuilt # 高通ipq的ipk檔案,可以通過 OpenWrt 的包管理軟體 opkg 直接安裝
qca # 高通晶片 (不确定) 
README
Readme.md
rules.mk # 定義了 Makefile 中使用的一些通用變量和函數,所有package都將包含該規則
scripts # 組織編譯整個OpenWrt的規則
target # 目标系統指嵌入式裝置, 針對不同的平台有不同的特性, 針對這些特性,"target/linux"目錄下按照平台進行目錄劃分, 裡面包括了針對标準核心的更新檔, 特殊配置等 
tmp # 編譯檔案夾, 一般情況為空
tools # 編譯時主機需要使用一些工具軟體,tools 裡包含了擷取和編譯這些工具的指令
toolchain # 存放的就是編譯交叉編譯鍊的軟體包
wireshark-2.4.2-11ax-patches # wireshark抓包工具
wireshark-github
           

編譯後新增加

drwxr-xr-x  bin # 儲存編譯完成後的二進制檔案
drwxr-xr-x  build_dir # 展開各個軟體包來進行編譯
drwxrwxr-x  dl 
drwxr-xr-x  feeds # 擴充軟體包索引目錄,就是下載下傳管理軟體包的
-rw-r--r--  key-build
-rw-r--r--  key-build.pub
drwxr-xr-x  staging_dir # 用于儲存在build_dir目錄中編譯完成的軟體
           

bin

儲存編譯完成後的二進制檔案,包括:完整的 bin 檔案、所有的 ipk 檔案。

.../bin$ tree -d
.
└── ipq
    ├── debug
    │   └── modules # 驅動子產品檔案
    ├── dtbs 
    ├── img # 核心鏡像
    └── packages # pack包
        ├── adsprpc
		...
           
dtbs
  • 之是以Linux核心會提供這種方式是因為很多廠家都有自己的 bootloader ,但是這些 bootloader 并不都一定支援裝置樹,為了實作支援裝置樹啟動,就引入了這種啟動方式,即将編譯出的zImage和編譯出的裝置樹鏡像檔案拼成一個新的鏡像,在核心的自解壓代碼中會識别到,不會出現自解壓時導緻裝置樹被覆寫。
  • 編譯核心時,我們可以使用 make dtbs 指令編譯生成相應開發闆的 dtb(Device Tree Blob)檔案。

build_dir

展開各個軟體包來進行編譯。

buildroot/build_dir$ tree -d
.
└── host  
└── target-arm_cortex-a7_musl-1.1.16_eabi
└── toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi
           
host
  • 用來編譯所有跑在主機上的程式(OpenWRT從源中編譯他自己版本的sed和其它許多工具)。

    這個區域将用來編譯僅跑在你主機上的程式。

target

用于編譯目标系統的實際的包,和Linux核心。

toolchain
  • 用來編譯打包中使用到的C交叉編譯器和C标準庫元件。
  • 這個區域将用來編譯僅跑在你主機上的程式(例如:C交叉編譯器)以及設計的跑在目标機器上的連結庫,例如uClibc, libm, pthreads等等。

dl

  • “download” 的縮寫,從 feeds.conf 指定的倉庫下載下傳的 package 和 feed 中 Makefile 中指定版本的各種源碼包。
  • 在編譯前期,需要從網絡下載下傳的資料包都會放在這個目錄下,這些軟體包的一個特點就是會自動安裝在所編譯的固件中,也就是我們 make menuconfig 的時候,為固件配置的一些軟體包。
  • 如果我們需要更改這些源碼包,隻需要将更改好的源碼包打包成相同的名字放在這個目錄下,然後開始編譯即可。

    編譯時,會将軟體包解壓到 build_dir 目錄下。

    為了減少編譯時間,先将需要的依賴放進去。

feeds

  • openwrt的附加軟體包管理器的擴充包索引目錄。
  • 就是下載下傳管理軟體包的。
  • 如要下載下傳其他的軟體包,需打開源碼根目錄下面的feeds.conf.default檔案,去掉相應軟體包前面的#号,然後更新源

build_dir

  • 用于儲存在build_dir目錄中編譯完成的軟體,和build_dir有同樣的子目錄結構。
    • 比如,在target-XXX檔案夾中儲存了目标平台編譯好的頭檔案,庫檔案。在我們開發自己的ipk檔案時,編譯過程中,預處理頭檔案,連結動态庫,靜态庫都是到這個子檔案夾中。
.
└── host  
└── target-arm_cortex-a7_musl-1.1.16_eabi
└── toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi
           

staging_dir/host:

  • 該檔案夾是一個微型的Linux 根目錄,有自己的目錄bin/, lib/等等。這是主機工具安裝的位置,建構系統的其餘部分會将該區域的目錄字首到環境變量PATH中。
  • 它包含用來建構固件的C交叉編譯器。
    • 可以用該編譯器在OpenWRT之外編譯一個可以加載到固件中的簡單的C程式。這個C編譯器一般是這樣:staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc。
    • 可以看到CPU、C庫和編碼到其中的gcc的版本号;并且允許多目标同時在一起建構。

staging_dir/target:

  • 包含每個目标包已安裝的版本;根目錄形式,包含bin/, lib/等等,并且将會變成實際的根目錄,僅作出一些調整就會打包進固件鏡像中,像root-ar71xx之類的。
  • 這裡也有一些其它的檔案在其中,主要生成軟體包和開發軟體包。

繼續閱讀