Last-Modified: Sat, 04 Oct 2025 07:05:18 GMT
Expires: Tue, 02 Oct 2035 07:05:18 GMT

<!DOCTYPE html>
<html lang='en'>
<head>
<title>working.tex « docs - openwrt/upstream - upstream openwrt</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://openwrt.panaceas.org/cgit/openwrt/upstream/atom/docs/working.tex?h=v22.03.4' type='application/atom+xml'/>
<link rel='vcs-git' href='git://git.panaceas.org/openwrt/upstream' title='openwrt/upstream Git repository'/>
<link rel='vcs-git' href='ssh://git@git.panaceas.org/git/openwrt/upstream' title='openwrt/upstream Git repository'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/cgit/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/cgit/'>index</a> : <a title='openwrt/upstream' href='/cgit/openwrt/upstream/'>openwrt/upstream</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'/><select name='h' onchange='this.form.submit();'>
<option value='attitude_adjustment'>attitude_adjustment</option>
<option value='barrier_breaker'>barrier_breaker</option>
<option value='chaos_calmer'>chaos_calmer</option>
<option value='lede-17.01'>lede-17.01</option>
<option value='less-old-master'>less-old-master</option>
<option value='master'>master</option>
<option value='old-master'>old-master</option>
<option value='openwrt-18.06'>openwrt-18.06</option>
<option value='openwrt-19.07'>openwrt-19.07</option>
<option value='upstream'>upstream</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>upstream openwrt</td><td class='sub right'>James</td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit/openwrt/upstream/about/?h=v22.03.4'>about</a><a href='/cgit/openwrt/upstream/?h=v22.03.4'>summary</a><a href='/cgit/openwrt/upstream/refs/?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>refs</a><a href='/cgit/openwrt/upstream/log/docs/working.tex?h=v22.03.4'>log</a><a class='active' href='/cgit/openwrt/upstream/tree/docs/working.tex?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>tree</a><a href='/cgit/openwrt/upstream/commit/docs/working.tex?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>commit</a><a href='/cgit/openwrt/upstream/diff/docs/working.tex?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>diff</a><a href='/cgit/openwrt/upstream/stats/docs/working.tex?h=v22.03.4'>stats</a></td><td class='form'><form class='right' method='get' action='/cgit/openwrt/upstream/log/docs/working.tex'>
<input type='hidden' name='h' value='v22.03.4'/><input type='hidden' name='id' value='fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit/openwrt/upstream/tree/?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>root</a>/<a href='/cgit/openwrt/upstream/tree/docs?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>docs</a>/<a href='/cgit/openwrt/upstream/tree/docs/working.tex?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>working.tex</a></div><div class='content'>blob: 3d3fc42e2d7cd793e7a607b3d80e19da206b062c (<a href='/cgit/openwrt/upstream/plain/docs/working.tex?h=v22.03.4&amp;id=fcfd0cec768723b3373a1d30f74cf4bb32ccb8bb'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
<a id='n43' href='#n43'>43</a>
<a id='n44' href='#n44'>44</a>
<a id='n45' href='#n45'>45</a>
<a id='n46' href='#n46'>46</a>
<a id='n47' href='#n47'>47</a>
<a id='n48' href='#n48'>48</a>
<a id='n49' href='#n49'>49</a>
<a id='n50' href='#n50'>50</a>
<a id='n51' href='#n51'>51</a>
<a id='n52' href='#n52'>52</a>
<a id='n53' href='#n53'>53</a>
<a id='n54' href='#n54'>54</a>
<a id='n55' href='#n55'>55</a>
<a id='n56' href='#n56'>56</a>
<a id='n57' href='#n57'>57</a>
<a id='n58' href='#n58'>58</a>
<a id='n59' href='#n59'>59</a>
<a id='n60' href='#n60'>60</a>
<a id='n61' href='#n61'>61</a>
<a id='n62' href='#n62'>62</a>
<a id='n63' href='#n63'>63</a>
<a id='n64' href='#n64'>64</a>
<a id='n65' href='#n65'>65</a>
<a id='n66' href='#n66'>66</a>
<a id='n67' href='#n67'>67</a>
<a id='n68' href='#n68'>68</a>
<a id='n69' href='#n69'>69</a>
<a id='n70' href='#n70'>70</a>
<a id='n71' href='#n71'>71</a>
<a id='n72' href='#n72'>72</a>
<a id='n73' href='#n73'>73</a>
<a id='n74' href='#n74'>74</a>
<a id='n75' href='#n75'>75</a>
<a id='n76' href='#n76'>76</a>
<a id='n77' href='#n77'>77</a>
<a id='n78' href='#n78'>78</a>
<a id='n79' href='#n79'>79</a>
<a id='n80' href='#n80'>80</a>
<a id='n81' href='#n81'>81</a>
<a id='n82' href='#n82'>82</a>
<a id='n83' href='#n83'>83</a>
<a id='n84' href='#n84'>84</a>
<a id='n85' href='#n85'>85</a>
<a id='n86' href='#n86'>86</a>
<a id='n87' href='#n87'>87</a>
<a id='n88' href='#n88'>88</a>
<a id='n89' href='#n89'>89</a>
<a id='n90' href='#n90'>90</a>
<a id='n91' href='#n91'>91</a>
<a id='n92' href='#n92'>92</a>
<a id='n93' href='#n93'>93</a>
<a id='n94' href='#n94'>94</a>
<a id='n95' href='#n95'>95</a>
<a id='n96' href='#n96'>96</a>
<a id='n97' href='#n97'>97</a>
<a id='n98' href='#n98'>98</a>
<a id='n99' href='#n99'>99</a>
<a id='n100' href='#n100'>100</a>
<a id='n101' href='#n101'>101</a>
<a id='n102' href='#n102'>102</a>
<a id='n103' href='#n103'>103</a>
<a id='n104' href='#n104'>104</a>
<a id='n105' href='#n105'>105</a>
<a id='n106' href='#n106'>106</a>
<a id='n107' href='#n107'>107</a>
<a id='n108' href='#n108'>108</a>
<a id='n109' href='#n109'>109</a>
<a id='n110' href='#n110'>110</a>
<a id='n111' href='#n111'>111</a>
<a id='n112' href='#n112'>112</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span>The following section gives some tips and tricks on how to use efficiently
OpenWrt on a regular basis and for daily work.

