前言:接觸 op 已達四年,今年開始梳理整體所學,具體還參考了佐大的視訊,對 op 缺乏系統知識的可以嘗試,總體而言官方文檔和源碼是最好的教程。
文章目錄
- OpenWrt編譯過程
-
- OpenWrt編譯環境目錄
-
- 目錄
- 編譯之前
- 編譯後新增加
-
- bin
-
- dtbs
- build_dir
-
- host
- target
- toolchain
- dl
- feeds
- build_dir
OpenWrt編譯過程
OpenWrt的第一步就是編譯,将 OpenWrt 編譯環境目錄與具體的編譯過程兩者進行結合說明,本文先講解的是編譯環境目錄
OpenWrt 就是由腳本和 Makefile 檔案構成的
- toolchain
- build kernel + 使用者态
- 建立 rootfs 即根檔案(庫+程式)
- 建立 image(kernel+rootfs, rootfs一般使用 squashfs 和 romfs, 一般使用 romfs 時可以直接加載到 kernel)
OpenWrt編譯環境目錄
目錄
make時産生
- bin:編譯後的檔案
- build_dr:在此編譯程式
- dl:code
- feeds:第三方package
- 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之類的。
- 這裡也有一些其它的檔案在其中,主要生成軟體包和開發軟體包。