天天看點

OpenWRT開發之——BuildPackage剖析前言正文結語

但是有個問題部落客始終沒有弄明白。為什麼我們 make 一下,管理器就為我們從網上倉庫下載下傳軟體源碼,并編譯打包。這個過程是怎麼回事兒?還有,為什麼我們在 package/<包名>/ 下的makefile檔案下的最後一行是:

這句話的語意是什麼?buildpackage是什麼?

帶着這個問題,我們今天來研究一下 buildpackage 以及展開後的makefile全貌。

我們還是來看看一個完整的makefile内貌,如cpp11-demo的makefile:

知道makefile基本文法的同學們都知道 define xxxx ... endef 其實就是給 xxxx 變量指派,隻不過是多行文本而已。

依此,可以将上面的簡化為:

從上面,沒有看到一個目标的定義,如下面這樣:

那,這些目标在哪裡?

玄機就在最後一行的buildpackage,它根據上面定義的變量生成了所有上面的一切。

$(eval <text>),是将<text>作為makefile檔案中的一部分。

$(eval $(call buildpackage,cpp11-demo)),是引用buildpackage變量中的内容,并将内部中的$(1)替換為cpp11-demo,然後将處理後的内部作為makefile的一部分。

buildpackage 變量定義在 include/package.mk 檔案中。

tip1

buidpackage的第一行就是:$(build/includeoverlay),其定義:

build/includeoverlay作用就是 inlcude $(topdir)/overlay/*/$(pkg_name).mk 檔案。

比如我要更改lua這個包裡面的某個變量,如果我們直接修改 package/xx/lua/makefile 檔案,總有不妥之處。因為這個檔案是從網上源碼上同步下來的。我們最好不要去直修改它們。若需要使用者自定義某些内容,不防使用overlay。就是在 trunk/overlay/ 路徑下的任意子目錄下建立與包名對應的 .mk 檔案,比如lua,那麼就建 lua.mk。

我們在 trunk/overlay/xxx/lua.mk 檔案裡重新定義我們的變量或操作。

tip2

其中第9~13行:

如果沒有定義package/$(1)/description,那麼就以$(title)來定義一個預設的。這裡$(1)為 "cpp11-demo"。

tip3

将cpp11-demo追加到變量 build_packages 後面,可能是将來編譯的時候需要。

tip4

如果 $(quilt)$(dump) 都沒有定義,那麼以$(depends)為參引用 find_library_dependencies 變量。

其中 find_library_dependencies 定義如下:

部落客暫不解釋,有點複雜,略過。其功能應該是找出依賴的庫。

生成:

tip5

這幾句是判斷 field, title, category, section, version 這幾個變量有沒有定義,如果沒有定義那就就報錯。

tip6

雖然寫得有點複雜,但意思是:

将 package/$(1)/targets 或 pkg_targets 中的每一項或 ipk 作為$(target),引用 $(buildtarget/$(target))。其中:

buildtarget/bin 定義在 include/package-bin.mk

buildtarget/ipk 定義在 include /package-ipk.mk

具體這兩個變量的内容部落客暫時不去研究。其内容莫非是描述如何生成bin與ipk目标。這裡留個引子,下次再研究。

如果沒有定義 package/$(1)/targets 與 pkg_targets,那麼上次就預設将ipk作為target,引用 buildtarget/ipk 變量了。

tip7

如果沒有定義 pkg_host_only 與 dump,那麼這句可以簡化為:

即預設的目标建構。

如下為 build/defaulttargets 的定義:

<明日再續>

若想與博文一起研究新技術,請關注我吧!

下一篇: vsftp