buildroot是一個成熟的SDK框架,基於它有了openwrt。
曾經有一個項目,需要將原有的OpenWrt SDK改造,並且將軟件框架重新定義。嘗試精簡原來的OpenWrt,並且刪除所有的軟件包,留下rootfs、busybox這些基本的東西,但是還是有很多地方不如人意,難以修改(定制的過於深入)。於是找到它的前身,buildroot,進行修改。
拿到buildroot后。發現和OpenWrt的一大區別就是耦合性低。在OpenWrt里面一些自動編譯的操作,需要在buildroot里面手動編譯。比如make busybox-rebuild。對於linux內核來說,在make linux-menuconfig之后,需要將.config手動拷貝回來,而不是自動同步。雖然麻煩一點,但是我覺得這樣是一個比較好的做法,畢竟之前做OpenWrt的時候發現整個流程太過於自動化,修改個內核配置之后一串內核的配置文件被修改合並而讓人摸不着頭腦。
另外,將OpenWrt的SDK移植到buildroot也是令人愉快的,拷貝toolchain,busybox和內核,再花功夫研究文件系統image的生成,寫一個post-build腳本,配置CPU架構等一些參數,image就可以下載運行了。當然需要根據自己的需求精簡、修改一些東西。比如你想把平台有關的東西塞到一些文件夾里面,再添加一些文件夾作為其他平台的根文件夾,多個-平台存在於同一份SDK里面,這樣都是可以的。不過修改的時候不要定制過度,把一些以后有用的東西給刪了,到最后要用的時候還是要改回來。當然了,只要你有toolchain、內核和文件系統layout就可以做移植了,不一定要給出很好的原版SDK。
buildroot的定制是比較便捷快速的,比如你移動一些文件夾,像fs,arch這些,只需要修改Config.in和makefile就可以了。因為它耦合性程度低的優點,修改起來較為容易,不會出現牽一發而動全身的現象,所以自己修改的時候也不要增加太多的關聯,給后續的維護帶來麻煩。
buildroot的框架比較清晰。首先它軟件包的定義和OpenWrt類似,不含有其他的冗余成分,做SDK該做的事,規定軟件到哪里編譯,傳遞哪些編譯選項,安裝到哪里。對於每一個組件,即使是toolchain也是一個軟件包,這樣一來,只需要修改Config.in和相關的makefile就可以定義自己想要的東西。如果你還不明白,buildroot提供了一個pdf說明文檔,仔細看一遍再繼續研究。而OpenWrt的文檔大而全,這是不可避免的,因為兩者的定位不同。
buildroot可以讓人更加清晰地學習linux。學習linux的編譯運行流程,buildroot比當前熱門的OpenWrt好得多。OpenWrt這個發行版定制了很多東西,你一個make就完成的事情,可能渾然不知里面發生了什么。當你拿到buildroot,即使是別人做好的,只要你仔細看一下里面的流程就會明白一個linux是怎么生成的,因為它的框架比較簡單。當然buildroot也是一個大而全的東西,因為它是一個開源的軟件,它支持很多體系結構,可以適當按照自己需要精簡。若純粹自己用,不精簡也沒關系。
buildroot沒有暗示你使用什么。對於OpenWrt來說,使用了uhttpd,你可能就需要libubox和luci,lua這一堆東西,如果你不用這些,你使用OpenWrt可能就意義不大了。而使用了buildroot,你會選擇自己要用什么,從busybox開始逐漸搭建你自己的王國。當然了你也可以使用uhttpd這一堆東西。