[高通] IPQ 系列 FAQ3 - 幫軟件製做補丁包

隨著現今軟體架構越來越龐大, 系統越來越複雜, 當軟體工程師的你我, 每當想對開源碼或是原廠的軟件做一些修改, 往往都是直接些修改,再上傳到自己的版控系統. 即使要做一個補丁, 也總是大費周章. 但在 Openwrt 的架構裡, 可以簡單為每個軟件做補丁包. 一般做補丁的方法有很多種, 像是透過版控系統做補丁(git diff), 或是使用 linux 的 diff 套件功能. 但如果程式邏輯發生錯誤, 或是軟件修改地方有誤, 勢必得要一步一步把先前的補丁移除, 重新編譯, 一個一個驗證. Quilt 工具, 可以幫助我們快速製作補丁,也幫我們管理補丁,並協助我們快速驗證補丁的效果.

1. QUILT


Quilt 是一個可以幫我們快速製作補丁,管理補丁的工具. 今天來為大家簡單介紹, 它幾個常用的指令, 希望可以幫助你我, 降低在開發上的一些困擾.
我將以 OpenWRT 的 hostapd 為例子.

2. 編譯


在編譯 Openwrt 的 hostapd 套件時, 需要新增一個參數 (QUILT), 並將其指定為 1

qsdk$ make package/qca-hostap/{clean,compile} V=s QUILT=1

3. 新增補丁


新增補丁時, 需要到編譯的套件底下進行

$ cd /qsdk/build_dir/target-arm_cortex-a7_musl-1.1.16_eabi/qca-hostap-default/qca-hostap-g

4. 更新補丁包

$ quilt refresh


我們馬上就會在 hostapd 的 patches 目錄下, 看見新增的補丁(xxx.patch), 當然這時候的補丁內容都是空的

5. 編輯補丁

我們可能會會有一些客製化的需求, 需要對軟件進行修改. 我簡單的在 main funciton 中, 新增一個 Hello world. 在編輯補丁時, 需要搭配 quilt 命令. 在修改完後, 儲存離開.

$ quilt refresh




接著我們需要更新我們的補丁包, 並查看補丁內容, 是否已經有剛剛修改的內容.

$ cat patches/xxx.patch

Index: qca-hostap-g/hostapd/main.c
===================================================================
--- qca-hostap-g.orig/hostapd/main.c
+++ qca-hostap-g/hostapd/main.c
@@ -681,6 +681,8 @@ int main(int argc, char *argv[])
struct dpp_global_config dpp_conf;
#endif /* CONFIG_DPP */

+ printf("My Patch - Hello World!\r\n");
+
if (os_program_init())
return -1;

6. 重新編譯


在我們已經新增了一個補丁, 我們會需要驗證補丁是不是真的沒有什麼問題. 這時, 我們就需要重新編譯軟件. 如果編譯上有問題, 就表示剛剛新增的補丁包有問題.

qsdk$ make package/qca-hostap/compile V=s QUILT=1


Note : 記得此時千萬不要在加 clean, 不然剛剛新增的補丁就會被整個清除掉.

7. 測試補丁


在我們重新編譯完, 我們會想驗證剛剛的補丁是否真的有進入到系統裡, 我們就把剛編譯好的程式, 拷貝到系統中測試



我們可以看見, 我們剛剛新增的內容已經到應用程式裡面了.

8. 新增管理補丁


我們已經驗證過, 該補丁已經可以正常運作. 接下來, 我們只需要將補丁放到 SDK 原生的 patch 目錄中, 並再重新編譯一次軟件即可. 這個補丁就永遠都會存在.

$ cp build_dir/target-arm_cortex-a7_musl-1.1.16_eabi/qca-hostap-default/qca-hostap-g/patches/xxx.patch qca/src/qca-hostap/qca-patches/311-test.patch

qsdk$ make package/qca-hostap/{clean,compile} V=s QUILT=1

9. 動態測試補丁


隨著程式的開發, 我們可能已經新增了很多個補丁, 但是某一天程式突然發生問題, 我們就可以透過 quilt 的 push 跟 pop 做測試.
我們在先前已經新增了一個 test 補丁, 我們想動態測試把剛剛的補丁給暫時移除, 透過 quilt pop 就可以完成了.

$ cd build_dir/target-arm_cortex-a7_musl-1.1.16_eabi/qca-hostap-default/qca-hostap-g/
$ quilt pop




會顯示目前最後一個補丁是什麼

qsdk$ make package/qca-hostap/compile V=s QUILT=1


編譯好的程式, 就沒有剛剛新增的補丁. 如果我們想將剛剛的補丁, 新增回來, 只需要透過 quilt push 即可.

$ cd build_dir/target-arm_cortex-a7_musl-1.1.16_eabi/qca-hostap-default/qca-hostap-g/
$ quilt push



qsdk$ make package/qca-hostap/compile V=s QUILT=1

10. 刪除補丁


有時候在開發中, 我們使用 quilt 工具, 協助我們做補丁, 新產生出來的補丁, 我們可能不需要了, 這時候就可以透過 quilt delete file-name 將該補丁給刪除.

$ quilt delete 311-test.patch




該補丁則會從目前的編譯環境中被移除, 如果想永遠移除掉該補丁, 就需要到原始 SDK 的地方將該補丁給移除.

11. 結論


在開源碼中, 對套件做修改是很平常的事, 所以熟悉善用 quilt 工具是很方便的一件事, 也可以增加我們開發的效率. 但是製作補丁, 也不是完全的那麼美好, 在製作的補丁會越來越多,只要中間有一個補丁有做修改, 從那之後的補丁, 可能就需要一個一個個別驗證. 希望這篇文章能夠幫助你.

12. 參考


1. QUILT
2. Quilt-patch

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論