blob: fda41694dc60fa738262a2cce33523708c7ce4ab [file] [log] [blame]
Andrew Geisslerf0343792020-11-18 10:42:21 -06001.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
Andrew Geisslerc9f78652020-09-18 14:11:35 -05002
3************
4Common Tasks
5************
6
7This chapter presents several common tasks you perform when you work
8with the Yocto Project Linux kernel. These tasks include preparing your
9host development system for kernel development, preparing a layer,
10modifying an existing recipe, patching the kernel, configuring the
11kernel, iterative development, working with your own sources, and
12incorporating out-of-tree modules.
13
14.. note::
15
16 The examples presented in this chapter work with the Yocto Project
17 2.4 Release and forward.
18
19Preparing the Build Host to Work on the Kernel
20==============================================
21
22Before you can do any kernel development, you need to be sure your build
23host is set up to use the Yocto Project. For information on how to get
Andrew Geissler09209ee2020-12-13 08:44:15 -060024set up, see the ":doc:`/dev-manual/start`" section in
Andrew Geisslerc9f78652020-09-18 14:11:35 -050025the Yocto Project Development Tasks Manual. Part of preparing the system
26is creating a local Git repository of the
27:term:`Source Directory` (``poky``) on your system. Follow the steps in the
Andrew Geissler09209ee2020-12-13 08:44:15 -060028":ref:`dev-manual/start:cloning the \`\`poky\`\` repository`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -050029section in the Yocto Project Development Tasks Manual to set up your
30Source Directory.
31
32.. note::
33
34 Be sure you check out the appropriate development branch or you
35 create your local branch by checking out a specific tag to get the
Andrew Geissler4c19ea12020-10-27 13:52:24 -050036 desired version of Yocto Project. See the
Andrew Geissler09209ee2020-12-13 08:44:15 -060037 ":ref:`dev-manual/start:checking out by branch in poky`" and
38 ":ref:`dev-manual/start:checking out by tag in poky`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -050039 sections in the Yocto Project Development Tasks Manual for more information.
Andrew Geisslerc9f78652020-09-18 14:11:35 -050040
41Kernel development is best accomplished using
Andrew Geissler09209ee2020-12-13 08:44:15 -060042:ref:`devtool <sdk-manual/extensible:using \`\`devtool\`\` in your sdk workflow>`
Andrew Geisslerc9f78652020-09-18 14:11:35 -050043and not through traditional kernel workflow methods. The remainder of
44this section provides information for both scenarios.
45
46Getting Ready to Develop Using ``devtool``
47------------------------------------------
48
49Follow these steps to prepare to update the kernel image using
50``devtool``. Completing this procedure leaves you with a clean kernel
Andrew Geissler4c19ea12020-10-27 13:52:24 -050051image and ready to make modifications as described in the
Andrew Geissler09209ee2020-12-13 08:44:15 -060052":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -050053section:
54
Andrew Geissler517393d2023-01-13 08:55:19 -060055#. *Initialize the BitBake Environment:*
Patrick Williams92b42cb2022-09-03 06:53:57 -050056 you need to initialize the BitBake build environment by sourcing
Andrew Geisslerc926e172021-05-07 16:11:35 -050057 the build environment script (i.e. :ref:`structure-core-script`)::
Andrew Geisslerc9f78652020-09-18 14:11:35 -050058
Andrew Geissler95ac1b82021-03-31 14:34:31 -050059 $ cd poky
Andrew Geisslerc9f78652020-09-18 14:11:35 -050060 $ source oe-init-build-env
61
62 .. note::
63
64 The previous commands assume the
Andrew Geissler09209ee2020-12-13 08:44:15 -060065 :ref:`overview-manual/development-environment:yocto project source repositories`
Andrew Geissler4c19ea12020-10-27 13:52:24 -050066 (i.e. ``poky``) have been cloned using Git and the local repository is named
Andrew Geisslerc9f78652020-09-18 14:11:35 -050067 "poky".
68
Andrew Geissler517393d2023-01-13 08:55:19 -060069#. *Prepare Your local.conf File:* By default, the :term:`MACHINE` variable
Patrick Williams2390b1b2022-11-03 13:47:49 -050070 is set to "qemux86-64", which is fine if you are building for the QEMU
71 emulator in 64-bit mode. However, if you are not, you need to set the
Andrew Geissler09036742021-06-25 14:25:14 -050072 :term:`MACHINE` variable appropriately in your ``conf/local.conf`` file
Patrick Williams2390b1b2022-11-03 13:47:49 -050073 found in the :term:`Build Directory` (i.e. ``poky/build`` in this example).
Andrew Geisslerc9f78652020-09-18 14:11:35 -050074
75 Also, since you are preparing to work on the kernel image, you need
Patrick Williams2390b1b2022-11-03 13:47:49 -050076 to set the :term:`MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS` variable to include
77 kernel modules.
Andrew Geisslerc9f78652020-09-18 14:11:35 -050078
79 In this example we wish to build for qemux86 so we must set the
Andrew Geissler5f350902021-07-23 13:09:54 -040080 :term:`MACHINE` variable to "qemux86" and also add the "kernel-modules".
Andrew Geisslerc926e172021-05-07 16:11:35 -050081 As described we do this by appending to ``conf/local.conf``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -050082
83 MACHINE = "qemux86"
84 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
85
Andrew Geissler517393d2023-01-13 08:55:19 -060086#. *Create a Layer for Patches:* You need to create a layer to hold
Andrew Geisslerc9f78652020-09-18 14:11:35 -050087 patches created for the kernel image. You can use the
Andrew Geisslerc926e172021-05-07 16:11:35 -050088 ``bitbake-layers create-layer`` command as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -050089
Andrew Geissler95ac1b82021-03-31 14:34:31 -050090 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -050091 $ bitbake-layers create-layer ../../meta-mylayer
92 NOTE: Starting bitbake server...
93 Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer'
94 $
95
96 .. note::
97
98 For background information on working with common and BSP layers,
Andrew Geissler4c19ea12020-10-27 13:52:24 -050099 see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600100 ":ref:`dev-manual/layers:understanding and creating layers`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500101 section in the Yocto Project Development Tasks Manual and the
102 ":ref:`bsp-guide/bsp:bsp layers`" section in the Yocto Project Board
103 Support (BSP) Developer's Guide, respectively. For information on how to
104 use the ``bitbake-layers create-layer`` command to quickly set up a layer,
105 see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600106 ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500107 section in the Yocto Project Development Tasks Manual.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500108
Andrew Geissler517393d2023-01-13 08:55:19 -0600109#. *Inform the BitBake Build Environment About Your Layer:* As directed
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500110 when you created your layer, you need to add the layer to the
111 :term:`BBLAYERS` variable in the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500112 ``bblayers.conf`` file as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500113
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500114 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500115 $ bitbake-layers add-layer ../../meta-mylayer
116 NOTE: Starting bitbake server...
117 $
118
Andrew Geissler517393d2023-01-13 08:55:19 -0600119#. *Build the Clean Image:* The final step in preparing to work on the
Patrick Williams92b42cb2022-09-03 06:53:57 -0500120 kernel is to build an initial image using ``bitbake``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500121
Patrick Williams92b42cb2022-09-03 06:53:57 -0500122 $ bitbake core-image-minimal
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500123 Parsing recipes: 100% |##########################################| Time: 0:00:05
124 Parsing of 830 .bb files complete (0 cached, 830 parsed). 1299 targets, 47 skipped, 0 masked, 0 errors.
125 WARNING: No packages to add, building image core-image-minimal unmodified
126 Loading cache: 100% |############################################| Time: 0:00:00
127 Loaded 1299 entries from dependency cache.
128 NOTE: Resolving any missing task queue dependencies
129 Initializing tasks: 100% |#######################################| Time: 0:00:07
130 Checking sstate mirror object availability: 100% |###############| Time: 0:00:00
131 NOTE: Executing SetScene Tasks
132 NOTE: Executing RunQueue Tasks
133 NOTE: Tasks Summary: Attempted 2866 tasks of which 2604 didn't need to be rerun and all succeeded.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500134
135 If you were
136 building for actual hardware and not for emulation, you could flash
137 the image to a USB stick on ``/dev/sdd`` and boot your device. For an
138 example that uses a Minnowboard, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600139 :yocto_wiki:`TipsAndTricks/KernelDevelopmentWithEsdk </TipsAndTricks/KernelDevelopmentWithEsdk>`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500140 Wiki page.
141
142At this point you have set up to start making modifications to the
Patrick Williams92b42cb2022-09-03 06:53:57 -0500143kernel. For a continued example, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600144":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500145section.
146
147Getting Ready for Traditional Kernel Development
148------------------------------------------------
149
150Getting ready for traditional kernel development using the Yocto Project
151involves many of the same steps as described in the previous section.
152However, you need to establish a local copy of the kernel source since
153you will be editing these files.
154
155Follow these steps to prepare to update the kernel image using
156traditional kernel development flow with the Yocto Project. Completing
157this procedure leaves you ready to make modifications to the kernel
Andrew Geissler09209ee2020-12-13 08:44:15 -0600158source as described in the ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500159section:
160
Andrew Geissler517393d2023-01-13 08:55:19 -0600161#. *Initialize the BitBake Environment:* Before you can do anything
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500162 using BitBake, you need to initialize the BitBake build environment
163 by sourcing the build environment script (i.e.
164 :ref:`structure-core-script`).
165 Also, for this example, be sure that the local branch you have
166 checked out for ``poky`` is the Yocto Project &DISTRO_NAME; branch. If
167 you need to checkout out the &DISTRO_NAME; branch, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600168 ":ref:`dev-manual/start:checking out by branch in poky`"
Andrew Geissler517393d2023-01-13 08:55:19 -0600169 section in the Yocto Project Development Tasks Manual::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500170
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500171 $ cd poky
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500172 $ git branch
173 master
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500174 * &DISTRO_NAME_NO_CAP;
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500175 $ source oe-init-build-env
176
177 .. note::
178
179 The previous commands assume the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600180 :ref:`overview-manual/development-environment:yocto project source repositories`
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500181 (i.e. ``poky``) have been cloned using Git and the local repository is named
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500182 "poky".
183
Andrew Geissler517393d2023-01-13 08:55:19 -0600184#. *Prepare Your local.conf File:* By default, the :term:`MACHINE` variable is
Patrick Williams2390b1b2022-11-03 13:47:49 -0500185 set to "qemux86-64", which is fine if you are building for the QEMU emulator
186 in 64-bit mode. However, if you are not, you need to set the :term:`MACHINE`
187 variable appropriately in your ``conf/local.conf`` file found in the
188 :term:`Build Directory` (i.e. ``poky/build`` in this example).
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500189
190 Also, since you are preparing to work on the kernel image, you need
191 to set the
192 :term:`MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS`
193 variable to include kernel modules.
194
195 In this example we wish to build for qemux86 so we must set the
Andrew Geissler5f350902021-07-23 13:09:54 -0400196 :term:`MACHINE` variable to "qemux86" and also add the "kernel-modules".
Andrew Geisslerc926e172021-05-07 16:11:35 -0500197 As described we do this by appending to ``conf/local.conf``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500198
199 MACHINE = "qemux86"
200 MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
201
Andrew Geissler517393d2023-01-13 08:55:19 -0600202#. *Create a Layer for Patches:* You need to create a layer to hold
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500203 patches created for the kernel image. You can use the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500204 ``bitbake-layers create-layer`` command as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500205
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500206 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500207 $ bitbake-layers create-layer ../../meta-mylayer
208 NOTE: Starting bitbake server...
209 Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer'
210
211 .. note::
212
213 For background information on working with common and BSP layers,
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500214 see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600215 ":ref:`dev-manual/layers:understanding and creating layers`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500216 section in the Yocto Project Development Tasks Manual and the
217 ":ref:`bsp-guide/bsp:bsp layers`" section in the Yocto Project Board
218 Support (BSP) Developer's Guide, respectively. For information on how to
219 use the ``bitbake-layers create-layer`` command to quickly set up a layer,
220 see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600221 ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500222 section in the Yocto Project Development Tasks Manual.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500223
Andrew Geissler517393d2023-01-13 08:55:19 -0600224#. *Inform the BitBake Build Environment About Your Layer:* As directed
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500225 when you created your layer, you need to add the layer to the
226 :term:`BBLAYERS` variable in the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500227 ``bblayers.conf`` file as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500228
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500229 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500230 $ bitbake-layers add-layer ../../meta-mylayer
231 NOTE: Starting bitbake server ...
232 $
233
Andrew Geissler517393d2023-01-13 08:55:19 -0600234#. *Create a Local Copy of the Kernel Git Repository:* You can find Git
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500235 repositories of supported Yocto Project kernels organized under
236 "Yocto Linux Kernel" in the Yocto Project Source Repositories at
237 :yocto_git:`/`.
238
239 For simplicity, it is recommended that you create your copy of the
240 kernel Git repository outside of the
241 :term:`Source Directory`, which is
242 usually named ``poky``. Also, be sure you are in the
243 ``standard/base`` branch.
244
245 The following commands show how to create a local copy of the
Andrew Geissler517393d2023-01-13 08:55:19 -0600246 ``linux-yocto-4.12`` kernel and be in the ``standard/base`` branch::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500247
248 $ cd ~
249 $ git clone git://git.yoctoproject.org/linux-yocto-4.12 --branch standard/base
250 Cloning into 'linux-yocto-4.12'...
251 remote: Counting objects: 6097195, done.
252 remote: Compressing objects: 100% (901026/901026), done.
253 remote: Total 6097195 (delta 5152604), reused 6096847 (delta 5152256)
254 Receiving objects: 100% (6097195/6097195), 1.24 GiB | 7.81 MiB/s, done.
255 Resolving deltas: 100% (5152604/5152604), done. Checking connectivity... done.
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500256 Checking out files: 100% (59846/59846), done.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500257
Andrew Geissler517393d2023-01-13 08:55:19 -0600258 .. note::
259
260 The ``linux-yocto-4.12`` kernel can be used with the Yocto Project 2.4
261 release and forward.
262 You cannot use the ``linux-yocto-4.12`` kernel with releases prior to
263 Yocto Project 2.4.
264
265#. *Create a Local Copy of the Kernel Cache Git Repository:* For
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500266 simplicity, it is recommended that you create your copy of the kernel
267 cache Git repository outside of the
268 :term:`Source Directory`, which is
269 usually named ``poky``. Also, for this example, be sure you are in
270 the ``yocto-4.12`` branch.
271
272 The following commands show how to create a local copy of the
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700273 ``yocto-kernel-cache`` and switch to the ``yocto-4.12`` branch::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500274
275 $ cd ~
276 $ git clone git://git.yoctoproject.org/yocto-kernel-cache --branch yocto-4.12
277 Cloning into 'yocto-kernel-cache'...
278 remote: Counting objects: 22639, done.
279 remote: Compressing objects: 100% (9761/9761), done.
280 remote: Total 22639 (delta 12400), reused 22586 (delta 12347)
281 Receiving objects: 100% (22639/22639), 22.34 MiB | 6.27 MiB/s, done.
282 Resolving deltas: 100% (12400/12400), done.
283 Checking connectivity... done.
284
285At this point, you are ready to start making modifications to the kernel
286using traditional kernel development steps. For a continued example, see
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500287the ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500288section.
289
290Creating and Preparing a Layer
291==============================
292
293If you are going to be modifying kernel recipes, it is recommended that
294you create and prepare your own layer in which to do your work. Your
295layer contains its own :term:`BitBake`
296append files (``.bbappend``) and provides a convenient mechanism to
297create your own recipe files (``.bb``) as well as store and use kernel
298patch files. For background information on working with layers, see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600299":ref:`dev-manual/layers:understanding and creating layers`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500300section in the Yocto Project Development Tasks Manual.
301
302.. note::
303
304 The Yocto Project comes with many tools that simplify tasks you need
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500305 to perform. One such tool is the ``bitbake-layers create-layer``
306 command, which simplifies creating a new layer. See the
Andrew Geissler517393d2023-01-13 08:55:19 -0600307 ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500308 section in the Yocto Project Development Tasks Manual for
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500309 information on how to use this script to quick set up a new layer.
310
311To better understand the layer you create for kernel development, the
312following section describes how to create a layer without the aid of
313tools. These steps assume creation of a layer named ``mylayer`` in your
314home directory:
315
Andrew Geissler517393d2023-01-13 08:55:19 -0600316#. *Create Structure*: Create the layer's structure::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500317
Patrick Williams44b3caf2024-04-12 16:51:14 -0500318 $ mkdir -p meta-mylayer/conf meta-mylayer/recipes-kernel/linux/linux-yocto
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500319
320 The ``conf`` directory holds your configuration files, while the
321 ``recipes-kernel`` directory holds your append file and eventual
322 patch files.
323
Andrew Geissler517393d2023-01-13 08:55:19 -0600324#. *Create the Layer Configuration File*: Move to the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500325 ``meta-mylayer/conf`` directory and create the ``layer.conf`` file as
Andrew Geisslerc926e172021-05-07 16:11:35 -0500326 follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500327
328 # We have a conf and classes directory, add to BBPATH
329 BBPATH .= ":${LAYERDIR}"
330
331 # We have recipes-* directories, add to BBFILES
332 BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
333 ${LAYERDIR}/recipes-*/*/*.bbappend"
334
335 BBFILE_COLLECTIONS += "mylayer"
336 BBFILE_PATTERN_mylayer = "^${LAYERDIR}/"
337 BBFILE_PRIORITY_mylayer = "5"
338
339 Notice ``mylayer`` as part of the last three statements.
340
Andrew Geissler517393d2023-01-13 08:55:19 -0600341#. *Create the Kernel Recipe Append File*: Move to the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500342 ``meta-mylayer/recipes-kernel/linux`` directory and create the
343 kernel's append file. This example uses the ``linux-yocto-4.12``
344 kernel. Thus, the name of the append file is
Andrew Geisslerc926e172021-05-07 16:11:35 -0500345 ``linux-yocto_4.12.bbappend``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500346
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500347 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500348
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500349 SRC_URI += "file://patch-file-one.patch"
350 SRC_URI += "file://patch-file-two.patch"
351 SRC_URI += "file://patch-file-three.patch"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500352
353 The :term:`FILESEXTRAPATHS` and :term:`SRC_URI` statements
354 enable the OpenEmbedded build system to find patch files. For more
355 information on using append files, see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600356 ":ref:`dev-manual/layers:appending other layers metadata with your layer`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500357 section in the Yocto Project Development Tasks Manual.
358
359Modifying an Existing Recipe
360============================
361
362In many cases, you can customize an existing linux-yocto recipe to meet
363the needs of your project. Each release of the Yocto Project provides a
364few Linux kernel recipes from which you can choose. These are located in
365the :term:`Source Directory` in
366``meta/recipes-kernel/linux``.
367
368Modifying an existing recipe can consist of the following:
369
Andrew Geissler09209ee2020-12-13 08:44:15 -0600370- :ref:`kernel-dev/common:creating the append file`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500371
Andrew Geissler09209ee2020-12-13 08:44:15 -0600372- :ref:`kernel-dev/common:applying patches`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500373
Andrew Geissler09209ee2020-12-13 08:44:15 -0600374- :ref:`kernel-dev/common:changing the configuration`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500375
376Before modifying an existing recipe, be sure that you have created a
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500377minimal, custom layer from which you can work. See the
378":ref:`kernel-dev/common:creating and preparing a layer`" section for
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500379information.
380
381Creating the Append File
382------------------------
383
384You create this file in your custom layer. You also name it accordingly
385based on the linux-yocto recipe you are using. For example, if you are
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600386modifying the ``meta/recipes-kernel/linux/linux-yocto_6.1.bb`` recipe,
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500387the append file will typically be located as follows within your custom
388layer:
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500389
390.. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500391
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600392 your-layer/recipes-kernel/linux/linux-yocto_6.1.bbappend
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500393
394The append file should initially extend the
395:term:`FILESPATH` search path by
396prepending the directory that contains your files to the
397:term:`FILESEXTRAPATHS`
Andrew Geisslerc926e172021-05-07 16:11:35 -0500398variable as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500399
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500400 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500401
402The path ``${``\ :term:`THISDIR`\ ``}/${``\ :term:`PN`\ ``}``
403expands to "linux-yocto" in the current directory for this example. If
404you add any new files that modify the kernel recipe and you have
Andrew Geissler09036742021-06-25 14:25:14 -0500405extended :term:`FILESPATH` as described above, you must place the files in
Andrew Geisslerc926e172021-05-07 16:11:35 -0500406your layer in the following area::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500407
408 your-layer/recipes-kernel/linux/linux-yocto/
409
410.. note::
411
412 If you are working on a new machine Board Support Package (BSP), be
Andrew Geissler09209ee2020-12-13 08:44:15 -0600413 sure to refer to the :doc:`/bsp-guide/index`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500414
415As an example, consider the following append file used by the BSPs in
416``meta-yocto-bsp``:
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500417
418.. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500419
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600420 meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500421
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700422Here are the contents of this file. Be aware that the actual commit ID
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500423strings in this example listing might be different than the actual
Andrew Geissler517393d2023-01-13 08:55:19 -0600424strings in the file from the ``meta-yocto-bsp`` layer upstream::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500425
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600426 KBRANCH:genericx86 = "v6.1/standard/base"
427 KBRANCH:genericx86-64 = "v6.1/standard/base"
428 KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500429
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600430 KMACHINE:genericx86 ?= "common-pc"
431 KMACHINE:genericx86-64 ?= "common-pc-64"
432 KMACHINE:beaglebone-yocto ?= "beaglebone"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500433
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600434 SRCREV_machine:genericx86 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
435 SRCREV_machine:genericx86-64 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
436 SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500437
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600438 COMPATIBLE_MACHINE:genericx86 = "genericx86"
439 COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
440 COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500441
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600442 LINUX_VERSION:genericx86 = "6.1.30"
443 LINUX_VERSION:genericx86-64 = "6.1.30"
444 LINUX_VERSION:beaglebone-yocto = "6.1.20"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500445
446This append file
447contains statements used to support several BSPs that ship with the
448Yocto Project. The file defines machines using the
449:term:`COMPATIBLE_MACHINE`
450variable and uses the
451:term:`KMACHINE` variable to ensure
452the machine name used by the OpenEmbedded build system maps to the
453machine name used by the Linux Yocto kernel. The file also uses the
454optional :term:`KBRANCH` variable to
455ensure the build process uses the appropriate kernel branch.
456
457Although this particular example does not use it, the
458:term:`KERNEL_FEATURES`
459variable could be used to enable features specific to the kernel. The
460append file points to specific commits in the
461:term:`Source Directory` Git repository and
462the ``meta`` Git repository branches to identify the exact kernel needed
463to build the BSP.
464
465One thing missing in this particular BSP, which you will typically need
466when developing a BSP, is the kernel configuration file (``.config``)
467for your BSP. When developing a BSP, you probably have a kernel
468configuration file or a set of kernel configuration files that, when
469taken together, define the kernel configuration for your BSP. You can
470accomplish this definition by putting the configurations in a file or a
471set of files inside a directory located at the same level as your
472kernel's append file and having the same name as the kernel's main
473recipe file. With all these conditions met, simply reference those files
474in the :term:`SRC_URI` statement in
475the append file.
476
477For example, suppose you had some configuration options in a file called
478``network_configs.cfg``. You can place that file inside a directory
Andrew Geissler09036742021-06-25 14:25:14 -0500479named ``linux-yocto`` and then add a :term:`SRC_URI` statement such as the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500480following to the append file. When the OpenEmbedded build system builds
Andrew Geissler517393d2023-01-13 08:55:19 -0600481the kernel, the configuration options are picked up and applied::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500482
483 SRC_URI += "file://network_configs.cfg"
484
485To group related configurations into multiple files, you perform a
486similar procedure. Here is an example that groups separate
487configurations specifically for Ethernet and graphics into their own
Andrew Geissler09036742021-06-25 14:25:14 -0500488files and adds the configurations by using a :term:`SRC_URI` statement like
Andrew Geisslerc926e172021-05-07 16:11:35 -0500489the following in your append file::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500490
491 SRC_URI += "file://myconfig.cfg \
492 file://eth.cfg \
493 file://gfx.cfg"
494
495Another variable you can use in your kernel recipe append file is the
496:term:`FILESEXTRAPATHS`
497variable. When you use this statement, you are extending the locations
498used by the OpenEmbedded system to look for files and patches as the
499recipe is processed.
500
501.. note::
502
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700503 There are other ways of grouping and defining configuration
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500504 options. For example, if you are working with a local clone of the
505 kernel repository, you could checkout the kernel's ``meta`` branch,
506 make your changes, and then push the changes to the local bare clone
507 of the kernel. The result is that you directly add configuration
508 options to the ``meta`` branch for your BSP. The configuration
509 options will likely end up in that location anyway if the BSP gets
510 added to the Yocto Project.
511
512 In general, however, the Yocto Project maintainers take care of
Andrew Geissler5f350902021-07-23 13:09:54 -0400513 moving the :term:`SRC_URI`-specified configuration options to the
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700514 kernel's ``meta`` branch. Not only is it easier for BSP developers
515 not to have to put those configurations in the branch,
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500516 but having the maintainers do it allows them to apply 'global'
517 knowledge about the kinds of common configuration options multiple
518 BSPs in the tree are typically using. This allows for promotion of
519 common configurations into common features.
520
521Applying Patches
522----------------
523
524If you have a single patch or a small series of patches that you want to
525apply to the Linux kernel source, you can do so just as you would with
526any other recipe. You first copy the patches to the path added to
527:term:`FILESEXTRAPATHS` in
528your ``.bbappend`` file as described in the previous section, and then
529reference them in :term:`SRC_URI`
530statements.
531
532For example, you can apply a three-patch series by adding the following
Andrew Geisslerc926e172021-05-07 16:11:35 -0500533lines to your linux-yocto ``.bbappend`` file in your layer::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500534
535 SRC_URI += "file://0001-first-change.patch"
536 SRC_URI += "file://0002-second-change.patch"
537 SRC_URI += "file://0003-third-change.patch"
538
539The next time you run BitBake to build
540the Linux kernel, BitBake detects the change in the recipe and fetches
541and applies the patches before building the kernel.
542
543For a detailed example showing how to patch the kernel using
544``devtool``, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600545":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500546and
Andrew Geissler09209ee2020-12-13 08:44:15 -0600547":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500548sections.
549
550Changing the Configuration
551--------------------------
552
553You can make wholesale or incremental changes to the final ``.config``
554file used for the eventual Linux kernel configuration by including a
555``defconfig`` file and by specifying configuration fragments in the
556:term:`SRC_URI` to be applied to that
557file.
558
559If you have a complete, working Linux kernel ``.config`` file you want
560to use for the configuration, as before, copy that file to the
561appropriate ``${PN}`` directory in your layer's ``recipes-kernel/linux``
562directory, and rename the copied file to "defconfig". Then, add the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500563following lines to the linux-yocto ``.bbappend`` file in your layer::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500564
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500565 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500566 SRC_URI += "file://defconfig"
567
Andrew Geissler09036742021-06-25 14:25:14 -0500568The :term:`SRC_URI` tells the build system how to search
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500569for the file, while the
570:term:`FILESEXTRAPATHS`
571extends the :term:`FILESPATH`
572variable (search directories) to include the ``${PN}`` directory you
573created to hold the configuration changes.
574
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700575You can also use a regular ``defconfig`` file, as generated by the
576:ref:`ref-tasks-savedefconfig`
577task instead of a complete ``.config`` file. This only specifies the
578non-default configuration values. You need to additionally set
579:term:`KCONFIG_MODE`
580in the linux-yocto ``.bbappend`` file in your layer::
581
582 KCONFIG_MODE = "alldefconfig"
583
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500584.. note::
585
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500586 The build system applies the configurations from the ``defconfig``
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500587 file before applying any subsequent configuration fragments. The
588 final kernel configuration is a combination of the configurations in
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500589 the ``defconfig`` file and any configuration fragments you provide. You need
590 to realize that if you have any configuration fragments, the build system
591 applies these on top of and after applying the existing ``defconfig`` file
592 configurations.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500593
594Generally speaking, the preferred approach is to determine the
595incremental change you want to make and add that as a configuration
596fragment. For example, if you want to add support for a basic serial
597console, create a file named ``8250.cfg`` in the ``${PN}`` directory
Andrew Geisslerc926e172021-05-07 16:11:35 -0500598with the following content (without indentation)::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500599
600 CONFIG_SERIAL_8250=y
601 CONFIG_SERIAL_8250_CONSOLE=y
602 CONFIG_SERIAL_8250_PCI=y
603 CONFIG_SERIAL_8250_NR_UARTS=4
604 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
605 CONFIG_SERIAL_CORE=y
606 CONFIG_SERIAL_CORE_CONSOLE=y
607
608Next, include this
Andrew Geissler09036742021-06-25 14:25:14 -0500609configuration fragment and extend the :term:`FILESPATH` variable in your
Andrew Geisslerc926e172021-05-07 16:11:35 -0500610``.bbappend`` file::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500611
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500612 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500613 SRC_URI += "file://8250.cfg"
614
615The next time you run BitBake to build the
616Linux kernel, BitBake detects the change in the recipe and fetches and
617applies the new configuration before building the kernel.
618
619For a detailed example showing how to configure the kernel, see the
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500620":ref:`kernel-dev/common:configuring the kernel`" section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500621
622Using an "In-Tree"  ``defconfig`` File
623--------------------------------------
624
625It might be desirable to have kernel configuration fragment support
626through a ``defconfig`` file that is pulled from the kernel source tree
627for the configured machine. By default, the OpenEmbedded build system
628looks for ``defconfig`` files in the layer used for Metadata, which is
Andrew Geisslerc926e172021-05-07 16:11:35 -0500629"out-of-tree", and then configures them using the following::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500630
631 SRC_URI += "file://defconfig"
632
633If you do not want to maintain copies of
634``defconfig`` files in your layer but would rather allow users to use
635the default configuration from the kernel tree and still be able to add
636configuration fragments to the
637:term:`SRC_URI` through, for example,
638append files, you can direct the OpenEmbedded build system to use a
639``defconfig`` file that is "in-tree".
640
641To specify an "in-tree" ``defconfig`` file, use the following statement
Andrew Geisslerc926e172021-05-07 16:11:35 -0500642form::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500643
Andrew Geissler6aa7eec2023-03-03 12:41:14 -0600644 KBUILD_DEFCONFIG:<machine> ?= "defconfig_file"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500645
Andrew Geissler6aa7eec2023-03-03 12:41:14 -0600646Here is an example that assigns the :term:`KBUILD_DEFCONFIG` variable utilizing
647an override for the "raspberrypi2" :term:`MACHINE` and provides the path to the
648"in-tree" ``defconfig`` file to be used for a Raspberry Pi 2, which is based on
649the Broadcom 2708/2709 chipset::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500650
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500651 KBUILD_DEFCONFIG:raspberrypi2 ?= "bcm2709_defconfig"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500652
653Aside from modifying your kernel recipe and providing your own
654``defconfig`` file, you need to be sure no files or statements set
Andrew Geissler5f350902021-07-23 13:09:54 -0400655:term:`SRC_URI` to use a ``defconfig`` other than your "in-tree" file (e.g.
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500656a kernel's ``linux-``\ `machine`\ ``.inc`` file). In other words, if the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500657build system detects a statement that identifies an "out-of-tree"
658``defconfig`` file, that statement will override your
Andrew Geissler09036742021-06-25 14:25:14 -0500659:term:`KBUILD_DEFCONFIG` variable.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500660
661See the
662:term:`KBUILD_DEFCONFIG`
663variable description for more information.
664
665Using ``devtool`` to Patch the Kernel
666=====================================
667
668The steps in this procedure show you how you can patch the kernel using
Patrick Williams92b42cb2022-09-03 06:53:57 -0500669``devtool``.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500670
671.. note::
672
673 Before attempting this procedure, be sure you have performed the
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500674 steps to get ready for updating the kernel as described in the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600675 ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500676 section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500677
678Patching the kernel involves changing or adding configurations to an
679existing kernel, changing or adding recipes to the kernel that are
680needed to support specific hardware features, or even altering the
681source code itself.
682
683This example creates a simple patch by adding some QEMU emulator console
684output at boot time through ``printk`` statements in the kernel's
685``calibrate.c`` source code file. Applying the patch and booting the
686modified image causes the added messages to appear on the emulator's
687console. The example is a continuation of the setup procedure found in
Andrew Geissler09209ee2020-12-13 08:44:15 -0600688the ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``" Section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500689
Andrew Geissler517393d2023-01-13 08:55:19 -0600690#. *Check Out the Kernel Source Files:* First you must use ``devtool``
Patrick Williams92b42cb2022-09-03 06:53:57 -0500691 to checkout the kernel source code in its workspace.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500692
693 .. note::
694
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500695 See this step in the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600696 ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500697 section for more information.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500698
Andrew Geisslerc926e172021-05-07 16:11:35 -0500699 Use the following ``devtool`` command to check out the code::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500700
701 $ devtool modify linux-yocto
702
703 .. note::
704
William A. Kennington IIIac69b482021-06-02 12:28:27 -0700705 During the checkout operation, there is a bug that could cause
706 errors such as the following:
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500707
708 .. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500709
710 ERROR: Taskhash mismatch 2c793438c2d9f8c3681fd5f7bc819efa versus
711 be3a89ce7c47178880ba7bf6293d7404 for
712 /path/to/esdk/layers/poky/meta/recipes-kernel/linux/linux-yocto_4.10.bb.do_unpack
713
714
715 You can safely ignore these messages. The source code is correctly
716 checked out.
717
Andrew Geissler517393d2023-01-13 08:55:19 -0600718#. *Edit the Source Files* Follow these steps to make some simple
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500719 changes to the source files:
720
Andrew Geissler517393d2023-01-13 08:55:19 -0600721 #. *Change the working directory*: In the previous step, the output
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500722 noted where you can find the source files (e.g.
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500723 ``poky_sdk/workspace/sources/linux-yocto``). Change to where the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500724 kernel source code is before making your edits to the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500725 ``calibrate.c`` file::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500726
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500727 $ cd poky_sdk/workspace/sources/linux-yocto
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500728
Andrew Geissler517393d2023-01-13 08:55:19 -0600729 #. *Edit the source file*: Edit the ``init/calibrate.c`` file to have
Andrew Geisslerc926e172021-05-07 16:11:35 -0500730 the following changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500731
732 void calibrate_delay(void)
733 {
734 unsigned long lpj;
735 static bool printed;
736 int this_cpu = smp_processor_id();
737
738 printk("*************************************\n");
739 printk("* *\n");
740 printk("* HELLO YOCTO KERNEL *\n");
741 printk("* *\n");
742 printk("*************************************\n");
743
744 if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
745 .
746 .
747 .
748
Andrew Geissler517393d2023-01-13 08:55:19 -0600749#. *Build the Updated Kernel Source:* To build the updated kernel
Andrew Geisslerc926e172021-05-07 16:11:35 -0500750 source, use ``devtool``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500751
752 $ devtool build linux-yocto
753
Andrew Geissler517393d2023-01-13 08:55:19 -0600754#. *Create the Image With the New Kernel:* Use the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500755 ``devtool build-image`` command to create a new image that has the
Andrew Geissler517393d2023-01-13 08:55:19 -0600756 new kernel::
757
758 $ cd ~
759 $ devtool build-image core-image-minimal
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500760
761 .. note::
762
763 If the image you originally created resulted in a Wic file, you
764 can use an alternate method to create the new image with the
765 updated kernel. For an example, see the steps in the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600766 :yocto_wiki:`TipsAndTricks/KernelDevelopmentWithEsdk </TipsAndTricks/KernelDevelopmentWithEsdk>`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500767 Wiki Page.
768
Andrew Geissler517393d2023-01-13 08:55:19 -0600769#. *Test the New Image:* For this example, you can run the new image
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500770 using QEMU to verify your changes:
771
Andrew Geissler517393d2023-01-13 08:55:19 -0600772 #. *Boot the image*: Boot the modified image in the QEMU emulator
Andrew Geisslerc926e172021-05-07 16:11:35 -0500773 using this command::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500774
775 $ runqemu qemux86
776
Andrew Geissler517393d2023-01-13 08:55:19 -0600777 #. *Verify the changes*: Log into the machine using ``root`` with no
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500778 password and then use the following shell command to scroll
779 through the console's boot output.
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500780
781 .. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500782
783 # dmesg | less
784
785 You should see
786 the results of your ``printk`` statements as part of the output
787 when you scroll down the console window.
788
Andrew Geissler517393d2023-01-13 08:55:19 -0600789#. *Stage and commit your changes*: Change
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500790 your working directory to where you modified the ``calibrate.c`` file
Andrew Geisslerc926e172021-05-07 16:11:35 -0500791 and use these Git commands to stage and commit your changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500792
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500793 $ cd poky_sdk/workspace/sources/linux-yocto
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500794 $ git status
795 $ git add init/calibrate.c
796 $ git commit -m "calibrate: Add printk example"
797
Andrew Geissler517393d2023-01-13 08:55:19 -0600798#. *Export the Patches and Create an Append File:* To export your
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500799 commits as patches and create a ``.bbappend`` file, use the following
Andrew Geissler517393d2023-01-13 08:55:19 -0600800 command. This example uses the previously established layer named ``meta-mylayer``::
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500801
802 $ devtool finish linux-yocto ~/meta-mylayer
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500803
804 .. note::
805
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500806 See Step 3 of the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600807 ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500808 section for information on setting up this layer.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500809
810 Once the command
811 finishes, the patches and the ``.bbappend`` file are located in the
812 ``~/meta-mylayer/recipes-kernel/linux`` directory.
813
Andrew Geissler517393d2023-01-13 08:55:19 -0600814#. *Build the Image With Your Modified Kernel:* You can now build an
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500815 image that includes your kernel patches. Execute the following
Patrick Williams2390b1b2022-11-03 13:47:49 -0500816 command from your :term:`Build Directory` in the terminal
Andrew Geisslerc926e172021-05-07 16:11:35 -0500817 set up to run BitBake::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500818
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500819 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500820 $ bitbake core-image-minimal
821
822Using Traditional Kernel Development to Patch the Kernel
823========================================================
824
825The steps in this procedure show you how you can patch the kernel using
Patrick Williams92b42cb2022-09-03 06:53:57 -0500826traditional kernel development (i.e. not using ``devtool``
827as described in the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600828":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500829section).
830
831.. note::
832
833 Before attempting this procedure, be sure you have performed the
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500834 steps to get ready for updating the kernel as described in the
Andrew Geissler09209ee2020-12-13 08:44:15 -0600835 ":ref:`kernel-dev/common:getting ready for traditional kernel development`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500836 section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500837
838Patching the kernel involves changing or adding configurations to an
839existing kernel, changing or adding recipes to the kernel that are
840needed to support specific hardware features, or even altering the
841source code itself.
842
843The example in this section creates a simple patch by adding some QEMU
844emulator console output at boot time through ``printk`` statements in
845the kernel's ``calibrate.c`` source code file. Applying the patch and
846booting the modified image causes the added messages to appear on the
847emulator's console. The example is a continuation of the setup procedure
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500848found in the
849":ref:`kernel-dev/common:getting ready for traditional kernel development`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500850Section.
851
Andrew Geissler517393d2023-01-13 08:55:19 -0600852#. *Edit the Source Files* Prior to this step, you should have used Git
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500853 to create a local copy of the repository for your kernel. Assuming
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500854 you created the repository as directed in the
855 ":ref:`kernel-dev/common:getting ready for traditional kernel development`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500856 section, use the following commands to edit the ``calibrate.c`` file:
857
Andrew Geissler517393d2023-01-13 08:55:19 -0600858 #. *Change the working directory*: You need to locate the source
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500859 files in the local copy of the kernel Git repository. Change to
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500860 where the kernel source code is before making your edits to the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500861 ``calibrate.c`` file::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500862
863 $ cd ~/linux-yocto-4.12/init
864
Andrew Geissler517393d2023-01-13 08:55:19 -0600865 #. *Edit the source file*: Edit the ``calibrate.c`` file to have the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500866 following changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500867
868 void calibrate_delay(void)
869 {
870 unsigned long lpj;
871 static bool printed;
872 int this_cpu = smp_processor_id();
873
874 printk("*************************************\n");
875 printk("* *\n");
876 printk("* HELLO YOCTO KERNEL *\n");
877 printk("* *\n");
878 printk("*************************************\n");
879
880 if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
881 .
882 .
883 .
884
Andrew Geissler517393d2023-01-13 08:55:19 -0600885#. *Stage and Commit Your Changes:* Use standard Git commands to stage
Andrew Geisslerc926e172021-05-07 16:11:35 -0500886 and commit the changes you just made::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500887
888 $ git add calibrate.c
889 $ git commit -m "calibrate.c - Added some printk statements"
890
891 If you do not
892 stage and commit your changes, the OpenEmbedded Build System will not
893 pick up the changes.
894
Andrew Geissler517393d2023-01-13 08:55:19 -0600895#. *Update Your local.conf File to Point to Your Source Files:* In
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500896 addition to your ``local.conf`` file specifying to use
897 "kernel-modules" and the "qemux86" machine, it must also point to the
898 updated kernel source files. Add
899 :term:`SRC_URI` and
900 :term:`SRCREV` statements similar
Andrew Geisslerc926e172021-05-07 16:11:35 -0500901 to the following to your ``local.conf``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500902
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500903 $ cd poky/build/conf
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500904
Andrew Geisslerc926e172021-05-07 16:11:35 -0500905 Add the following to the ``local.conf``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500906
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500907 SRC_URI:pn-linux-yocto = "git:///path-to/linux-yocto-4.12;protocol=file;name=machine;branch=standard/base; \
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500908 git:///path-to/yocto-kernel-cache;protocol=file;type=kmeta;name=meta;branch=yocto-4.12;destsuffix=${KMETA}"
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500909 SRCREV_meta:qemux86 = "${AUTOREV}"
910 SRCREV_machine:qemux86 = "${AUTOREV}"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500911
912 .. note::
913
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500914 Be sure to replace `path-to`
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500915 with the pathname to your local Git repositories. Also, you must
916 be sure to specify the correct branch and machine types. For this
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500917 example, the branch is ``standard/base`` and the machine is ``qemux86``.
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500918
Andrew Geissler517393d2023-01-13 08:55:19 -0600919#. *Build the Image:* With the source modified, your changes staged and
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500920 committed, and the ``local.conf`` file pointing to the kernel files,
Andrew Geisslerc926e172021-05-07 16:11:35 -0500921 you can now use BitBake to build the image::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500922
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500923 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500924 $ bitbake core-image-minimal
925
Andrew Geissler517393d2023-01-13 08:55:19 -0600926#. *Boot the image*: Boot the modified image in the QEMU emulator using
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500927 this command. When prompted to login to the QEMU console, use "root"
Andrew Geisslerc926e172021-05-07 16:11:35 -0500928 with no password::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500929
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500930 $ cd poky/build
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500931 $ runqemu qemux86
932
Andrew Geissler517393d2023-01-13 08:55:19 -0600933#. *Look for Your Changes:* As QEMU booted, you might have seen your
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500934 changes rapidly scroll by. If not, use these commands to see your
935 changes:
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500936
937 .. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500938
939 # dmesg | less
940
941 You should see the results of your
942 ``printk`` statements as part of the output when you scroll down the
943 console window.
944
Andrew Geissler517393d2023-01-13 08:55:19 -0600945#. *Generate the Patch File:* Once you are sure that your patch works
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500946 correctly, you can generate a ``*.patch`` file in the kernel source
Andrew Geisslerc926e172021-05-07 16:11:35 -0500947 repository::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500948
949 $ cd ~/linux-yocto-4.12/init
950 $ git format-patch -1
951 0001-calibrate.c-Added-some-printk-statements.patch
952
Andrew Geissler517393d2023-01-13 08:55:19 -0600953#. *Move the Patch File to Your Layer:* In order for subsequent builds
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500954 to pick up patches, you need to move the patch file you created in
955 the previous step to your layer ``meta-mylayer``. For this example,
956 the layer created earlier is located in your home directory as
957 ``meta-mylayer``. When the layer was created using the
958 ``yocto-create`` script, no additional hierarchy was created to
959 support patches. Before moving the patch file, you need to add
Andrew Geisslerc926e172021-05-07 16:11:35 -0500960 additional structure to your layer using the following commands::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500961
962 $ cd ~/meta-mylayer
Patrick Williams44b3caf2024-04-12 16:51:14 -0500963 $ mkdir -p recipes-kernel recipes-kernel/linux/linux-yocto
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500964
965 Once you have created this
966 hierarchy in your layer, you can move the patch file using the
Andrew Geisslerc926e172021-05-07 16:11:35 -0500967 following command::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500968
969 $ mv ~/linux-yocto-4.12/init/0001-calibrate.c-Added-some-printk-statements.patch ~/meta-mylayer/recipes-kernel/linux/linux-yocto
970
Andrew Geissler517393d2023-01-13 08:55:19 -0600971#. *Create the Append File:* Finally, you need to create the
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500972 ``linux-yocto_4.12.bbappend`` file and insert statements that allow
973 the OpenEmbedded build system to find the patch. The append file
974 needs to be in your layer's ``recipes-kernel/linux`` directory and it
975 must be named ``linux-yocto_4.12.bbappend`` and have the following
Andrew Geisslerc926e172021-05-07 16:11:35 -0500976 contents::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500977
Patrick Williams0ca19cc2021-08-16 14:03:13 -0500978 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geissler87f5cff2022-09-30 13:13:31 -0500979 SRC_URI += "file://0001-calibrate.c-Added-some-printk-statements.patch"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500980
981 The :term:`FILESEXTRAPATHS` and :term:`SRC_URI` statements
982 enable the OpenEmbedded build system to find the patch file.
983
Andrew Geissler3b8a17c2021-04-15 15:55:55 -0500984 For more information on append files and patches, see the
985 ":ref:`kernel-dev/common:creating the append file`" and
986 ":ref:`kernel-dev/common:applying patches`" sections. You can also see the
Andrew Geissler517393d2023-01-13 08:55:19 -0600987 ":ref:`dev-manual/layers:appending other layers metadata with your layer`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500988 section in the Yocto Project Development Tasks Manual.
989
990 .. note::
991
Andrew Geissler4c19ea12020-10-27 13:52:24 -0500992 To build ``core-image-minimal`` again and see the effects of your patch,
993 you can essentially eliminate the temporary source files saved in
994 ``poky/build/tmp/work/...`` and residual effects of the build by entering
Andrew Geisslerc926e172021-05-07 16:11:35 -0500995 the following sequence of commands::
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500996
Andrew Geissler95ac1b82021-03-31 14:34:31 -0500997 $ cd poky/build
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600998 $ bitbake -c cleanall linux-yocto
Andrew Geisslerc9f78652020-09-18 14:11:35 -0500999 $ bitbake core-image-minimal -c cleanall
1000 $ bitbake core-image-minimal
1001 $ runqemu qemux86
1002
1003
1004Configuring the Kernel
1005======================
1006
1007Configuring the Yocto Project kernel consists of making sure the
1008``.config`` file has all the right information in it for the image you
1009are building. You can use the ``menuconfig`` tool and configuration
1010fragments to make sure your ``.config`` file is just how you need it.
1011You can also save known configurations in a ``defconfig`` file that the
1012build system can use for kernel configuration.
1013
1014This section describes how to use ``menuconfig``, create and use
1015configuration fragments, and how to interactively modify your
1016``.config`` file to create the leanest kernel configuration file
1017possible.
1018
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001019For more information on kernel configuration, see the
1020":ref:`kernel-dev/common:changing the configuration`" section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001021
1022Using  ``menuconfig``
1023---------------------
1024
1025The easiest way to define kernel configurations is to set them through
1026the ``menuconfig`` tool. This tool provides an interactive method with
1027which to set kernel configurations. For general information on
Patrick Williams7784c422022-11-17 07:29:11 -06001028``menuconfig``, see :wikipedia:`Menuconfig`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001029
1030To use the ``menuconfig`` tool in the Yocto Project development
1031environment, you must do the following:
1032
1033- Because you launch ``menuconfig`` using BitBake, you must be sure to
Patrick Williams2390b1b2022-11-03 13:47:49 -05001034 set up your environment by running the :ref:`structure-core-script` script
1035 found in the :term:`Build Directory`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001036
1037- You must be sure of the state of your build's configuration in the
1038 :term:`Source Directory`.
1039
Andrew Geisslerc926e172021-05-07 16:11:35 -05001040- Your build host must have the following two packages installed::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001041
1042 libncurses5-dev
1043 libtinfo-dev
1044
1045The following commands initialize the BitBake environment, run the
1046:ref:`ref-tasks-kernel_configme`
1047task, and launch ``menuconfig``. These commands assume the Source
Andrew Geisslerc926e172021-05-07 16:11:35 -05001048Directory's top-level folder is ``poky``::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001049
1050 $ cd poky
1051 $ source oe-init-build-env
1052 $ bitbake linux-yocto -c kernel_configme -f
1053 $ bitbake linux-yocto -c menuconfig
1054
1055Once ``menuconfig`` comes up, its standard
1056interface allows you to interactively examine and configure all the
1057kernel configuration parameters. After making your changes, simply exit
1058the tool and save your changes to create an updated version of the
1059``.config`` configuration file.
1060
1061.. note::
1062
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001063 You can use the entire ``.config`` file as the ``defconfig`` file. For
1064 information on ``defconfig`` files, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001065 ":ref:`kernel-dev/common:changing the configuration`",
1066 ":ref:`kernel-dev/common:using an "in-tree" \`\`defconfig\`\` file`",
1067 and ":ref:`kernel-dev/common:creating a \`\`defconfig\`\` file`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001068 sections.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001069
1070Consider an example that configures the "CONFIG_SMP" setting for the
1071``linux-yocto-4.12`` kernel.
1072
1073.. note::
1074
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001075 The OpenEmbedded build system recognizes this kernel as ``linux-yocto``
Patrick Williams8e7b46e2023-05-01 14:19:06 -05001076 through Metadata (e.g. :term:`PREFERRED_VERSION`\ ``_linux-yocto ?= "4.12%"``).
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001077
1078Once ``menuconfig`` launches, use the interface to navigate through the
1079selections to find the configuration settings in which you are
1080interested. For this example, you deselect "CONFIG_SMP" by clearing the
1081"Symmetric Multi-Processing Support" option. Using the interface, you
1082can find the option under "Processor Type and Features". To deselect
1083"CONFIG_SMP", use the arrow keys to highlight "Symmetric
1084Multi-Processing Support" and enter "N" to clear the asterisk. When you
1085are finished, exit out and save the change.
1086
Patrick Williams2390b1b2022-11-03 13:47:49 -05001087Saving the selections updates the ``.config`` configuration file. This is the
1088file that the OpenEmbedded build system uses to configure the kernel during
1089the build. You can find and examine this file in the :term:`Build Directory`
1090in ``tmp/work/``. The actual ``.config`` is located in the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001091area where the specific kernel is built. For example, if you were
1092building a Linux Yocto kernel based on the ``linux-yocto-4.12`` kernel
1093and you were building a QEMU image targeted for ``x86`` architecture,
1094the ``.config`` file would be:
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001095
1096.. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001097
1098 poky/build/tmp/work/qemux86-poky-linux/linux-yocto/4.12.12+gitAUTOINC+eda4d18...
1099 ...967-r0/linux-qemux86-standard-build/.config
1100
1101.. note::
1102
1103 The previous example directory is artificially split and many of the
1104 characters in the actual filename are omitted in order to make it
1105 more readable. Also, depending on the kernel you are using, the exact
1106 pathname might differ.
1107
1108Within the ``.config`` file, you can see the kernel settings. For
1109example, the following entry shows that symmetric multi-processor
Andrew Geisslerc926e172021-05-07 16:11:35 -05001110support is not set::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001111
1112 # CONFIG_SMP is not set
1113
1114A good method to isolate changed configurations is to use a combination
1115of the ``menuconfig`` tool and simple shell commands. Before changing
1116configurations with ``menuconfig``, copy the existing ``.config`` and
1117rename it to something else, use ``menuconfig`` to make as many changes
1118as you want and save them, then compare the renamed configuration file
1119against the newly created file. You can use the resulting differences as
1120your base to create configuration fragments to permanently save in your
1121kernel layer.
1122
1123.. note::
1124
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001125 Be sure to make a copy of the ``.config`` file and do not just rename it.
1126 The build system needs an existing ``.config`` file from which to work.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001127
1128Creating a  ``defconfig`` File
1129------------------------------
1130
1131A ``defconfig`` file in the context of the Yocto Project is often a
1132``.config`` file that is copied from a build or a ``defconfig`` taken
1133from the kernel tree and moved into recipe space. You can use a
1134``defconfig`` file to retain a known set of kernel configurations from
1135which the OpenEmbedded build system can draw to create the final
1136``.config`` file.
1137
1138.. note::
1139
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001140 Out-of-the-box, the Yocto Project never ships a ``defconfig`` or ``.config``
1141 file. The OpenEmbedded build system creates the final ``.config`` file used
1142 to configure the kernel.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001143
1144To create a ``defconfig``, start with a complete, working Linux kernel
1145``.config`` file. Copy that file to the appropriate
1146``${``\ :term:`PN`\ ``}`` directory in
1147your layer's ``recipes-kernel/linux`` directory, and rename the copied
1148file to "defconfig" (e.g.
1149``~/meta-mylayer/recipes-kernel/linux/linux-yocto/defconfig``). Then,
1150add the following lines to the linux-yocto ``.bbappend`` file in your
Andrew Geisslerc926e172021-05-07 16:11:35 -05001151layer::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001152
Patrick Williams0ca19cc2021-08-16 14:03:13 -05001153 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001154 SRC_URI += "file://defconfig"
1155
1156The :term:`SRC_URI` tells the build system how to search for the file, while the
1157:term:`FILESEXTRAPATHS` extends the :term:`FILESPATH`
1158variable (search directories) to include the ``${PN}`` directory you
1159created to hold the configuration changes.
1160
1161.. note::
1162
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001163 The build system applies the configurations from the ``defconfig``
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001164 file before applying any subsequent configuration fragments. The
1165 final kernel configuration is a combination of the configurations in
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001166 the ``defconfig`` file and any configuration fragments you provide. You need
1167 to realize that if you have any configuration fragments, the build system
1168 applies these on top of and after applying the existing ``defconfig`` file
1169 configurations.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001170
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001171For more information on configuring the kernel, see the
1172":ref:`kernel-dev/common:changing the configuration`" section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001173
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001174Creating Configuration Fragments
1175--------------------------------
1176
1177Configuration fragments are simply kernel options that appear in a file
1178placed where the OpenEmbedded build system can find and apply them. The
1179build system applies configuration fragments after applying
1180configurations from a ``defconfig`` file. Thus, the final kernel
1181configuration is a combination of the configurations in the
1182``defconfig`` file and then any configuration fragments you provide. The
1183build system applies fragments on top of and after applying the existing
1184defconfig file configurations.
1185
1186Syntactically, the configuration statement is identical to what would
1187appear in the ``.config`` file, which is in the :term:`Build Directory`.
1188
1189.. note::
1190
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001191 For more information about where the ``.config`` file is located, see the
1192 example in the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001193 ":ref:`kernel-dev/common:using \`\`menuconfig\`\``"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001194 section.
1195
1196It is simple to create a configuration fragment. One method is to use
1197shell commands. For example, issuing the following from the shell
1198creates a configuration fragment file named ``my_smp.cfg`` that enables
Andrew Geisslerc926e172021-05-07 16:11:35 -05001199multi-processor support within the kernel::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001200
1201 $ echo "CONFIG_SMP=y" >> my_smp.cfg
1202
1203.. note::
1204
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001205 All configuration fragment files must use the ``.cfg`` extension in order
1206 for the OpenEmbedded build system to recognize them as a configuration
1207 fragment.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001208
1209Another method is to create a configuration fragment using the
1210differences between two configuration files: one previously created and
1211saved, and one freshly created using the ``menuconfig`` tool.
1212
1213To create a configuration fragment using this method, follow these
1214steps:
1215
Andrew Geissler517393d2023-01-13 08:55:19 -06001216#. *Complete a Build Through Kernel Configuration:* Complete a build at
Andrew Geisslerc926e172021-05-07 16:11:35 -05001217 least through the kernel configuration task as follows::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001218
1219 $ bitbake linux-yocto -c kernel_configme -f
1220
1221 This step ensures that you create a
William A. Kennington IIIac69b482021-06-02 12:28:27 -07001222 ``.config`` file from a known state. Because there are situations where
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001223 your build state might become unknown, it is best to run this task
1224 prior to starting ``menuconfig``.
1225
Andrew Geissler517393d2023-01-13 08:55:19 -06001226#. *Launch menuconfig:* Run the ``menuconfig`` command::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001227
1228 $ bitbake linux-yocto -c menuconfig
1229
Andrew Geissler517393d2023-01-13 08:55:19 -06001230#. *Create the Configuration Fragment:* Run the ``diffconfig`` command
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001231 to prepare a configuration fragment. The resulting file
1232 ``fragment.cfg`` is placed in the
1233 ``${``\ :term:`WORKDIR`\ ``}``
Andrew Geisslerc926e172021-05-07 16:11:35 -05001234 directory::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001235
1236 $ bitbake linux-yocto -c diffconfig
1237
1238The ``diffconfig`` command creates a file that is a list of Linux kernel
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001239``CONFIG_`` assignments. See the
1240":ref:`kernel-dev/common:changing the configuration`" section for additional
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001241information on how to use the output as a configuration fragment.
1242
1243.. note::
1244
1245 You can also use this method to create configuration fragments for a
Andrew Geissler09209ee2020-12-13 08:44:15 -06001246 BSP. See the ":ref:`kernel-dev/advanced:bsp descriptions`"
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001247 section for more information.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001248
1249Where do you put your configuration fragment files? You can place these
1250files in an area pointed to by
1251:term:`SRC_URI` as directed by your
1252``bblayers.conf`` file, which is located in your layer. The OpenEmbedded
1253build system picks up the configuration and adds it to the kernel's
1254configuration. For example, suppose you had a set of configuration
1255options in a file called ``myconfig.cfg``. If you put that file inside a
1256directory named ``linux-yocto`` that resides in the same directory as
1257the kernel's append file within your layer and then add the following
1258statements to the kernel's append file, those configuration options will
Andrew Geisslerc926e172021-05-07 16:11:35 -05001259be picked up and applied when the kernel is built::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001260
Patrick Williams0ca19cc2021-08-16 14:03:13 -05001261 FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001262 SRC_URI += "file://myconfig.cfg"
1263
1264As mentioned earlier, you can group related configurations into multiple
Andrew Geissler09036742021-06-25 14:25:14 -05001265files and name them all in the :term:`SRC_URI` statement as well. For
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001266example, you could group separate configurations specifically for
1267Ethernet and graphics into their own files and add those by using a
Andrew Geissler09036742021-06-25 14:25:14 -05001268:term:`SRC_URI` statement like the following in your append file::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001269
1270 SRC_URI += "file://myconfig.cfg \
1271 file://eth.cfg \
1272 file://gfx.cfg"
1273
1274Validating Configuration
1275------------------------
1276
1277You can use the
1278:ref:`ref-tasks-kernel_configcheck`
Andrew Geisslerc926e172021-05-07 16:11:35 -05001279task to provide configuration validation::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001280
1281 $ bitbake linux-yocto -c kernel_configcheck -f
1282
1283Running this task produces warnings for when a
1284requested configuration does not appear in the final ``.config`` file or
1285when you override a policy configuration in a hardware configuration
1286fragment.
1287
1288In order to run this task, you must have an existing ``.config`` file.
Andrew Geissler09209ee2020-12-13 08:44:15 -06001289See the ":ref:`kernel-dev/common:using \`\`menuconfig\`\``" section for
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001290information on how to create a configuration file.
1291
Patrick Williams39653562024-03-01 08:54:02 -06001292Here is sample output from the :ref:`ref-tasks-kernel_configcheck` task:
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001293
1294.. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001295
1296 Loading cache: 100% |########################################################| Time: 0:00:00
1297 Loaded 1275 entries from dependency cache.
1298 NOTE: Resolving any missing task queue dependencies
1299
1300 Build Configuration:
1301 .
1302 .
1303 .
1304
1305 NOTE: Executing SetScene Tasks
1306 NOTE: Executing RunQueue Tasks
1307 WARNING: linux-yocto-4.12.12+gitAUTOINC+eda4d18ce4_16de014967-r0 do_kernel_configcheck:
1308 [kernel config]: specified values did not make it into the kernel's final configuration:
1309
1310 ---------- CONFIG_X86_TSC -----------------
1311 Config: CONFIG_X86_TSC
1312 From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/bsp/common-pc/common-pc-cpu.cfg
1313 Requested value: CONFIG_X86_TSC=y
1314 Actual value:
1315
1316
1317 ---------- CONFIG_X86_BIGSMP -----------------
1318 Config: CONFIG_X86_BIGSMP
1319 From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg
1320 /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig
1321 Requested value: # CONFIG_X86_BIGSMP is not set
1322 Actual value:
1323
1324
1325 ---------- CONFIG_NR_CPUS -----------------
1326 Config: CONFIG_NR_CPUS
1327 From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg
1328 /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/bsp/common-pc/common-pc.cfg
1329 /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig
1330 Requested value: CONFIG_NR_CPUS=8
1331 Actual value: CONFIG_NR_CPUS=1
1332
1333
1334 ---------- CONFIG_SCHED_SMT -----------------
1335 Config: CONFIG_SCHED_SMT
1336 From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg
1337 /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig
1338 Requested value: CONFIG_SCHED_SMT=y
1339 Actual value:
1340
1341
1342
1343 NOTE: Tasks Summary: Attempted 288 tasks of which 285 didn't need to be rerun and all succeeded.
1344
1345 Summary: There were 3 WARNING messages shown.
1346
1347.. note::
1348
1349 The previous output example has artificial line breaks to make it
1350 more readable.
1351
1352The output describes the various problems that you can encounter along
1353with where to find the offending configuration items. You can use the
1354information in the logs to adjust your configuration files and then
1355repeat the
1356:ref:`ref-tasks-kernel_configme`
1357and
1358:ref:`ref-tasks-kernel_configcheck`
1359tasks until they produce no warnings.
1360
1361For more information on how to use the ``menuconfig`` tool, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001362:ref:`kernel-dev/common:using \`\`menuconfig\`\`` section.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001363
1364Fine-Tuning the Kernel Configuration File
1365-----------------------------------------
1366
1367You can make sure the ``.config`` file is as lean or efficient as
1368possible by reading the output of the kernel configuration fragment
1369audit, noting any issues, making changes to correct the issues, and then
1370repeating.
1371
Patrick Williams2194f502022-10-16 14:26:09 -05001372As part of the kernel build process, the :ref:`ref-tasks-kernel_configcheck` task
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001373runs. This task validates the kernel configuration by checking the final
1374``.config`` file against the input files. During the check, the task
1375produces warning messages for the following issues:
1376
Patrick Williams8e7b46e2023-05-01 14:19:06 -05001377- Requested options that did not make it into the final ``.config`` file.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001378
1379- Configuration items that appear twice in the same configuration
1380 fragment.
1381
1382- Configuration items tagged as "required" that were overridden.
1383
1384- A board overrides a non-board specific option.
1385
1386- Listed options not valid for the kernel being processed. In other
1387 words, the option does not appear anywhere.
1388
1389.. note::
1390
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001391 The :ref:`ref-tasks-kernel_configcheck` task can also optionally report if
1392 an option is overridden during processing.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001393
1394For each output warning, a message points to the file that contains a
1395list of the options and a pointer to the configuration fragment that
1396defines them. Collectively, the files are the key to streamlining the
1397configuration.
1398
1399To streamline the configuration, do the following:
1400
Andrew Geissler517393d2023-01-13 08:55:19 -06001401#. *Use a Working Configuration:* Start with a full configuration that
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001402 you know works. Be sure the configuration builds and boots
1403 successfully. Use this configuration file as your baseline.
1404
Andrew Geissler517393d2023-01-13 08:55:19 -06001405#. *Run Configure and Check Tasks:* Separately run the
Patrick Williams2194f502022-10-16 14:26:09 -05001406 :ref:`ref-tasks-kernel_configme` and :ref:`ref-tasks-kernel_configcheck` tasks::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001407
1408 $ bitbake linux-yocto -c kernel_configme -f
1409 $ bitbake linux-yocto -c kernel_configcheck -f
1410
Andrew Geissler517393d2023-01-13 08:55:19 -06001411#. *Process the Results:* Take the resulting list of files from the
Patrick Williams2194f502022-10-16 14:26:09 -05001412 :ref:`ref-tasks-kernel_configcheck` task warnings and do the following:
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001413
1414 - Drop values that are redefined in the fragment but do not change
1415 the final ``.config`` file.
1416
1417 - Analyze and potentially drop values from the ``.config`` file that
1418 override required configurations.
1419
1420 - Analyze and potentially remove non-board specific options.
1421
1422 - Remove repeated and invalid options.
1423
Andrew Geissler517393d2023-01-13 08:55:19 -06001424#. *Re-Run Configure and Check Tasks:* After you have worked through the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001425 output of the kernel configuration audit, you can re-run the
Patrick Williams2194f502022-10-16 14:26:09 -05001426 :ref:`ref-tasks-kernel_configme` and :ref:`ref-tasks-kernel_configcheck` tasks to see the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001427 results of your changes. If you have more issues, you can deal with
1428 them as described in the previous step.
1429
1430Iteratively working through steps two through four eventually yields a
1431minimal, streamlined configuration file. Once you have the best
1432``.config``, you can build the Linux Yocto kernel.
1433
1434Expanding Variables
1435===================
1436
1437Sometimes it is helpful to determine what a variable expands to during a
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001438build. You can examine the values of variables by examining the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001439output of the ``bitbake -e`` command. The output is long and is more
Andrew Geisslerc926e172021-05-07 16:11:35 -05001440easily managed in a text file, which allows for easy searches::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001441
1442 $ bitbake -e virtual/kernel > some_text_file
1443
1444Within the text file, you can see
1445exactly how each variable is expanded and used by the OpenEmbedded build
1446system.
1447
1448Working with a "Dirty" Kernel Version String
1449============================================
1450
1451If you build a kernel image and the version string has a "+" or a
William A. Kennington IIIac69b482021-06-02 12:28:27 -07001452"-dirty" at the end, it means there are uncommitted modifications in the kernel's
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001453source directory. Follow these steps to clean up the version string:
1454
Andrew Geissler517393d2023-01-13 08:55:19 -06001455#. *Discover the Uncommitted Changes:* Go to the kernel's locally cloned
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001456 Git repository (source directory) and use the following Git command
Andrew Geisslerc926e172021-05-07 16:11:35 -05001457 to list the files that have been changed, added, or removed::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001458
1459 $ git status
1460
Andrew Geissler517393d2023-01-13 08:55:19 -06001461#. *Commit the Changes:* You should commit those changes to the kernel
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001462 source tree regardless of whether or not you will save, export, or
Andrew Geisslerc926e172021-05-07 16:11:35 -05001463 use the changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001464
1465 $ git add
1466 $ git commit -s -a -m "getting rid of -dirty"
1467
Andrew Geissler517393d2023-01-13 08:55:19 -06001468#. *Rebuild the Kernel Image:* Once you commit the changes, rebuild the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001469 kernel.
1470
1471 Depending on your particular kernel development workflow, the
1472 commands you use to rebuild the kernel might differ. For information
1473 on building the kernel image when using ``devtool``, see the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001474 ":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001475 section. For
Andrew Geisslerd5838332022-05-27 11:33:10 -05001476 information on building the kernel image when using BitBake, see the
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001477 ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001478 section.
1479
1480Working With Your Own Sources
1481=============================
1482
1483If you cannot work with one of the Linux kernel versions supported by
1484existing linux-yocto recipes, you can still make use of the Yocto
1485Project Linux kernel tooling by working with your own sources. When you
1486use your own sources, you will not be able to leverage the existing
1487kernel :term:`Metadata` and stabilization
1488work of the linux-yocto sources. However, you will be able to manage
1489your own Metadata in the same format as the linux-yocto sources.
1490Maintaining format compatibility facilitates converging with linux-yocto
1491on a future, mutually-supported kernel version.
1492
1493To help you use your own sources, the Yocto Project provides a
Andrew Geissler595f6302022-01-24 19:11:47 +00001494linux-yocto custom recipe that uses ``kernel.org`` sources and
1495the Yocto Project Linux kernel tools for managing kernel Metadata.
1496You can find this recipe in the ``poky`` Git repository:
1497:yocto_git:`meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
1498</poky/tree/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb>`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001499
1500Here are some basic steps you can use to work with your own sources:
1501
Andrew Geissler517393d2023-01-13 08:55:19 -06001502#. *Create a Copy of the Kernel Recipe:* Copy the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001503 ``linux-yocto-custom.bb`` recipe to your layer and give it a
1504 meaningful name. The name should include the version of the Yocto
1505 Linux kernel you are using (e.g. ``linux-yocto-myproject_4.12.bb``,
1506 where "4.12" is the base version of the Linux kernel with which you
1507 would be working).
1508
Andrew Geissler517393d2023-01-13 08:55:19 -06001509#. *Create a Directory for Your Patches:* In the same directory inside
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001510 your layer, create a matching directory to store your patches and
1511 configuration files (e.g. ``linux-yocto-myproject``).
1512
Andrew Geissler517393d2023-01-13 08:55:19 -06001513#. *Ensure You Have Configurations:* Make sure you have either a
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001514 ``defconfig`` file or configuration fragment files in your layer.
1515 When you use the ``linux-yocto-custom.bb`` recipe, you must specify a
1516 configuration. If you do not have a ``defconfig`` file, you can run
Andrew Geisslerc926e172021-05-07 16:11:35 -05001517 the following::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001518
1519 $ make defconfig
1520
1521 After running the command, copy the
1522 resulting ``.config`` file to the ``files`` directory in your layer
1523 as "defconfig" and then add it to the
1524 :term:`SRC_URI` variable in the
1525 recipe.
1526
1527 Running the ``make defconfig`` command results in the default
1528 configuration for your architecture as defined by your kernel.
William A. Kennington IIIac69b482021-06-02 12:28:27 -07001529 However, there is no guarantee that this configuration is valid for
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001530 your use case, or that your board will even boot. This is
1531 particularly true for non-x86 architectures.
1532
1533 To use non-x86 ``defconfig`` files, you need to be more specific and
1534 find one that matches your board (i.e. for arm, you look in
1535 ``arch/arm/configs`` and use the one that is the best starting point
1536 for your board).
1537
Andrew Geissler517393d2023-01-13 08:55:19 -06001538#. *Edit the Recipe:* Edit the following variables in your recipe as
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001539 appropriate for your project:
1540
1541 - :term:`SRC_URI`: The
Andrew Geissler09036742021-06-25 14:25:14 -05001542 :term:`SRC_URI` should specify a Git repository that uses one of the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001543 supported Git fetcher protocols (i.e. ``file``, ``git``, ``http``,
Andrew Geissler09036742021-06-25 14:25:14 -05001544 and so forth). The :term:`SRC_URI` variable should also specify either
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001545 a ``defconfig`` file or some configuration fragment files. The
Andrew Geissler09036742021-06-25 14:25:14 -05001546 skeleton recipe provides an example :term:`SRC_URI` as a syntax
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001547 reference.
1548
1549 - :term:`LINUX_VERSION`:
1550 The Linux kernel version you are using (e.g. "4.12").
1551
1552 - :term:`LINUX_VERSION_EXTENSION`:
1553 The Linux kernel ``CONFIG_LOCALVERSION`` that is compiled into the
1554 resulting kernel and visible through the ``uname`` command.
1555
1556 - :term:`SRCREV`: The commit ID
1557 from which you want to build.
1558
1559 - :term:`PR`: Treat this variable the
1560 same as you would in any other recipe. Increment the variable to
1561 indicate to the OpenEmbedded build system that the recipe has
1562 changed.
1563
Andrew Geissler09036742021-06-25 14:25:14 -05001564 - :term:`PV`: The default :term:`PV`
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001565 assignment is typically adequate. It combines the
Andrew Geissler09036742021-06-25 14:25:14 -05001566 :term:`LINUX_VERSION` with the Source Control Manager (SCM) revision
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001567 as derived from the :term:`SRCPV`
1568 variable. The combined results are a string with the following
Andrew Geisslerc926e172021-05-07 16:11:35 -05001569 form::
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001570
1571 3.19.11+git1+68a635bf8dfb64b02263c1ac80c948647cc76d5f_1+218bd8d2022b9852c60d32f0d770931e3cf343e2
1572
Andrew Geissler09036742021-06-25 14:25:14 -05001573 While lengthy, the extra verbosity in :term:`PV` helps ensure you are
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001574 using the exact sources from which you intend to build.
1575
1576 - :term:`COMPATIBLE_MACHINE`:
1577 A list of the machines supported by your new recipe. This variable
1578 in the example recipe is set by default to a regular expression
1579 that matches only the empty string, "(^$)". This default setting
1580 triggers an explicit build failure. You must change it to match a
1581 list of the machines that your new recipe supports. For example,
1582 to support the ``qemux86`` and ``qemux86-64`` machines, use the
Andrew Geisslerc926e172021-05-07 16:11:35 -05001583 following form::
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001584
1585 COMPATIBLE_MACHINE = "qemux86|qemux86-64"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001586
Andrew Geissler517393d2023-01-13 08:55:19 -06001587#. *Customize Your Recipe as Needed:* Provide further customizations to
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001588 your recipe as needed just as you would customize an existing
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001589 linux-yocto recipe. See the
1590 ":ref:`ref-manual/devtool-reference:modifying an existing recipe`" section
1591 for information.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001592
1593Working with Out-of-Tree Modules
1594================================
1595
1596This section describes steps to build out-of-tree modules on your target
1597and describes how to incorporate out-of-tree modules in the build.
1598
1599Building Out-of-Tree Modules on the Target
1600------------------------------------------
1601
1602While the traditional Yocto Project development model would be to
1603include kernel modules as part of the normal build process, you might
1604find it useful to build modules on the target. This could be the case if
1605your target system is capable and powerful enough to handle the
1606necessary compilation. Before deciding to build on your target, however,
1607you should consider the benefits of using a proper cross-development
1608environment from your build host.
1609
1610If you want to be able to build out-of-tree modules on the target, there
1611are some steps you need to take on the target that is running your SDK
1612image. Briefly, the ``kernel-dev`` package is installed by default on
1613all ``*.sdk`` images and the ``kernel-devsrc`` package is installed on
1614many of the ``*.sdk`` images. However, you need to create some scripts
1615prior to attempting to build the out-of-tree modules on the target that
1616is running that image.
1617
1618Prior to attempting to build the out-of-tree modules, you need to be on
1619the target as root and you need to change to the ``/usr/src/kernel``
1620directory. Next, ``make`` the scripts:
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001621
1622.. code-block:: none
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001623
1624 # cd /usr/src/kernel
1625 # make scripts
1626
1627Because all SDK image recipes include ``dev-pkgs``, the
1628``kernel-dev`` packages will be installed as part of the SDK image and
1629the ``kernel-devsrc`` packages will be installed as part of applicable
1630SDK images. The SDK uses the scripts when building out-of-tree modules.
1631Once you have switched to that directory and created the scripts, you
1632should be able to build your out-of-tree modules on the target.
1633
1634Incorporating Out-of-Tree Modules
1635---------------------------------
1636
1637While it is always preferable to work with sources integrated into the
1638Linux kernel sources, if you need an external kernel module, the
1639``hello-mod.bb`` recipe is available as a template from which you can
1640create your own out-of-tree Linux kernel module recipe.
1641
1642This template recipe is located in the ``poky`` Git repository of the
Andrew Geissler595f6302022-01-24 19:11:47 +00001643Yocto Project:
1644:yocto_git:`meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb
1645</poky/tree/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb>`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001646
1647To get started, copy this recipe to your layer and give it a meaningful
1648name (e.g. ``mymodule_1.0.bb``). In the same directory, create a new
1649directory named ``files`` where you can store any source files, patches,
1650or other files necessary for building the module that do not come with
1651the sources. Finally, update the recipe as needed for the module.
1652Typically, you will need to set the following variables:
1653
1654- :term:`DESCRIPTION`
1655
1656- :term:`LICENSE* <LICENSE>`
1657
1658- :term:`SRC_URI`
1659
1660- :term:`PV`
1661
1662Depending on the build system used by the module sources, you might need
1663to make some adjustments. For example, a typical module ``Makefile``
Andrew Geisslerc926e172021-05-07 16:11:35 -05001664looks much like the one provided with the ``hello-mod`` template::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001665
1666 obj-m := hello.o
1667
1668 SRC := $(shell pwd)
1669
1670 all:
Patrick Williams44b3caf2024-04-12 16:51:14 -05001671 $(MAKE) -C $(KERNEL_SRC) M=$(SRC)
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001672
1673 modules_install:
Patrick Williams44b3caf2024-04-12 16:51:14 -05001674 $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001675 ...
1676
1677The important point to note here is the :term:`KERNEL_SRC` variable. The
Andrew Geissler517393d2023-01-13 08:55:19 -06001678:ref:`ref-classes-module` class sets this variable and the :term:`KERNEL_PATH`
1679variable to ``${STAGING_KERNEL_DIR}`` with the necessary Linux kernel build
1680information to build modules. If your module ``Makefile`` uses a different
1681variable, you might want to override the :ref:`ref-tasks-compile` step, or
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001682create a patch to the ``Makefile`` to work with the more typical
Andrew Geissler09036742021-06-25 14:25:14 -05001683:term:`KERNEL_SRC` or :term:`KERNEL_PATH` variables.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001684
1685After you have prepared your recipe, you will likely want to include the
1686module in your images. To do this, see the documentation for the
1687following variables in the Yocto Project Reference Manual and set one of
1688them appropriately for your machine configuration file:
1689
1690- :term:`MACHINE_ESSENTIAL_EXTRA_RDEPENDS`
1691
1692- :term:`MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS`
1693
1694- :term:`MACHINE_EXTRA_RDEPENDS`
1695
1696- :term:`MACHINE_EXTRA_RRECOMMENDS`
1697
1698Modules are often not required for boot and can be excluded from certain
Andrew Geisslerc926e172021-05-07 16:11:35 -05001699build configurations. The following allows for the most flexibility::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001700
1701 MACHINE_EXTRA_RRECOMMENDS += "kernel-module-mymodule"
1702
1703The value is
1704derived by appending the module filename without the ``.ko`` extension
1705to the string "kernel-module-".
1706
1707Because the variable is
1708:term:`RRECOMMENDS` and not a
1709:term:`RDEPENDS` variable, the build
1710will not fail if this module is not available to include in the image.
1711
1712Inspecting Changes and Commits
1713==============================
1714
1715A common question when working with a kernel is: "What changes have been
1716applied to this tree?" Rather than using "grep" across directories to
1717see what has changed, you can use Git to inspect or search the kernel
1718tree. Using Git is an efficient way to see what has changed in the tree.
1719
1720What Changed in a Kernel?
1721-------------------------
1722
Patrick Williams39653562024-03-01 08:54:02 -06001723Here are a few examples that show how to use Git commands to
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001724examine changes. These examples are by no means the only way to see
1725changes.
1726
1727.. note::
1728
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001729 In the following examples, unless you provide a commit range, ``kernel.org``
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001730 history is blended with Yocto Project kernel changes. You can form
1731 ranges by using branch names from the kernel tree as the upper and
1732 lower commit markers with the Git commands. You can see the branch
1733 names through the web interface to the Yocto Project source
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001734 repositories at :yocto_git:`/`.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001735
1736To see a full range of the changes, use the ``git whatchanged`` command
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001737and specify a commit range for the branch (`commit`\ ``..``\ `commit`).
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001738
1739Here is an example that looks at what has changed in the ``emenlow``
1740branch of the ``linux-yocto-3.19`` kernel. The lower commit range is the
1741commit associated with the ``standard/base`` branch, while the upper
1742commit range is the commit associated with the ``standard/emenlow``
Andrew Geissler517393d2023-01-13 08:55:19 -06001743branch::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001744
1745 $ git whatchanged origin/standard/base..origin/standard/emenlow
1746
Andrew Geisslerc926e172021-05-07 16:11:35 -05001747To see short, one line summaries of changes use the ``git log`` command::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001748
1749 $ git log --oneline origin/standard/base..origin/standard/emenlow
1750
Andrew Geisslerc926e172021-05-07 16:11:35 -05001751Use this command to see code differences for the changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001752
1753 $ git diff origin/standard/base..origin/standard/emenlow
1754
1755Use this command to see the commit log messages and the text
Andrew Geisslerc926e172021-05-07 16:11:35 -05001756differences::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001757
1758 $ git show origin/standard/base..origin/standard/emenlow
1759
1760Use this command to create individual patches for each change. Here is
Andrew Geissler3b8a17c2021-04-15 15:55:55 -05001761an example that creates patch files for each commit and places them
Andrew Geisslerc926e172021-05-07 16:11:35 -05001762in your ``Documents`` directory::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001763
1764 $ git format-patch -o $HOME/Documents origin/standard/base..origin/standard/emenlow
1765
1766Showing a Particular Feature or Branch Change
1767---------------------------------------------
1768
1769Tags in the Yocto Project kernel tree divide changes for significant
1770features or branches. The ``git show`` tag command shows changes based
Andrew Geisslerc926e172021-05-07 16:11:35 -05001771on a tag. Here is an example that shows ``systemtap`` changes::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001772
1773 $ git show systemtap
1774
1775You can use the ``git branch --contains`` tag command to
1776show the branches that contain a particular feature. This command shows
Andrew Geisslerc926e172021-05-07 16:11:35 -05001777the branches that contain the ``systemtap`` feature::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001778
1779 $ git branch --contains systemtap
1780
1781Adding Recipe-Space Kernel Features
1782===================================
1783
1784You can add kernel features in the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001785:ref:`recipe-space <kernel-dev/advanced:recipe-space metadata>`
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001786by using the :term:`KERNEL_FEATURES`
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001787variable and by specifying the feature's ``.scc`` file path in the
1788:term:`SRC_URI` statement. When you
1789add features using this method, the OpenEmbedded build system checks to
1790be sure the features are present. If the features are not present, the
1791build stops. Kernel features are the last elements processed for
1792configuring and patching the kernel. Therefore, adding features in this
1793manner is a way to enforce specific features are present and enabled
1794without needing to do a full audit of any other layer's additions to the
Andrew Geissler09036742021-06-25 14:25:14 -05001795:term:`SRC_URI` statement.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001796
1797You add a kernel feature by providing the feature as part of the
Andrew Geissler09036742021-06-25 14:25:14 -05001798:term:`KERNEL_FEATURES` variable and by providing the path to the feature's
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001799``.scc`` file, which is relative to the root of the kernel Metadata. The
1800OpenEmbedded build system searches all forms of kernel Metadata on the
Andrew Geissler09036742021-06-25 14:25:14 -05001801:term:`SRC_URI` statement regardless of whether the Metadata is in the
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001802"kernel-cache", system kernel Metadata, or a recipe-space Metadata (i.e.
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001803part of the kernel recipe). See the
Andrew Geissler09209ee2020-12-13 08:44:15 -06001804":ref:`kernel-dev/advanced:kernel metadata location`" section for
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001805additional information.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001806
Andrew Geissler09036742021-06-25 14:25:14 -05001807When you specify the feature's ``.scc`` file on the :term:`SRC_URI`
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001808statement, the OpenEmbedded build system adds the directory of that
1809``.scc`` file along with all its subdirectories to the kernel feature
1810search path. Because subdirectories are searched, you can reference a
Andrew Geissler09036742021-06-25 14:25:14 -05001811single ``.scc`` file in the :term:`SRC_URI` statement to reference multiple
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001812kernel features.
1813
1814Consider the following example that adds the "test.scc" feature to the
1815build.
1816
Andrew Geissler517393d2023-01-13 08:55:19 -06001817#. *Create the Feature File:* Create a ``.scc`` file and locate it just
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001818 as you would any other patch file, ``.cfg`` file, or fetcher item you
Andrew Geissler09036742021-06-25 14:25:14 -05001819 specify in the :term:`SRC_URI` statement.
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001820
1821 .. note::
1822
1823 - You must add the directory of the ``.scc`` file to the
1824 fetcher's search path in the same manner as you would add a
1825 ``.patch`` file.
1826
1827 - You can create additional ``.scc`` files beneath the directory
1828 that contains the file you are adding. All subdirectories are
1829 searched during the build as potential feature directories.
1830
1831 Continuing with the example, suppose the "test.scc" feature you are
Andrew Geisslerc926e172021-05-07 16:11:35 -05001832 adding has a ``test.scc`` file in the following directory::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001833
1834 my_recipe
1835 |
1836 +-linux-yocto
1837 |
1838 +-test.cfg
1839 +-test.scc
1840
1841 In this example, the
1842 ``linux-yocto`` directory has both the feature ``test.scc`` file and
1843 a similarly named configuration fragment file ``test.cfg``.
1844
Andrew Geissler517393d2023-01-13 08:55:19 -06001845#. *Add the Feature File to SRC_URI:* Add the ``.scc`` file to the
Andrew Geissler09036742021-06-25 14:25:14 -05001846 recipe's :term:`SRC_URI` statement::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001847
Andrew Geissler87f5cff2022-09-30 13:13:31 -05001848 SRC_URI += "file://test.scc"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001849
1850 The leading space before the path is important as the path is
1851 appended to the existing path.
1852
Andrew Geissler517393d2023-01-13 08:55:19 -06001853#. *Specify the Feature as a Kernel Feature:* Use the
Andrew Geissler09036742021-06-25 14:25:14 -05001854 :term:`KERNEL_FEATURES` statement to specify the feature as a kernel
Andrew Geisslerc926e172021-05-07 16:11:35 -05001855 feature::
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001856
Andrew Geissler87f5cff2022-09-30 13:13:31 -05001857 KERNEL_FEATURES += "test.scc"
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001858
1859 The OpenEmbedded build
1860 system processes the kernel feature when it builds the kernel.
1861
1862 .. note::
1863
1864 If other features are contained below "test.scc", then their
Andrew Geissler4c19ea12020-10-27 13:52:24 -05001865 directories are relative to the directory containing the ``test.scc``
Andrew Geisslerc9f78652020-09-18 14:11:35 -05001866 file.