2018年1月10日 星期三

Linux - 管理 patch 的工具 : quilt


  • 1. 使用 quilt 
    • 需要在其他開發者的 source code 增加程式碼 (例 : linux kernel, hostapd ...)
      因爲無法直接使用 git 的方式 push code,
      所以使用 patch 的方式增加需要修改的 code,
      而 quilt 就是管理和產生 patch 的工具
    • quilt 的操作跟 stack 一樣,
      quilt push -> 把一個 patch 的內容放到 source code
      quilt pop  -> 讓 source code 的內容回復還沒有上一個 patch 的狀態
  • 2. 安裝 quilt
    • sudo apt-get install quilt
  • 3. 設定 quilt 產生 patch 的格式
    • [1] cat > ~/.quiltrc <<EOF
    • [2] QUILT_DIFF_ARGS="--no-timestamps--no-index -pab --color=auto“
    • [3] QUILT_REFRESH_ARGS="--no-timestamps--no-index -pab"
    • [4] QUILT_PATCH_OPTS="--unified"
    • [5] QUILT_DIFF_OPTS="-p"
    • [6] QUILT_SERIES_ARGS="--color=auto"
    • [7] EDITOR="vim", EDITOR="nano"
      • 修改 patch 的編輯器 (這行不一定要加, 產生patch後, 再使用自己習慣的編輯器去修改)
    • [8] EOF
  • 4. 產生沒有任何 patch 的原始 hostapd source code
    • make package/hostapd/{clean,prepare} V=s QUILT=1
      • 在 clean 之前, 如果有修改其他 hostapd 的檔案, 要記得備份,
        否則指令執行後, 所有改過且沒有 push 到 remote server 的內容都會不見,
        檔案會回到 local server 最新的 commit 內容
  • 5. 進入到編譯的目錄
    • cd build_dir/target-*/hostapd-*
      • folder 名稱不是固定的, 因此用 * 表示
  • 查詢 patch
    • 查詢目前有哪些 patch
      • quilt series
        • 以下三種顏色是在 vim 顯示的, 可能會根據不同的編譯器有不同的結果
          綠色的字 : 已經 apply 的 patch

          橘色的字 : 
          已經 apply 的 patch, 且是目前最新的 patch
          白色的字 : 還沒
           apply 的 patch
      • 所有的 patch 名稱跟 patch 的先後順序會記錄在 patches/series 的檔案裡
    • 查詢已經 apply 的 patch
      • quilt applied
    • 查詢還沒 apply 的 patch
      • quilt unapplied
    • 查詢下一個要 apply 的 patch
      • quilt next
    • 查詢目前 apply 最新的 patch
      • quilt top
    •  patch 包含哪些檔案
      • quilt files
      • 只會查目前 apply 最新的 patch修改哪些檔案,
        不會顯示前面其他 patch 修改的檔案
      • 如果沒有先 quilt push, quilt files 會出現 "No patches applied"
  • 套用(push)/還原(pop) patch
    • 假設 patches/series 的內容依序有以下三個 patch
      112-test.patch

      113-test.patch

      114-test.patch
    • quilt push 及 quilt pop 的指令結束後, 都會顯示 “Now at patch ... 
      但如果現在沒有 apply 任何 patch, 就會顯示 
      ” No patches applied “
    • quilt push -a
      • apply 所有的 patch
        • 會一次 apply 上面三個 patch
    • quilt push test_patch_name.patch
      • apply 特定的 patch
        • 如果是 quilt push 113-test.patch,
          就只會 apply 
          113-test.patch (包含)這個之前的所有 patch
    • quilt push
      • 一次只會 apply 一個 patch, 會從最前面的 patch 開始 apply
        • 第一次 quilt push -> 會 apply 112-test.patch
          第二次 quilt push -> 會 apply 113-test.patch
    • quilt pop -a
      • undo 所有的 patch
        • 會一次撤銷上面三個 patch
          指令結束後, 會看到 ” 
          No patches applied “
    • quilt pop 112-test.patch
      • 會將 patch 現在的位置回到特定的 patch
        • [1] 如果先執行 quilt push -a, 結果如下 : 
          • 112-test.patch113-test.patch114-test.patch
        • [2] 如果再執行 quilt pop 112-test.patch   
               會撤銷 
          112-test.patch 之後所有的 patch,
               但會保留 112-test.patch 的內容, 結果如下 : 
          • 112-test.patch
    • quilt pop
      • 一次只撤銷一個 patch, 會從最後面的 patch 開始撤銷
        • [1] 如果先執行三次 quilt push, 結果如下 : 
          • 112-test.patch
            113-test.patch

            114-test.patch
        • [2] 如果再執行 quilt pop會撤銷 114-test.patch, 結果如下 : 
          • 112-test.patch
            113-test.patch
        • [3] 如果再執行 quilt pop會撤銷 113-test.patch結果如下 : 
          • 112-test.patch
  • 新增 patch
    • quilt new 115-new-test.patch
  • 移除 patch
    • quilt delete 115-new-test.patch
  • 新增檔案
    • quilt add quilt_add_01.c
      • 會新增到目前 apply 最新的 patch
  • 修改檔案
    • quilt edit quilt_add_02.c
      • 會先做 quilt add quilt_add_02.c,
        再用一開始設定的 editor 開啓 
        quilt_add_02.c 這個檔案
  • 移除檔案
    • quilt remove quilt_add_01.c
  • 更新或產生 patch
    • quilt refresh
      • 將新增修改的檔案內容存到 .patch 檔案裡
  • ref
    • http://www.fmddlmyy.cn/text28.html
    • http://bruce-wang.blogspot.tw/2007/12/patch-quilt-mkdir-patches-1.html
    • http://wen00072.github.io/blog/2014/06/08/study-on-the-quilt/
    • http://www.cnblogs.com/xuyh/p/6278937.html
    • http://linux.die.net/man/1/quilt

沒有留言:

張貼留言