Yocto - 如何给配方文件添加源码patch

2024-04-08 23:04
文章标签 源码 yocto patch 配方

本文主要是介绍Yocto - 如何给配方文件添加源码patch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Yocto - How to patch in a recipe with devtool
Yocto: Modifying, building, deploying and patching a recipe with Yocto devtool
[ Yocto: 使用 Yocto devtool 修改、构建、部署和修补配方  ]
OpenEmbedded 从源代码构建所有内容的一个好处是,对构建的任何内容进行修改都相当容易,但第一次这样做可能有点令人生畏。
作为构建配方的一部分,OE 会创建一个 <output_dir>/tmp/work/<architecture>/<recipe>/<version> 目录,称为 "工作目录"。构建配方的所有工作都在此完成。在这个目录中,你可以找到源代码,通常位于名为 <recipe_name>-<version> 或 "git"(取决于获取源代码的方式)的子目录下。在这里做一些简单的修改,然后重新编译,这是很诱人的做法(过去人们也经常这么做),但有几个原因说明这不是个好主意:
One of the useful things about OpenEmbedded building everything from source is that it's fairly easy to make changes to anything that gets built, but doing so for the first time can be a bit daunting.
As part of building a recipe, OE creates a <output_dir>/tmp/work/<architecture>/<recipe>/<version> directory, known as the "work directory". This is where all of the work done to build a recipe takes place. One of the things you'll find in this directory is the source, usually under a subdirectory named <recipe_name>-<version> or "git" (depending on how the fetched source is provided). The temptation (and what people used to do in the past) is to simply make changes here and then recompile, but there are several reasons why that's not a good idea:
  • 它很笨拙--你必须使用 bitbake -c compile -f 或 bitbake -C compile 来强制重新编译,因为编译系统不知道你做了任何改动
  • 稍有不慎,就很容易丢失修改内容,例如,运行 bitbake -c clean 会抹掉目录
  • It's awkward - you have to use bitbake -c compile -f or bitbake -C compile to force recompilation, since the build system doesn't know that you've made any changes
  • You can easily lose your changes if you're not careful e.g. running bitbake -c clean will wipe the directory out
另外,除了work目录,还有work-shared目录可以存放一些源文件。比如Kernel source就在这个目录里。
幸运的是,如果你使用的是 Fido (1.8) 或更高版本,有一个更好的方法,那就是使用 devtool 命令:
devtool 允许你将一个 Yocto 配方解压缩到本地文件夹中,这样你就可以在其中工作了。
devtool 会创建一个临时层,级别设置为 99,这样它就会覆盖所有其他层。它会检查你的代码,并创建一个 "devtool "分支。
在源文件中添加配方补丁的步骤如下:
Luckily if you're using the Fido (1.8) or later release, there's a much better method using the devtool command:
devtool allows you to extract a Yocto recipe into a local folder so that you can work on it.
devtool creates a temporary layer with level set to 99, so that it overrides all other layers. It checks out your code and creates a ‘devtool’ branch.
Adding a recipe patch to source files can be done using the following steps:
1.  运行 devtool modify <recipe_name>。这将获取配方源代码并解压到工作区目录 (<output_dir>/workspace/sources/<recipe_name>)。如果源代码还不是一个 Git 仓库,它会初始化一个。
在 bitbake 终端运行以下命令,开始基于此配方工作。
From your bitbake terminal, run the following command to start work on a recipe.
Run devtool modify <recipe_name >. This fetches the recipe sources and unpacks them to a workspace directory (<output_dir>/workspace/sources/<recipe_name>). If the source isn’t already a Git repository, it initializes one.
e.g. 
$ devtool modify libusbgx
使用这个命令,会将bb文件中的源码展开,包括SRC_URI中已经添加的Patch文件,也会应用到源码上。
2. 现在检查一下要修改的软件包名称 (PN)。
Now discover the package-name (PN) to be modified.
$ devtool status
NOTE: Starting bitbake server...
libusbgx: /home/workspace/yocto-bsp/build/workspace/sources/libusbgx
3. 对源代码进行所需的修改。您可以编辑代码并提交更改。
Make the desired changes to the source code. You can edit the code and commit changes.
$ cd build/workspace/sources/libusbgx
$ git add .
$ git commit -m "my linux modifications"
4.  运行 devtool build <recipe_name> 或构建包含修改后软件包的整个映像,以测试您所做的更改。
然后运行下面命令构建此配方:
Test your changes by running devtool build <recipe_name> or even building an entire image that incorporates the modified package.
You can then build the recipe by running:
$ devtool build libusbgx
5. 可选择性的使用 devtool deploy-target 在目标机上测试更改。这将把 do_install 安装的文件复制到目标机器上,前提是目标机器有网络访问权限(ssh),而且映像中已经存在所需的依赖项。
你可以使用以下方法部署二进制文件:
Optionally, test the changes on the target using devtool deploy-targe t. This will copy the files installed at do_install over to the target machine assuming it has network access(ssh), and any dependencies are already present in the image.
You can deploy the binaries with:
devtool deploy-target recipe_name root@192.168.1.1
部署使用 SSH,因此需要指定用户名。
The deployment uses SSH, so you need to specify the user name.
6. 你可能需重复修改代码,编译,并测试。直到达到想要的结果。  
Repeat steps 3 / 4 / 5 until you’re satisfied with the results. 
7. 将修改提交到本地 git 仓库后,您可能想将修改作为补丁发布。在使用 git commit 提交改动后,有两个选项可以将改动作为补丁应用。
  • devtool update-recipe <recipe_name> 用于更新原始配方,通常适用于自己的配方或向上游层提交修改的情况。
  • devtool update-recipe -a <layerpath> <recipe_name>以 bbappend 的形式将更改提交给不同层应用。如果您的更改是自定义而非错误修正,这通常是您所需要的方法。
