這段時間老是在和openwrt打交道,以前也零零散散地寫過一點,仍是但願能有點體系。還記得我剛看到源代碼的時候,以爲無從下手.我想從Makefile的整個執行過程入手,搞清楚編譯源代碼的幾個小時中,到底發生了哪些故事.
本文是這個系列的第一篇.主要講一下我對openwrt整個目錄結構的理解.咱們將源代碼從官方下載而來的目錄稱之爲原始目錄,將編譯後生成的目錄稱之爲生成目錄,分兩部分介紹各個目錄.python
下載源碼後,源文件以下圖所示,下面咱們來一一解釋;
bash
存放了一些腳本,使用了bash,python,perl等多種腳本語言.編譯過程當中,用於第三方軟件包管理的feeds文件也是在這個目錄當中.在編譯過程當中,使用到的腳本也統一放在這個目錄中.服務器
編譯時,主機須要使用一些工具軟件,tools
裏包含了獲取和編譯這些工具的命令.軟件包裏面有Makefile文件,有的還包含了patch.每一個Makefile當中都有一句$(eval $(call HostBuild))
,這代表編譯這個工具是爲了在主機上使用的.markdown
存放着整個系統的配置文件網絡
包含了整個宿主機的文件源碼的介紹, 裏面還有Makefile爲目標系統生成docs.使用make -C docs/
能夠爲目標系統生成文檔.函數
嵌入式的童鞋應該都知道交叉編譯鏈,這個文件中存放的就是編譯交叉編譯鏈的軟件包.包括:binutils,gcc,libc
等等.工具
openwrt的源碼能夠編譯出各個平臺適用的二進制文件,各平臺在這個目錄裏定義了firmware和kernel的編譯過程。學習
存放了openwrt系統中適用的軟件包,包含針對各個軟件包的Makefile。openwrt定義了一套Makefile模板.各軟件參照這個模板定義了本身的信息,如軟件包的版本、下載地址、編譯方式、安裝地址等。在二次開發過程當中,這個文件夾咱們會常常打交道.
事實上,經過./scripts/feed update -a和./scripts/feed install -a
的軟件包也會存放在這個目錄之中.ui
openwrt的Makefile都存放在這裏。文件名爲 *.mk 。這裏的文件上是在Makefile裏被include的,相似於庫文件.這些文件定義了編譯過程.code
主要目錄就是前面說起的8個,剩下的是單個文件.
在頂層目錄執行
make
命令的入口文件.
定義了Makefile中使用的一些通用變量和函數
在
include/toplevel.mk
中咱們能夠看到,這是和make menuconfig
相關聯的文件.
是下載第三方一些軟件包時所使用的地址
即軟件許可證和軟件基本說明.其中README描述了編譯軟件的基本過程和依賴文件.
至此咱們把原始目錄大體瀏覽了一遍,下面咱們看看生成目錄.
在咱們編譯完成後除了下載的源碼文件,多出來的部分很明顯就是編譯過程當中新生成的.以下圖:
openwrt的附加軟件包管理器的擴展包索引目錄.有點繞,簡單來講就是下載管理軟件包的.默認的feeds
下載有packages、management、luci、routing、telephony
。如要下載其餘的軟件包,需打開源碼根目錄下面的feeds.conf.default文件,去掉相應軟件包前面的#號,而後更新源:
./scripts/feeds update -a
安裝下載好的包:
./scripts/feeds install -a
在前面的原始目錄中,咱們提到了host工具,toolchain工具還有目標文件.openwrt將在這個目錄中展開各個軟件包,進行編譯.因此這個文件夾中包含3個子文件夾:
在該文件夾中編譯主機使用的工具軟件
在該文件夾中編譯交叉工具鏈
在此編譯目標平臺的目標文件,包括各個軟件包和內核文件.
保存編譯完成後的二進制文件,包括:完整的bin文件,全部的ipk文件.
在編譯過程當中使用的不少軟件,剛開始下載源碼並無包含,而是在編譯過程當中從其餘服務器下載的,這裏是統一的保存目錄
用於保存在build_dir
目錄中編譯完成的軟件.因此這裏也和build_dir
有一樣的子目錄結構.
好比,在target-XXX
文件夾中保存了目標平臺編譯好的頭文件,庫文件.在咱們開發本身的ipk文件時,編譯過程當中,預處理頭文件,連接動態庫,靜態庫都是到這個子文件夾中.
從名字來看,是臨時文件夾.在編譯過程當中,有大量中間臨時文件須要保存,都是在這裏.
這個文件夾,有時能夠看到,有時沒有.這是由於這個文件夾保存的是,編譯過程當中出錯的信息,只有當編譯出錯了纔會出現.咱們能夠從這裏獲取信息,從而分析咱們的軟件編譯爲何沒有完成.
至此咱們把openwrt的目錄結構大致瀏覽了一遍.