patch命令在代碼管理中的應用

patch 是一個用于將差異文件(補丁)應用到源代碼的工具,常用于修復 bug、添加功能或調整代碼結構。在您提供的代碼中,patch 命令通過一系列補丁文件(.patch)修改了 open-amp 庫的源代碼。


patch 命令的核心作用

  1. 應用補丁:根據補丁文件(.patch)中的差異描述,修改目標文件的代碼。
  2. 自動化代碼修改:在構建流程中自動修改第三方庫的代碼,無需手動編輯。

關鍵參數解析

在您的代碼中,patch 命令的格式如下:

patch -p0 -d ${CMAKE_CURRENT_LIST_DIR} < ${PATCH_FILE}
  • -p0

    • 指定“路徑剝離級別”,-p0 表示保留補丁文件中的完整路徑
    • 例如,如果補丁文件中的路徑是 a/src/file.c,且當前目錄是 /project,則實際路徑為 /project/a/src/file.c
    • 如果使用 -p1,則會剝離第一級路徑,變為 src/file.c
  • -d ${CMAKE_CURRENT_LIST_DIR}

    • 指定補丁應用的工作目錄,即在此目錄下執行補丁操作。
  • < ${PATCH_FILE}

    • 將補丁文件內容作為輸入傳遞給 patch 命令。

補丁文件的生成

補丁文件通常通過 diff 命令生成,例如:

diff -u original_file.c modified_file.c > my_patch.patch

生成的 .patch 文件會描述兩個文件的差異。


在您的代碼中的具體行為

  1. 下載 open-amp:通過 FetchContent_Declare 下載指定版本的代碼。
  2. 應用補丁:通過 PATCH_COMMAND 依次應用多個補丁文件(0001-*.patch0014-*.patch),每個補丁對應一個代碼修改。
    • 例如,0001-ns-acknowledge-the-received-creation-message.patch 可能修復了某個協議問題。
  3. 不執行構建CONFIGURE_COMMANDBUILD_COMMAND 等被設為空,表示只下載代碼并打補丁,不立即構建。

常見問題

  1. 補丁順序:補丁文件通常需要按順序應用(如 00010002),否則可能因依賴關系失敗。
  2. 路徑問題:若補丁文件中的路徑與目標代碼路徑不匹配,需調整 -p 參數。
  3. 兼容性:補丁可能因代碼版本更新而失效(例如原文件被修改)。

調試補丁

  • 手動測試補丁:
    cd ${CMAKE_CURRENT_LIST_DIR}
    patch -p0 --dry-run < 0001-*.patch  # 模擬應用補丁(不實際修改文件)
    patch -p0 < 0001-*.patch            # 實際應用補丁
    
  • 若失敗,檢查:
    1. 補丁文件路徑是否正確。
    2. 目標代碼是否已更新導致沖突。

總結

在您的代碼中,patch 命令用于在下載 open-amp 庫后自動修改其源代碼。每個補丁文件對應一個代碼變更,通過 -p0-d 參數確保路徑正確。這是管理第三方依賴時常見的自定義代碼行為的方法。


-p 參數決定了 補丁文件中的路徑如何被解析,直接關系到補丁能否正確應用到目標文件。它的核心作用是 “剝離補丁文件中路徑的前綴層級”,具體行為通過以下對比可以清晰理解:


場景對比:-p0 vs -p1

假設補丁文件 (my_patch.patch) 中的路徑描述如下:

--- a/src/main.c   # 原始文件路徑
+++ b/src/main.c   # 修改后的文件路徑
@@ -10,7 +10,7 @@
-    printf("Hello World");
+    printf("Hello OpenAMP");
1. 使用 -p0
  • 行為:保留補丁文件中的完整路徑,直接按路徑尋找文件。
  • 應用命令
    patch -p0 < my_patch.patch
    
  • 路徑解析
    • 補丁中的路徑:a/src/main.c
    • 實際尋找的路徑:當前目錄/a/src/main.c
  • 適用場景
    • 補丁文件中的路徑是 絕對路徑相對于當前目錄的完整路徑
    • 例如:你的代碼目錄結構完全匹配補丁中的路徑層級(如存在 a/src/main.c)。
2. 使用 -p1
  • 行為:剝離補丁文件中路徑的第一級目錄(即 a/b/)。
  • 應用命令
    patch -p1 < my_patch.patch
    
  • 路徑解析
    • 補丁中的路徑:a/src/main.c
    • 實際尋找的路徑:當前目錄/src/main.c
  • 適用場景
    • 補丁文件中的路徑包含冗余的根目錄(如 a/ 是臨時目錄,實際代碼位于 src/ 下)。
    • 例如:補丁是從 Git 倉庫生成的(Git 默認生成包含 a/b/ 的路徑)。

實際應用場景示例

場景 1:補丁來自 Git 倉庫
  • 生成補丁
    git diff > my_patch.patch
    
  • 補丁內容
    --- a/src/main.c
    +++ b/src/main.c
    
  • 應用補丁
    # 進入項目根目錄(包含 `src/` 目錄)
    cd /path/to/project
    patch -p1 < my_patch.patch  # 剝離 `a/`,實際路徑變為 `src/main.c`
    
