1. 程式人生 > >OpenWrt quilt patch 方法

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)。