<span class="k">\subsection</span><span class="nb">{</span>Compiling/recompiling components<span class="nb">}</span>

The buildroot allows you to recompile the full environment or only parts of it
like the toolchain, the kernel modules, the kernel or some packages.

For instance if you want to recompile the toolchain after you made any change to it
issue the following command:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make toolchain/<span class="nb">{</span>clean,compile,install<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

Which will clean, compile and install the toolchain. The command actually expands to the
following:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make[1] toolchain/clean
make[2] -C toolchain/kernel-headers clean
make[2] -C toolchain/binutils clean
make[2] -C toolchain/gcc clean
make[2] -C toolchain/uClibc clean	(glibc or eglibc when chosen)
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

Of course, you could only choose to recompile one or several of the toolchain components
(binutils, kernel-headers gcc, C library) individually.

The exact same idea works for packages:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make package/busybox/<span class="nb">{</span>clean,compile,install<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

will clean, compile and install buysbox (if selected to be installed on the final rootfs).

Supposing that you made changes to the Linux kernel, but do not want to recompile everything,
you can recompile only the kernel modules by issuing:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make target/linux/compile
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

To recompile the static part of the kernel use the following command:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make target/linux/install
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

<span class="k">\subsection</span><span class="nb">{</span>Using quilt inside OpenWrt<span class="nb">}</span>

OpenWrt integrates quilt in order to ease the package, kernel and toolchain
patches maintenance when migrating over new versions of the software.

Quilt intends to replace an old workflow, where you would download the new
source file, create an original copy of it, an a working copy, then try to
apply by hand old patches and resolve conflicts manually. Additionnaly, using
quilt allows you to update and fold patches into other patches easily.

Quilt is used by default to apply Linux kernel patches, but not for the other
components (toolchain and packages).

<span class="k">\subsubsection</span><span class="nb">{</span>Using quilt with kernel patches<span class="nb">}</span>

Assuming that you have everything setup for your new kernel version:
<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
<span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>LINUX<span class="k">\_</span>VERSION<span class="nb">}</span> set in the target Makefile
<span class="k">\item</span> config-2.6.x.y existing
<span class="k">\item</span> patches-2.6.x.y containing the previous patches
<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

Some patches are likely to fail since the vanilla kernel we are patching
received modifications so some hunks of the patches are no longer applying.
We will use quilt to get them applying cleanly again. Follow this procedure
whenever you want to upgrade the kernel using previous patches:

<span class="k">\begin</span><span class="nb">{</span>enumerate<span class="nb">}</span>
<span class="k">\item</span> make target/linux/clean (removes the old version)
<span class="k">\item</span> make target/linux/compile (uncompress the kernel and try to apply patches)
<span class="k">\item</span> if patches failed to apply:
<span class="k">\item</span> cd build<span class="k">\_</span>dir/linux-target/linux-2.6.x.y
<span class="k">\item</span> quilt push -a (to apply patches where quilt stopped)
<span class="k">\item</span> quilt push -f (to force applying patches)
<span class="k">\item</span> edit .rej files, apply the necessary changes to the files
<span class="k">\item</span> remove .rej files
<span class="k">\item</span> quilt refresh
<span class="k">\item</span> repeat operation 3 and following until all patches have been applied
<span class="k">\item</span> when all patches did apply cleanly: make target/linux/refresh
<span class="k">\end</span><span class="nb">{</span>enumerate<span class="nb">}</span>

Note that generic (target/linux/generic-2.6/linux-2.6.x/) patches can be found in 
<span class="k">\texttt</span><span class="nb">{</span>build<span class="k">\_</span>dir/linux-target/linux-2.6.x.y/patches/generic<span class="nb">}</span> and platform specific
patches in <span class="k">\texttt</span><span class="nb">{</span>build<span class="k">\_</span>dir/linux-target/linux-2.6.x.y/patches/platform<span class="nb">}</span>.

<span class="k">\subsubsection</span><span class="nb">{</span>Using quilt with packages<span class="nb">}</span>

As we mentionned earlier, quilt is enabled by default for kernel patches, but not for
packages. If you want to use quilt in the same way, you should set the QUILT environment
variable to 1, e.g:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make package/buysbox/<span class="nb">{</span>clean,compile<span class="nb">}</span> QUILT=1
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>

Will generate the patch series file and allow you to update patches just like we described
before in the kernel case. Note that once all patches apply cleanly you should refresh them
as well using the following command:

<span class="k">\begin</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
make package/buysbox/refresh QUILT=1
<span class="k">\end</span><span class="nb">{</span>Verbatim<span class="nb">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-10-04 07:05:18 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
