<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Buildroot on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/buildroot/</link>
    <description>Recent content in Buildroot on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 14 Jun 2023 02:58:23 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/buildroot/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>buildroot的OVERRIDE_SRCDIR机制</title>
      <link>https://fan-pengfei.top/posts/buildroot%E7%9A%84override_srcdir%E6%9C%BA%E5%88%B6/</link>
      <pubDate>Wed, 14 Jun 2023 02:58:23 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/buildroot%E7%9A%84override_srcdir%E6%9C%BA%E5%88%B6/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;使用buildroot构建系统的话，如果在output/build中对某个软件包修改的话，一旦使用make clean，就会导致自己做的修改被抹除；为避免这个情况，buildroot是提供了一种机制，也即&lt;code&gt;OVERRIDE_SRCDIR&lt;/code&gt;；
参考：&lt;a href=&#34;https://www.cnblogs.com/pwl999/p/15534966.html&#34;&gt;https://www.cnblogs.com/pwl999/p/15534966.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Buildroot的一般操作是下载tar包、提取、配置、编译和安装该tar包内的软件。源代码提取保存在临时目录&lt;code&gt;output/build/-&lt;/code&gt;目录中，当执行&lt;code&gt;make clean&lt;/code&gt;时，该目录会被完全删除，并在下一次make时重新创建。即使将Git或Subversion等版本管理系统作为软件包源代码的输入，Buildroot也会从中创建一个tar包，然后像对待一般tar包一样工作。&lt;/p&gt;
&lt;p&gt;这种方式非常适合将Buildroot当做集成工具，编译和集成嵌入式Linux系统的所有组件。但是，如果是在开发系统的某些组件的过程中使用Buildroot，这种方式非常不方便：开发者希望对一个软件包的源代码做少许修改，并能够使用Buildroot快速重建系统。
直接修改&lt;code&gt;output/build/-&lt;/code&gt;不是合适的解决方案，因为该目录会在&lt;code&gt;make clean&lt;/code&gt;时删除。&lt;/p&gt;
&lt;p&gt;因此，Buildroot针对该场景提供了一种特殊的机制，即&lt;code&gt;_OVERRIDE_SRCDIR&lt;/code&gt;机制。Buildroot读取一个override文档，该文档允许用户告诉Buildroot某些软件包的源代码位置。&lt;/p&gt;
&lt;p&gt;覆盖文档(override)的默认位置是&lt;code&gt;$(CONFIG_DIR)/local.mk&lt;/code&gt;。由&lt;code&gt;BR2_PACKAGE_OVERRIDE_FILE&lt;/code&gt;配置选项定义。&lt;code&gt;$(CONFIG_DIR)&lt;/code&gt;是Buildroot &lt;code&gt;.config&lt;/code&gt;文档的位置，因此&lt;code&gt;local.mk&lt;/code&gt;默认情况下与&lt;code&gt;.config&lt;/code&gt;文档放在一起，这意味着：这意味着:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Buildroot目录树内构建时位于Buildroot顶层目录中（当O=不使用时）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buildroot目录树外构建时位于目录树外目录（当O=使用时）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果需要不同于这些默认值的位置，可以通过&lt;code&gt;BR2_PACKAGE_OVERRIDE_FILE&lt;/code&gt;配置选项指定。&lt;/p&gt;
&lt;p&gt;在这个override文档中，Buildroot期望找到以下形式中的行:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /path/to/pkg1/sources
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /path/to/pkg2/sources
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LINUX_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /home/bob/linux/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BUSYBOX_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; /home/bob/busybox/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当Buildroot发现给定的软件包存在_OVERRIDE_SRCDIR定义时，它将不再尝试下载、提取和修补软件包，它将直接使用指定目录中可用的源代码，并且make clean时不会涉及该目录。这允许将Buildroot指向您自己的目录，该目录可以由Git、Subversion或其他版本控制系统管理。为此，Buildroot将使用rsync将软件包的源代码从_OVERRIDE_SRCDIR指定的位置复制到&lt;code&gt;output/build/-custom/&lt;/code&gt;目录。&lt;/p&gt;
&lt;p&gt;该机制最好与&lt;code&gt;make -rebuild&lt;/code&gt;和&lt;code&gt;make -reconfigure&lt;/code&gt;结合使用。make&lt;code&gt;-rebuild all&lt;/code&gt;将rsync源代码从&lt;code&gt;_OVERRIDE_SRCDIR&lt;/code&gt;到&lt;code&gt;output/build/-custom&lt;/code&gt;（只有修改过的文档会被复制），并重新启动这个软件包的构建过程。&lt;/p&gt;
&lt;p&gt;在上述Linux软件包的示例中，开发人员可以修改 &lt;code&gt;/home/bob/linux&lt;/code&gt;目录下的源代码，然后运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make linux-rebuild all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;并在几秒钟内在&lt;code&gt;output/images&lt;/code&gt;中获得更新后的Linux内核映像。类似地，可以在&lt;code&gt;/home/bob/busybox&lt;/code&gt;和后面对BusyBox源代码进行更改:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;make busybox-rebuild all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;output/images&lt;/code&gt;中的根文档系统映像包含更新后的BusyBox。&lt;/p&gt;
&lt;p&gt;大型项目一般有成百上千的文档，很多文档对于构建时是不需要的，但是会减慢rsync复制源代码的过程。可选的，可以定义&lt;code&gt;_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS&lt;/code&gt;跳过源代码中的某些文档。例如，当处理webkitgtk软件包时，以下内容将从本地WebKit源代码中排除：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBKITGTK_OVERRIDE_SRCDIR &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;home&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;bob&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;WebKit
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WEBKITGTK_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;--exclude JSTests --exclude ManualTests --exclude PerformanceTests \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;--exclude WebDriverTests --exclude WebKitBuild --exclude WebKitLibraries \&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;--exclude WebKit.xcworkspace --exclude Websites --exclude Examples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认情况下，Buildroot会跳过VCS信息（例如.git或.svn）的同步。一些软件包在编译过程中会使用VCS信息，例如精确确认提交信息。要取消Buildroot的内置过滤规则，需要重新添加以下目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LINUX_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; --include .git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