場景 2:手動生成的補丁
  • 生成補丁
    diff -u old_file.c new_file.c > my_patch.patch
    
  • 補丁內容
    --- old_file.c
    +++ new_file.c
    
  • 應用補丁
    # 假設當前目錄下直接有 old_file.c
    patch -p0 < my_patch.patch  # 不剝離任何路徑
    

調試技巧

  • 檢查補丁中的路徑

    head -n 3 my_patch.patch  # 查看補丁文件的路徑描述
    

    輸出示例:

    --- a/src/main.c
    +++ b/src/main.c
    

    此時需要決定是否剝離 a/b/

  • 試運行(不實際修改文件)

    patch -p1 --dry-run < my_patch.patch
    
  • 路徑不匹配時的表現

    • 如果 -p 參數錯誤,會看到類似錯誤:
      can't find file to patch at input line 3
      

經驗法則

  1. 從 Git 生成的補丁:通常用 -p1(剝離 a/b/)。
  2. 手動生成的補丁
    • 如果補丁路徑是相對當前目錄的完整路徑,用 -p0
    • 如果補丁路徑包含多余的前綴(如臨時目錄名),用 -p1 或更高。
  3. Linux 內核補丁:慣例使用 -p1(剝離根目錄)。

回到你的代碼

在示例中,補丁文件路徑是直接相對于 ${CMAKE_CURRENT_LIST_DIR} 的,例如:

0001-ns-acknowledge-the-received-creation-message.patch

補丁中的路徑可能類似:

--- open-amp-main/lib/remoteproc.c
+++ open-amp-main/lib/remoteproc.c

此時:

  • 如果代碼解壓后位于 ${CMAKE_CURRENT_LIST_DIR}/open-amp-main,則用 -p0(保留完整路徑)。
  • 如果代碼解壓后直接展開到 ${CMAKE_CURRENT_LIST_DIR}/lib/remoteproc.c,則可能需要 -p1(剝離 open-amp-main/)。

總結

  • -p0:保留補丁文件中的完整路徑,適合路徑完全匹配的場景。
  • -p1:剝離補丁路徑的第一級目錄,適合處理 Git 補丁或冗余前綴。

實際使用時,觀察補丁文件中的路徑層級和目標代碼的位置關系即可快速判斷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81401.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

spring-ai集成langfuse

1、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.…

PyTorch 與 TensorFlow:深度學習框架的深度剖析與實戰對比

PyTorch 與 TensorFlow&#xff1a;深度學習框架的深度剖析與實戰對比 摘要 &#xff1a;本文深入對比 PyTorch 與 TensorFlow 兩大深度學習框架&#xff0c;從核心架構、優缺點、適用場景等多維度剖析&#xff0c;結合實例講解&#xff0c;幫助開發者清晰理解兩者特性&#x…

如何配置NGINX作為反向代理服務器來緩存后端服務的響應?

大家好&#xff0c;我是鋒哥。今天分享關于【如何配置NGINX作為反向代理服務器來緩存后端服務的響應&#xff1f;】面試題。希望對大家有幫助&#xff1b; 如何配置NGINX作為反向代理服務器來緩存后端服務的響應&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源…

DiT:文檔圖像Transformer 的自監督預訓練

摘要 圖像transformer&#xff08;Image Transformer&#xff09;最近在自然圖像理解方面取得了顯著進展&#xff0c; 無論是使用監督&#xff08;ViT、DeiT等&#xff09;還是自監督&#xff08;BEiT、MAE等&#xff09;預訓練技術。在本文中&#xff0c;我們提出了DiT&#…

51c嵌入式~電路~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/11888986 一、電流檢測電路 電流檢測的應用 電路檢測電路常用于&#xff1a;高壓短路保護、電機控制、DC/DC換流器、系統功耗管理、二次電池的電流管理、蓄電池管理等電流檢測等場景。電路專輯 對于大部分應用&#xff…

【Git】萬字詳解 Git 的原理與使用(上)

&#x1f970;&#x1f970;&#x1f970;來都來了&#xff0c;不妨點個關注叭&#xff01; &#x1f449;博客主頁&#xff1a;歡迎各位大佬!&#x1f448; 文章目錄 1. 初識 Git1.1 Git 是什么&#xff1f;1.2 為什么要有 Git 2. 安裝 Git2.1 Linux-Ubuntu 安裝 Git2.2 Windo…

【原創開發】無印去水印[特殊字符]短視頻去水印工具[特殊字符]支持一鍵批量解析

支持&#xff1a;快手&#xff0c;抖音&#xff0c;小紅書&#xff0c;嗶哩嗶哩&#xff0c;等多款應用去水印&#xff0c;支持圖集解析下載 【應用名稱】&#xff1a;無印 【應用版本】&#xff1a;1.3 【應用大小】&#xff1a;17M 【測試機型】&#xff1a;小米14 【下載鏈…