Once you have committed your changes to the local git repository, you may want to publish your changes as a patch. There are two options  to apply your changes as a patch after  commit your changes using git commit.
  • devtool update-recipe <recipe_name> to update the original recipe, usually appropriate if it’s your own recipe or if you’re submitting changes back to the upstream layer.
  • devtool update-recipe -a <layerpath> <recipe_name> to put your changes in the form of a bbappend to be applied by a different layer. This is usually the desired method if your changes are customisations rather than bugfixes.
使用第一种方法,会自动将当前本地git的第一个commit生成patch文件,拷贝到配方的内容目录中,并将文件路径加入到配方文件的SRC_URI中。
但我试验了下,如果配方文件原本还加了其他patch的话,使用这种方法会将其他patch文件都删除,配方文件中的patch条目也删除。然后替换成新生成的这个。
第二种方法的举例:
devtool update-recipe -a /home/nxp/meta-harrier-bsp u-boot-imx
Where,
/home/nxp/meta-harrier-bsp
is the root directory of the layer and
u-boot-imx
is the recipe name.
You’ll then end-up with a .bbappend file created in
home/nxp/meta-harrier-bsp/recipes-bsp/u-boot/u-boot-imx_2018.03.bbappend
8. 还可以手动执行来完成打Patch操作。
代码修改提交完成后,运行以下命令生成patch文件:
$ git format-patch -1
这里的数字 1 表示取最近的一个commit作为patch。可以取多个commit,把1 改为相应的数字即可。
生成patch文件后,将文件拷贝到recipe的内容文件夹。然后将patch文件名加到SRC_URI中,比如:
SRCBRANCH="master"
SRC_URI = "git://github.com/libusbgx/libusbgx.git;branch=${SRCBRANCH};protocol=https \
           file://Update.patch \           
           "
可以调整patch文件的名字,使其易于理解。
在bitbake使用的源码临时构建目录中修改代码并提交代码后,也可以使用上面的方法来创建patch。
9. 如果你已完成配方相关工作,则运行 devtool reset <recipe_name>。
这样会清除workspace中此recipe的相关内容,此时使用bitbake构建此recipe则不再使用workspace中的内容,而是使用临时构建目录中的源码来构建。
If you're finished working on the recipe, run devtool reset <recipe_name>.
devtool reset recipe_name
通过以上操作,就完成了给recipe中的源码加入patch的任务。
这只是 devtool 的功能之一,它还提供了一些强大的工具来帮助你维护配方和修改源代码。有机会可以多研究。
This is just one of the things that devtool can do - it provides some powerful tools to help you maintain recipes and make changes to source code.
参考:
1,Yocto
TipsAndTricks/Patching the source for a recipe - Yocto Project
2,Koan software
Using devtool to modify recipes in Yocto - KoanSoftware Wiki
​3, Others
Yocto: Modifying, building, deploying and patching a recipe with Yocto devtool « JASD
i.MX Yocto Project: How can I patch the kernel? - NXP Community

这篇关于Yocto - 如何给配方文件添加源码patch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886626

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

red5-server源码

red5-server源码:https://github.com/Red5/red5-server

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码