在Debian系统上修改开源软件源代码制作patch - 教程

news/2025/9/26 18:49:46/文章来源:https://www.cnblogs.com/lxjshuju/p/19114073

在Debian系统上修改开源软件源代码制作patch

整个过程可以分为以下几个主要步骤:

  1. 准备环境: 安装编译工具和blueman的编译依赖。
  2. 获取源码: 下载blueman的Debian源码包。
  3. 修改代码并创建Patch: 使用Debian推荐的quilt工具进行修改和补丁管理。
  4. 编译打包: 将你的修改和源码一起编译成一个新的.deb安装包。
  5. 安装和验证: 安装你新编译的包,并验证修改是否生效。

详细步骤

第1步:准备环境

首先,你需要确保你的系统已经准备好进行软件编译。

  1. 启用源码仓库
    你需要编辑 /etc/apt/sources.list 文件,确保每一行 deb 地址后面都有一行对应的 deb-src 地址。这是为了让 apt 能够下载源代码。

    打开文件:

    sudo nano /etc/apt/sources.list

    例如,如果你的文件中有这样一行:

    deb http://deb.debian.org/debian/ bookworm main

    请确保它下面有对应的 deb-src 行:

    deb-src http://deb.debian.org/debian/ bookworm main

    保存文件后,更新你的包列表:

    sudo apt update
  2. 安装必要的编译工具
    这些是Debian打包必备的工具。

    sudo apt install build-essential devscripts quilt
    • build-essential: 包含编译器(gcc/g++)、make等基础工具。
    • devscripts: 包含一系列用于Debian打包的脚本,如debuild
    • quilt: Debian官方推荐的补丁管理工具,非常强大。
  3. 安装 blueman 的编译依赖
    apt 有一个非常方便的命令,可以自动安装某个软件包编译时所需的所有依赖。

    sudo apt-get build-dep blueman

    这个命令会读取blueman源码包的控制文件,并安装所有列出的编译依赖项。

第2步:获取源码

现在,你的环境准备好了,可以下载blueman的源码了。

  1. 创建一个工作目录,并进入该目录:

    mkdir ~/blueman-dev
    cd ~/blueman-dev
  2. 下载blueman的源码包:

    apt source blueman

    这个命令会下载三个文件(一个 .orig.tar.gz 原始源码包,一个 .debian.tar.xz Debian特定修改包,一个 .dsc 描述文件),并自动解压到一个以版本号命名的目录中,例如 blueman-2.3.5

  3. 进入解压后的源码目录:

    cd blueman-2.3.5/ # 注意:版本号可能不同,请使用你实际解压出的目录名
第3步:修改代码并创建Patch

这是最核心的一步。我们将使用 quilt 来管理我们的修改,这样可以保持源码树的干净,并轻松生成补丁文件。debian/patches/ 目录存放了所有应用于源码的补丁。

  1. 创建一个新的补丁 (Patch)
    给你的补丁起一个有意义的名字,比如 my-connection-fix.patch

    quilt new my-connection-fix.patch
  2. 告诉 quilt 你要修改哪个文件
    假设你要修改的文件是 plugins/mechanism/Mechanism.py

    quilt add plugins/mechanism/Mechanism.py

    重要提示: 你可以添加多个文件到同一个patch中。在你修改任何文件之前,都要先用 quilt add 命令把它加进来。

  3. 修改代码
    现在,用你喜欢的编辑器打开这个文件并进行修改。

    nano plugins/mechanism/Mechanism.py

    进行你想要的修改,比如修复连接失败的逻辑,然后保存并关闭文件。

  4. 生成/刷新补丁
    在你完成所有修改后,使用以下命令,quilt会自动比较你修改过的文件和原始文件的差异,并把这些差异保存到你之前创建的 my-connection-fix.patch 文件中。

    quilt refresh

    现在,你可以去 debian/patches/ 目录下查看,会发现多了一个 my-connection-fix.patch 文件,里面就是你的代码改动。同时,debian/patches/series 文件里也会自动添加这一行的名字,确保编译时这个补丁会被应用。

  5. (可选)为你的补丁添加描述头
    这是一个好习惯,可以说明这个补丁是做什么的。

    quilt header -e

    这会打开一个编辑器,让你填写 DescriptionAuthor 等信息。

第4步:编译打包