qemu(3) -- qemu-arm使用

1. 前言 qemu中有很多的特技&#xff0c;此處記錄下qemu-arm的使用方式&#xff0c;簡單來說qemu-system-xx用于虛擬整個設備&#xff0c;包括操作系統的運行環境&#xff0c;而qemu-xx僅虛擬Linux應用程序的環境&#xff0c;不涉及操作系統&#xff0c;應用程序的系統調用有宿…

Docker的簡單使用(不全)

Docker Hello World Docker 允許在容器內運行應用程序&#xff0c;使用docker run命令來在容器內運行一個應用程序 輸出Hello World runoobrunoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"Hello world docker&#xff1a;Docker的二進制執行文件 run…

SALOME源碼分析: 命令系統

本文分析SALOME中命令系統&#xff0c;涉及的知識點包括&#xff0c; MDF框架數據對象模型 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。注2&#xff1a;文章內容會不定期更新。 一、命令對象 1.1 Class Hierarchy 1.2 SUIT_Operation #…

Bootstrap(自助法)??:無需假設分布的統計推斷工具

核心思想?? Bootstrap 是一種??重采樣&#xff08;Resampling&#xff09;技術??&#xff0c;通過在原始數據中??有放回地重復抽樣??&#xff0c;生成大量新樣本集&#xff0c;用于估計統計量&#xff08;如均值、方差&#xff09;的分布或模型性能的不確定性。 ??…

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸&#xff08;Python沙盒逃逸深度解析&#xff09; 一、沙盒逃逸的核心目標 執行系統命令 通過調用os.system、subprocess.Popen等函數執行Shell命令&#xff0c;例如讀取文件或反彈Shell。 文件操作 讀取敏感文件&#xff08;如/etc/passwd&#xff09;、寫入后門文件…

融智學數學符號體系的系統解讀(之一)

融智學數學符號體系的系統解讀 一、道函數&#xff08;Dao Function&#xff09; 數學表達式&#xff1a; f(x,y,z)0&#xff08;狹義&#xff09; f(x,y,z,ict)0&#xff08;廣義&#xff09; 符號解析&#xff1a; x: 形象思維坐標軸 數學意義: 表征基于感官輸入的多模…

Java 中使用正則表達式

1. 引入包 在使用正則表達式之前,需要引入包: import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式規則 元字符 :這些是正則表達式中的特殊字符,用于匹配特定的模式。 . :匹配任意單個字符(換行符除外)。例如,a.b 可以匹配 "acb&quo…

cat file.tar.gz | tar -xzf - -C /target/dir兩個減號之間為什么有個空格?是寫錯了嗎?(管道命令后續)

在 tar 命令的參數 -xzf - -C 中&#xff0c;兩個減號&#xff08;-&#xff09;之間的空格是故意保留的語法&#xff0c;沒有寫錯。具體原因如下&#xff1a; 1. -xzf - 的語法解析 -xzf 是 tar 命令的組合參數&#xff1a; x&#xff1a;表示解壓&#xff08;extract&#x…

Linux中的系統延時任務和定時任務與時間同步服務和構建時間同步服務器

延時任務 在系統中我們的維護工作大多數時在服務器行對閑置時進行 我們需要用延遲任務來解決自動進行的一次性的維護 延遲任務時一次性的&#xff0c;不會重復執行 當延遲任務產生輸出后&#xff0c;這些輸出會以郵件的形式發送給延遲任務發起者 在RHEL9中默認系統中的所有普通…

C++之IO流

目錄 一、C語言的輸入與輸出 二、流是什么 三、CIO流 3.1、C標準IO流 3.2、C文件IO流 四、stringstream的簡單介紹 一、C語言的輸入與輸出 C語言中我們用到的最頻繁的輸入輸出方式就是scanf ()與printf()。 scanf(): 從標準輸入設備(鍵盤)讀取數據&#xff0c;并將值存放…

Fedora升級Google Chrome出現GPG check FAILED問題解決辦法

https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0x7FAC5991)已安裝 https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公鑰(0xD38B4796)已安裝 倉庫 "google-chrome" 的 GPG 公鑰已安裝&#xff0c;但是不適用于此軟件包。 請檢查此倉庫的…

極光PDF編輯器:高效編輯,輕松管理PDF文檔

在日常工作和學習中&#xff0c;PDF文件的使用越來越普遍。無論是學術論文、工作報告還是電子書籍&#xff0c;PDF格式因其穩定性和兼容性而被廣泛采用。然而&#xff0c;編輯PDF文件往往比編輯Word文檔更加復雜。今天&#xff0c;我們要介紹的 極光PDF編輯器&#xff0c;就是這…

MySQL進階(一)

一、存儲引擎 1. MySQL體系結構 連接層&#xff1a; 最上層是一些客戶端和鏈接服務&#xff0c;主要完成一些類似于連接處理、授權認證、及相關的安全方案。服務器也會為安全接入的每個客戶端驗證它所具有的操作權限 服務層&#xff1a; 第二層架構主要完成大多數的核心服務…