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.mzph.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; 第二层架构主要完成大多数的核心服务…