现在你的补丁已经准备好了,可以开始编译生成 .deb 文件了。

  1. (可选,推荐)更新changelog
    为了区分你编译的版本和官方版本,最好在 debian/changelog 文件中增加一个条目。这可以防止你的包被官方更新覆盖。

    dch -i

    或者使用 dch -l local 来添加一个本地版本后缀:

    dch -l local "My local build with connection fix."

    这会自动用编辑器打开 debian/changelog 文件,在顶部生成一个新的版本条目,比如 2.3.5-2+local1。你只需要确认信息无误并保存即可。

  2. 开始编译
    在源码的根目录(blueman-2.3.5/)下,运行编译命令:

    dpkg-buildpackage -us -uc -b
    • -us: 不对源码包进行签名 (Don’t sign source package)。
    • -uc: 不对 .changes 文件进行签名 (Don’t sign changes file)。
    • -b: 只编译二进制包(即我们需要的 .deb 文件)。

    编译过程需要一些时间。如果一切顺利,你不会看到任何错误。

  3. 查找编译好的 .deb 文件
    编译完成后,新的 .deb 文件会生成在上一级目录,也就是 ~/blueman-dev/ 目录中。

    ls ../*.deb

    你应该能看到类似 blueman_2.3.5-2+local1_amd64.deb 这样的文件。

第5步:安装和验证
  1. 卸载旧版本
    为了避免冲突,最好先卸载掉系统里通过apt安装的blueman

    sudo apt remove blueman
  2. 安装你的新包
    使用 dpkg 来安装你刚刚编译好的包。

    sudo dpkg -i ../blueman_*.deb

    注意: dpkg 不会自动处理依赖关系。如果在上一步 build-dep 都已安装,这里通常不会有问题。万一提示缺少依赖,可以运行以下命令来修复:

    sudo apt-get -f install
  3. 防止你的包被自动更新覆盖
    这是非常重要的一步!否则下次你运行 sudo apt upgrade 时,你的自定义版本会被官方仓库里的新版本覆盖掉。

    sudo apt-mark hold blueman

    当你不再需要这个自定义版本时,可以用 unhold 命令解除锁定:

    sudo apt-mark unhold blueman
  4. 验证
    重启blueman服务或直接重启电脑,然后测试你的蓝牙连接功能,看你的修改是否解决了问题。

    killall blueman-applet
    blueman-applet &
清理

使用 quilt push 命令。这个命令会应用当前正在工作的补丁(my-connection-fix.patch),并让你准备好处理下一个补丁。

清理编译文件
dpkg-buildpackage -T clean
这个命令会执行 debian/rules 文件中定义的 clean 目标,它会做以下事情:

  1. 撤销所有 quilt 补丁,让源码树恢复到原始状态。
  2. 删除所有由 configuremeson setup 等命令生成的 Makefile 和配置文件。
  3. 删除所有编译生成的中间文件(.o, .pyc 等)。
  4. 删除上一次编译留下的所有临时目录和文件。

执行完后,你的源码目录就回到了一个干净的、可以重新开始编译的状态。

管理补丁
  1. 如果要修改现有的补丁,比如 my-connection-fix.patch,先用 quilt pop 回退到它,然后编辑,最后 quilt refresh
  2. 如果要添加新补丁,用 quilt push -a 应用所有现有补丁,然后 quilt new ... 开始新的修改。

总结

整个流程可以简化为:
apt source -> quilt new -> quilt add -> 编辑代码 -> quilt refresh -> dpkg-buildpackage -> dpkg -i -> apt-mark hold

这个过程不仅适用于blueman,也适用于Debian/Ubuntu仓库中的绝大多数软件包。祝你成功解决问题!如果你的补丁是通用的修复,也欢迎你向 blueman 的上游项目(GitHub)提交一个Pull Request,为开源社区做出贡献。
在Debian系统上修改开源软件源代码、制作patch并重新编译打包

补充

  1. 常用 quilt 命令:
    quilt series: 查看所有补丁的列表以及它们的应用状态。
    quilt push: 应用下一个补丁。
    quilt pop: “弹出”并撤销上一个应用的补丁,使其变为当前活动补丁,方便你重新编辑它。
    quilt push -a: 应用所有补丁。
    quilt pop -a: 撤销所有补丁,让源码树恢复到最原始的状态。
    quilt top: 查看栈顶(最新应用)的补丁。
    quilt previous: 切换到上一个补丁。
    quilt next: 切换到下一个补丁。
  2. 当更新相关软件时会设计依赖,可能会报错且update/upgrade后也无效,请检查相关包是否被锁定
    apt-mark showhold xxx //根据报错提示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/918685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WSL2搭建wordpress遇到的一点问题

密码的,这两天用wsl2搭建wordpress,刚开始没啥问题,访问正常,结果第二天打开电脑发现无论如何都访问不了wsl2搭建的wp,一直报错无法连接,无法访问,请检查防火墙和网络代理什么的。 然后去网上各种搜Windows访问…

襄阳做网站公司中国设计之窗官方网站

对于 call / apply / bind 来说,他们的首要目的是用于改变执行上下文的 this 指针。 call / apply 对 call / apply 的使用,一般都如下,用于改变执行环境的上下文。只是 call 接受的是一个一个的参数,而 apply 则是接受的是一个参…

高端网站建设设计公司排名做的网站

继上一篇博文,我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构: springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因,我们成功启动项目…

【Linux】网络基础 - 实践

【Linux】网络基础 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

需求的系统规划 3

如何将系统的需求具体化、结构化 通过画业务流程图信息孤岛形成的原因、常用处理方式 1.人为原因:供应商不愿别人访问自己系统的数据,数据有特殊性,程序无法解读 2.编码差异:完全相同的数据,不同的软件系统采用不…

找人做网站毕业设计企信网企业信用信息系统

1.transformer的优化策略 1)GQA,减少推理过程中的KV缓存大小,增加上下文长度(KV 缓存(即 Key-Value 缓存)用于加速 Transformer 模型在推理过程中处理长序列时的计算。要减少 KV 缓存的大小) 2&…

430亿美元押注英国,Salesforce 加码 AI 投资

近日,英国与多家美国科技公司签署 “科技繁荣协议(Tech Prosperity Deal)”,宣布未来将有 430 亿美元 投入英国人工智能领域,目标是把英国打造为全球 AI 超级大国。 这笔投资是在此前 440 亿美元承诺的基础上再次…

C# 中 ref 和 out 的学习笔记

一句话搞懂区别​ref​:传进去的时候​必须有值,方法里可以改它,改完外面也能看到。 ​out​:传进去的时候​不用有值​(甚至不能有值),方法里​必须给它赋值,赋完值外面就能用。为什么需要它们? C# 默认是“…

NXP - 在MCUXpresso IDE中编译调试Smoothieware固件工程 - 思路 - 教程

NXP - 在MCUXpresso IDE中编译调试Smoothieware固件工程 - 思路 - 教程2025-09-26 18:37 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: aut…

C# 序列化三种方式

序列化是啥? 就是把一个 C# 对象(比如 Person、Order)变成一串能存文件、能发网络的“字符串”或“字节”。 反序列化就是反过来,把这串东西变回对象。 为啥要干这事?存到文件(比如保存游戏进度) 发给别的程序(…

网站标题一样高端品牌运动鞋

目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中(checked)或未选中(unchecked)状态的选项…

织梦网站添加视频教程莱芜新闻电视台节目表

目录 1、divmod函数: 1-1、Python: 1-2、VBA: 2、相关文章: 个人主页:非风V非雨-CSDN博客 divmod函数在Python中具有广泛的应用场景,特别是在需要同时处理除法的商和余数的情况下。常见的应用场景有&a…

VMware+RockyLinux+ikuai+docker+cri-docker+k8s 自用 实践笔记(一) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

区别:Modbus RTU 和 Modbus TCP

区别:Modbus RTU 和 Modbus TCP Modbus RTU 常用函数,如下://打印数组数据 static void printArray(const QString& title, qint64 dataLen, const uint8_t* data) {QString strPrint;for (int i = 0; i < d…

记录安装机器/深度学习环境(conda、CUDA、pytorch)时的一些问题

1. 正确查看自己的CUDA版本CUDA分为两种,驱动API和运行API。 驱动API指的是显卡驱动支持的最高cuda版本,我们运行程序时用的是运行API。nvidia-smi显示的是驱动所能支持的最大运行API版本。 nvcc --version查看的是C…

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统

详细介绍:大数据毕业设计选题推荐:基于Hadoop+Spark的全球能源消耗数据分析与可视化系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

5G车载市场新格局:国产崛起,从破局者到引领者的升维之战 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python组合类型和组合可空类型

python组合类型和组合可空类型 漫思

深入解析:自动化接口框架搭建分享-pytest

深入解析:自动化接口框架搭建分享-pytestpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

手撕深度学习之CUDA并行规约算法(上篇):硬核揭秘200%性能提升的GPU优化之道,从硬件特性到算法实现的完整进阶指南

本文为CUDA并行规约系列文章的上篇,本系列将会介绍CUDA编程的一些基础软硬件知识,然后给出7种规约算法的实现,并从硬件的角度对它们进行分析和优化,最终给出一个开箱即用的模板代码。 本文主要介绍了CUDA编程的基础…