這一個章節主要討論一下buildroot rebuild的機制,有時候一個大專案建置完成後,我們修改了一些組態,還是某些套件的source code後,只想要重新建置這個套件或是某個小部分(像是android的mm),這個動作其實有點複雜,還會牽涉到要不要將其在重新包入映像檔中之類的,如果只是要重新建置整個系統還比較簡單一點,像是直接用指令:

make clean all

就可以完全的建置整個系統。

但是如果你期望修改了小部份的檔案,還想要buildroot幫你判斷,只建置異動的部分,甚至還重新打包映像檔的話,buildroot是無法辦到的,因為當buildroot建置完一個套件以後,它會使用一個隱藏檔來記錄這個套件是否已經被建置過了,所以除非你重新建置整個專案或是特別指定要重建這個套件,不然你只下『make』的話,系統不會幫你建置。

就像上一段說的,它主要是利用一個隱藏檔來記錄是否需要建置,並不是向其他系統一樣還會遞迴的去看所有的資料夾和子資料夾是否有修改過,所以就算你底下改過任何東西,系統也不會幫你重新建置的,畢竟buildroot的設計方針可是『簡單』,所以盡可能的不想複雜化。

所以修改了檔案就只能重建了嗎?也不是,因為Buildroot提供了幾個重建套件的make target,像是:
make <pkg>-reconfigure
make <pkg>-rebuild
make <pkg>-reinstall

這部分的宣告實做都可以在『buildroot/package/pkg-generic.mk』裡面找到,像是:

這個『pkg-generic.mk 』可以說是buildroot 套件架構的核心,基本上其他所有的架構都是從這邊延伸出去的,『pkg-generic.mk』的架構這邊就先不探討,希望改天有機會在來研究。

既然不是跟其他系統一樣的去迭代所有資料夾,那到底呼叫『make』在buildroot到底做了什麼事?主要列出如以下:

  • 建置上次沒建置過的套件,並且安裝到target去。
  • 將target的root filesystem裡面不需要的檔案清乾淨。
  • 執行post-build script。
  • 複製rootfs overlays。
  • 產生root filesystem 映像檔。
  • 執行post-image script。

那既然上面這樣說,所以每次改東西都需要重新建置?好像也不必然,底下給幾個案例,主要是在專案建置後,各種修改行為與『make』之間的搭配,可以參考一下:

  • 專案建置完後,你又從menuconfig去啟動其他套件後執行『make』>

    buildroot將會建置並且安裝它,但是如果有其他用到這個套件的其它套件將不會重新建置。

  • 專案建置完後,你從組態上移除某個套件,執行『make』>

    基本上對於target image來說,什麼事都不會發生,因為buildroot並沒有去追蹤哪些套件安裝了哪些檔案,所以target image裡面本來就安裝的檔案並不會被刪除,一定要整個Rebuild才會。

  • 專案建置完後,改變某個套件的『sub-options』後,執行『make』>

    你需要強制重新建置這個套件才會安裝到target image裡面,指令的話主要分為重新建置組態和重新建置專案
    make <pkg>-reconfigure
    make <pkg>-rebuild

  • 專案建置完後,修改『post-build』,『rootfs overlay』或是『post-image』 後,執行『make』>

    因為這三個步驟都是每次建置都會跑過,所以這邊的變更都會執行。

  • 專案建置完後,修改一些基本的系統選項,像是『architecture』,『toolchain的組態』,『toolchain的類型』或是『init system』等等 >

    這類型的修改一定要重新建置。

  • 專案建置完後,修改『output/build』底下的source code >

    首先,要記得這個資料夾底下的東西都是暫存的,只要『make clean』以後都會被清掉,所以如果想要保持著重複性的話,盡量不要在這邊修改檔案。所以在這種狀況之下要建置的話,因為系統已經標記為這個套件已經建置過了,所以它不會幫你重新建置,你一樣必須要用指令:
    make <pkg>-reconfigure
    make <pkg>-rebuild

如果你需要重新建置整個專案,但是你又覺得建置時間太久,想要快一點的話,下面有幾個建議可以試看看:

  • 使用更快的硬體,像是『SSD』或是加記憶體。
  • 別用虛擬機,虛擬機會有許多限制。
  • 可使用ccache,記得使用變數『BR2_CCACHE』。
  • 使用external的toolchain (因為就不用花時間在這些toolchain了)。
  • 只要花時間在你要用的套件就好 (所以你要知道許多相依性)。
  • 千萬不要用NFS等net filesystem,直接都在local建置就好。
  • 使用上面介紹過的『out of tree build』或是『BR2_EXTERNAL』機制。

results matching ""

    No results matching ""