OpenWrt quilt patch 方法
轉自: http://blog.csdn.net/wwx0715/article/details/25160361
一、前言
配置完Openwrt後,首次編譯時會在編譯過程中下載各種原始碼包,而且解壓這些原始碼包並打上patch。
需要對原始碼進行修改時,可直接修改原始碼並重新編譯,但clean後再次編譯時會再次解壓原始碼包,以至所做
的修改全部丟失。本文參考Openwrt官網提供的patch管理方法,實踐操作並記錄linux kernel及package源
碼修改並生成patch的方法。
二、環境及準備工作
2.1 開發環境
linux發行版:ubuntu12.0LTS
OpenWrt版本:trunk r37950(linux kernel 3.10.10)
硬體:ap121相容模組(ar9331)
2.2 準備工作
patch的管理工具使用quilt,在ubuntu下使用apt-get intallquilt安裝quilt工具。
為了讓quilt建立適合OpenWrt格式的patch,需要在本地home目錄下建立quilt的配置檔案.quiltrc,該配
置檔案包含diff和patch的選項。使用如下命令可建立quilt的配置檔案:
cat> ~/.quiltrc <<EOF
QUILT_DIFF_ARGS="--no-timestamps--no-index -pab --color=auto"
QUILT_REFRESH_ARGS="--no-timestamps--no-index -pab"
QUILT_PATCH_OPTS="--unified"
QUILT_DIFF_OPTS="-p"
EDITOR="vim"
EOF
EDITOR指定編輯時所用的編輯器,該處使用vim。
三、package的patch方法
3.1 修改內容
package的patch生成方法以修改tftp-hpa為例進行介紹,修改內容為在tftp的main函式中加入一條列印
資訊。(進行該操作之前,需要在make menuconfig時選擇tftp-hpa包)
3.2 pactch生成步驟
1. 準備tftp-hpa原始碼
make package/feeds/packages/tftp-hpa/{clean,prepare} V=s QUILT=1
此命令會解壓tftp-hpa的原始碼包並準備patch檔案(如果有),通過列印資訊可獲取解壓到的目錄路徑。
2.進入tftp-hpa原始碼目錄
cd build_dir/ /target-mips_r2_uClibc-0.9.33.2/tftp-hpa-0.48
3.安裝所有已有patch
quilt push -a
4.建立新patch
quilt new 001-main_test.patch
patch檔名以數字開頭,“-”後為patch的描述資訊
開頭的數字必須比已有patch的數字都大,使用命令quilt series檢視已有patch的列表
5.修改原始碼檔案
quilt edit tftp/main.c
該命令將使用在.quiltrc中定義的編輯器開啟main.c檔案,在main函式中增加一條列印資訊。
如果還有其他檔案需要修改,可繼續用此命令進行修改
6.檢視修改內容
quilt diff
7.更新修改到patch檔案
quilt refresh
此命令會將更新的修改儲存到當前目錄的patches/001-main_test.patch(如果沒有 patches目錄會自動建立)。
8.返回到buildroot目錄
cd ../../../
9.儲存patch檔案到buildroot
makepackage/feeds/packages/tftp-hpa/update V=s
10. 重新編譯tftp-hpa包以測試修改
make package/feeds/packages/tftp-hpa/{clean,compile} package/index V=s
11.如果有問題,需要編輯patch檔案
3.3 編輯已有patch檔案
當需要對patch進行修改時,可使用以下步驟:
1.準備tftp-hpa原始碼
make package/feeds/packages/tftp-hpa/{clean,prepare} V=s QUILT=1
2. 進入tftp-hpa原始碼目錄
cd build_dir/ /target-mips_r2_uClibc-0.9.33.2/tftp-hpa-0.48
3.列出可用的patch
quilt series
4.準備要修改的patch
quilt push 001-main_test.patch
此命令會按patch編號順序打補丁,直到指定的patch(包含)
如果當前應用的patch編號已經超過了指定的patch編號,將會按相反順序移除 patch直到指定的patch
5.編輯原始碼檔案
quilt edit tftp/main.c
6.檢查patch中包含的所修改的檔案
quilt files
7.檢視修改內容
quilt diff
8.儲存修改到patch
quilt refresh
9.返回buildroot目錄
cd ../../../
10.儲存patch檔案到buildroot
make package/feeds/packages/tftp-hpa/update V=s
11.重新編譯tftp-hpa包以測試修改
make package/feeds/packages/tftp-hpa/{clean,compile} package/index V=s
四、linux核心patch方法
4.1 修改內容
使用的模組為基於ar9331的ap121相容板,根據該模組的硬體需要在ap121的基礎上
做兩處修改:
1.硬體復位的GPIO變更(arch/mips/ath79/mach-ap121.c)
2.增加新flash s25fl164k1的支援(driver/mtd/devices/m25p80.c)
核心的patch分兩種,一種是基於platform的,另一種是generic的,修改1屬於platform,修改2屬於generic。
4.2 platform patch生成步驟
platform形式的patch生成步驟如下(原始碼修改mach-ap121.c):
1.準備核心原始碼樹,使用如下命令
make target/linux/{clean,prepare} V=s QUILT=1
2.進入kernel原始碼樹目錄
對attitudeadjustment版本,kernel原始碼樹所在目錄為build_dir/linux-*/linux-3.*
對本文使用的trunk版本,使用如下命令進入kernel原始碼樹
cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
3.安裝所有已有patch
quilt push -a
4.建立新patch
quilt new platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
patch檔名以數字開頭,“-”後為patch的描述資訊
開頭的數字必須比已有patch的數字都大,使用命令quilt series檢視已有patch的列表
新建platform的patch時需要在patch名前新增“platform/”字首
5.修改原始碼檔案
quilt edit arch/mips/ath79/mach-ap121.c
該命令將使用在.quiltrc中定義的編輯器開啟mach-ap121.c檔案,修改對復位GPIO的定義。
如果還有其他檔案需要修改,可繼續用此命令進行修改
6.檢視修改內容
quilt diff
7.更新修改到patch檔案
quilt refresh
此命令會將更新的修改儲存到當前目錄的patches/platform/910-MIPS-ath79-ap121-reset-gpio-change.patch
8.返回到buildroot目錄
cd ../../../../
9.儲存patch檔案到buildroot
make target/linux/update V=s
此命令會將910-MIPS-ath79-ap121-reset-gpio-change.patch儲存到target/linux/ar71xx/patches-3.10/
4.3 generic patch生成步驟
generic形式的patch生成步驟如下(原始碼修改m25p80.c):
1.準備核心原始碼樹,使用如下命令
make target/linux/{clean,prepare} V=s QUILT=1
2.進入kernel原始碼樹目錄
對attitude adjustment版本,kernel原始碼樹所在目錄為build_dir/linux-*/linux-3.*
對本文使用的trunk版本,使用如下命令進入kernel原始碼樹
cd build_dir/target-mips_r2_uClibc-0.9.33.2/linux-ar71xx_generic/linux-3.10.10
3.安裝所有已有patch
quilt push -a
4.建立新patch
quilt new 998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch
patch檔名以數字開頭,“-”後為patch的描述資訊
開頭的數字必須比已有patch的數字都大,使用命令quilt series檢視已有patch的列表
新建generic的patch時需要在patch名前新增“generic/”字首
5.修改原始碼檔案
quilt edit driver/mtd/devices/m25p80.c
該命令將使用在.quiltrc中定義的編輯器開啟m25p80.c檔案,增加對s25fl164k1的宣告。
如果還有其他檔案需要修改,可繼續用此命令進行修改
6.檢視修改內容
quilt diff
7.更新修改到patch檔案
quilt refresh
此命令會將更新的修改儲存到當前目錄的patches/generic/998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch。
8.返回到buildroot目錄
cd ../../../../
9.儲存patch檔案到buildroot
make target/linux/update V=s
此命令會將998-mtd-m25p80-add-support-for-spansion-s25fl164k1-flash.patch儲存到target/linux/generic/patches-3.10/
五、更新patches
當已打補丁的package(或者kernel)更新到新版本時,patch現有補丁時可能不會順利,出現一些不確定性。
可以通過make的refresh target重建整個patch。
對package,使用類似如下的命令:
make package/feeds/packages/tftp-hpa/refresh V=s
對kernel,使用如下命令:
make target/linux/refresh V=s
六、迭代修改patch
進行新的修改時,可能會對patch進行多次修改。為了加快開發速度,可以在保持原始碼樹的情況下進行修改操作。
1.準備原始碼樹
2.進入原始碼目錄
3. 應用所要打的patch
4.編輯原始碼檔案,更新patch
5.應用所有patch(quilt push -a)
6.返回buildroot目錄,執行命令make package/feeds/packages/tftp-hpa/{compile,install}或make target/linux/{compile,install}(對kernel)
7.測試韌體
8.如果需要進一步修改,返回第二步
9,使用命令make package/feeds/packages/tftp-hpa/update或make target/linux/update(對kernel)將patches拷貝到buildroot
七、參考
主要參考OpenWrt的官網對patch的相關開發說明openwrt.org(Documentation->Developing->patches)。