在有些狀況之下,專案建置之前須要用到一些patch來修改source code,通常系統都會在建置組態『./configure』之前會套用這些patch。使用patch會用底下的順序:
- 如果需要下載的patch則需要在『mk』檔裡面的『<pkg>_PATCH』變數裡面去設定,設定完之後便會自動下載。
- 只要是在同一個資料夾底下的『*.patch』檔,都會被套用。
- 如果你有在『.config』裡面去定義『BR2_GLOBAL_PATCH_DIR』的話,系統也會從這邊去套用patch,當然你可以直接將patch放在你的套件的資料夾裡就好(eg. buildroot/package/<pkg>/*.patch』),但是這樣就會去改到buildroot的結構,所以最好還是統一放在『Global Dir』裡面,命名方式主要在『Global Dir』底下,在用套件的名字來建立資料夾(eg. ~/myPatches/strace/001-Demo-strace-chage.patch)。
- patch套用的順序主要是由你patch的檔頭編號,所以最好你的patch要由小到大『001~010』這樣子的編號,這樣系統就會完全照你的順序來套用,否則就會直接由字母順序來套用,會比較不直覺。
下圖是一個伺服器nginx的patch清單:
(來源 : free-electrons )
在這個buildroot裡,如果是像上面這樣子的命名規則,就會非常清楚,因為你可以知道它的順序,也可以很清楚的知道每一個patch的用途。而最好是裡面還要包含一個『Signed-off-by』的資訊如下:
(來源 : free-electrons )
要知道畢竟這是open source,大家都有可能用到,所以每件事都要讓後人好維護才對。
Generating patches
有兩個方式可以產生patch 檔,如果你的案子是有版本管控的話,當然就是用『git』拉,如果沒有的話用『quilt』也蠻方便的。
git patch(必須在buildroot外面去做這件事)
- clone 專案
git clone git://...
- 建立branch
git checkout -b buildroot-changes v3.2
引入既有的patches
git am /path/to/buildroot/package/<foo>/*.patch
修改檔案並且commit
git commit -s -m \`\`this is a change'
產生patches
git format-patch v3.2
quilt patch:
- 解壓縮sorce code (buildroot將下載完的package放在資料夾『dl』裡面)
tar xf /path/to/dl/<foo>-<version>.tar.gz
- 在source code裡面,建立一個patch資料夾
mkdir patches
- 引入既有的patch
quilt import /path/to/buildroot/package/<foo>/*.patch
- 套用既有的patch
quilt push -a
- 建立新的patch
quilt new 0001-fix-header-inclusion.patch
- 修改檔案
quilt edit main.c
- 將修改存入patch
quilt refresh