xref: /openbmc/openbmc/poky/documentation/kernel-dev/common.rst (revision 96e4b4e121e0e2da1535d7d537d6a982a6ff5bc0)
1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
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
24set up, see the ":doc:`/dev-manual/start`" section in
25the 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
28":ref:`dev-manual/start:cloning the \`\`poky\`\` repository`"
29section 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
36   desired version of Yocto Project. See the
37   ":ref:`dev-manual/start:checking out by branch in poky`" and
38   ":ref:`dev-manual/start:checking out by tag in poky`"
39   sections in the Yocto Project Development Tasks Manual for more information.
40
41Kernel development is best accomplished using
42:ref:`devtool <sdk-manual/extensible:using \`\`devtool\`\` in your sdk workflow>`
43and 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
51image and ready to make modifications as described in the
52":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
53section:
54
55#. *Initialize the BitBake Environment:*
56   you need to initialize the BitBake build environment by sourcing
57   the build environment script (i.e. :ref:`structure-core-script`)::
58
59      $ cd poky
60      $ source oe-init-build-env
61
62   .. note::
63
64      The previous commands assume the
65      :ref:`overview-manual/development-environment:yocto project source repositories`
66      (i.e. ``poky``) have been cloned using Git and the local repository is named
67      "poky".
68
69#. *Prepare Your local.conf File:* By default, the :term:`MACHINE` variable
70   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
72   :term:`MACHINE` variable appropriately in your ``conf/local.conf`` file
73   found in the :term:`Build Directory` (i.e.  ``poky/build`` in this example).
74
75   Also, since you are preparing to work on the kernel image, you need
76   to set the :term:`MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS` variable to include
77   kernel modules.
78
79   In this example we wish to build for qemux86 so we must set the
80   :term:`MACHINE` variable to "qemux86" and also add the "kernel-modules".
81   As described we do this by appending to ``conf/local.conf``::
82
83      MACHINE = "qemux86"
84      MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
85
86#. *Create a Layer for Patches:* You need to create a layer to hold
87   patches created for the kernel image. You can use the
88   ``bitbake-layers create-layer`` command as follows::
89
90      $ cd poky/build
91      $ 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,
99      see the
100      ":ref:`dev-manual/layers:understanding and creating layers`"
101      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
106      ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
107      section in the Yocto Project Development Tasks Manual.
108
109#. *Inform the BitBake Build Environment About Your Layer:* As directed
110   when you created your layer, you need to add the layer to the
111   :term:`BBLAYERS` variable in the
112   ``bblayers.conf`` file as follows::
113
114      $ cd poky/build
115      $ bitbake-layers add-layer ../../meta-mylayer
116      NOTE: Starting bitbake server...
117      $
118
119#. *Build the Clean Image:* The final step in preparing to work on the
120   kernel is to build an initial image using ``bitbake``::
121
122      $ bitbake core-image-minimal
123      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.
134
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
139   :yocto_wiki:`TipsAndTricks/KernelDevelopmentWithEsdk </TipsAndTricks/KernelDevelopmentWithEsdk>`
140   Wiki page.
141
142At this point you have set up to start making modifications to the
143kernel. For a continued example, see the
144":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
145section.
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
158source as described in the ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
159section:
160
161#. *Initialize the BitBake Environment:* Before you can do anything
162   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
168   ":ref:`dev-manual/start:checking out by branch in poky`"
169   section in the Yocto Project Development Tasks Manual::
170
171      $ cd poky
172      $ git branch
173      master
174      * &DISTRO_NAME_NO_CAP;
175      $ source oe-init-build-env
176
177   .. note::
178
179      The previous commands assume the
180      :ref:`overview-manual/development-environment:yocto project source repositories`
181      (i.e. ``poky``) have been cloned using Git and the local repository is named
182      "poky".
183
184#. *Prepare Your local.conf File:* By default, the :term:`MACHINE` variable is
185   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).
189
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
196   :term:`MACHINE` variable to "qemux86" and also add the "kernel-modules".
197   As described we do this by appending to ``conf/local.conf``::
198
199      MACHINE = "qemux86"
200      MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules"
201
202#. *Create a Layer for Patches:* You need to create a layer to hold
203   patches created for the kernel image. You can use the
204   ``bitbake-layers create-layer`` command as follows::
205
206      $ cd poky/build
207      $ 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,
214      see the
215      ":ref:`dev-manual/layers:understanding and creating layers`"
216      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
221      ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
222      section in the Yocto Project Development Tasks Manual.
223
224#. *Inform the BitBake Build Environment About Your Layer:* As directed
225   when you created your layer, you need to add the layer to the
226   :term:`BBLAYERS` variable in the
227   ``bblayers.conf`` file as follows::
228
229      $ cd poky/build
230      $ bitbake-layers add-layer ../../meta-mylayer
231      NOTE: Starting bitbake server ...
232      $
233
234#. *Create a Local Copy of the Kernel Git Repository:* You can find Git
235   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
246   ``linux-yocto-4.12`` kernel and be in the ``standard/base`` branch::
247
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.
256      Checking out files: 100% (59846/59846), done.
257
258   .. 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
266   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
273   ``yocto-kernel-cache`` and switch to the ``yocto-4.12`` branch::
274
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
287the ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
288section.
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
299":ref:`dev-manual/layers:understanding and creating layers`"
300section in the Yocto Project Development Tasks Manual.
301
302.. note::
303
304   The Yocto Project comes with many tools that simplify tasks you need
305   to perform. One such tool is the ``bitbake-layers create-layer``
306   command, which simplifies creating a new layer. See the
307   ":ref:`dev-manual/layers:creating a general layer using the \`\`bitbake-layers\`\` script`"
308   section in the Yocto Project Development Tasks Manual for
309   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
316#. *Create Structure*: Create the layer's structure::
317
318      $ mkdir -p meta-mylayer/conf meta-mylayer/recipes-kernel/linux/linux-yocto
319
320   The ``conf`` directory holds your configuration files, while the
321   ``recipes-kernel`` directory holds your append file and eventual
322   patch files.
323
324#. *Create the Layer Configuration File*: Move to the
325   ``meta-mylayer/conf`` directory and create the ``layer.conf`` file as
326   follows::
327
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
341#. *Create the Kernel Recipe Append File*: Move to the
342   ``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
345   ``linux-yocto_4.12.bbappend``::
346
347      FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
348
349      SRC_URI += "file://patch-file-one.patch"
350      SRC_URI += "file://patch-file-two.patch"
351      SRC_URI += "file://patch-file-three.patch"
352
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
356   ":ref:`dev-manual/layers:appending other layers metadata with your layer`"
357   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
370- :ref:`kernel-dev/common:creating the append file`
371
372- :ref:`kernel-dev/common:applying patches`
373
374- :ref:`kernel-dev/common:changing the configuration`
375
376Before modifying an existing recipe, be sure that you have created a
377minimal, custom layer from which you can work. See the
378":ref:`kernel-dev/common:creating and preparing a layer`" section for
379information.
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
386modifying the ``meta/recipes-kernel/linux/linux-yocto_6.1.bb`` recipe,
387the append file will typically be located as follows within your custom
388layer:
389
390.. code-block:: none
391
392   your-layer/recipes-kernel/linux/linux-yocto_6.1.bbappend
393
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`
398variable as follows::
399
400   FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
401
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
405extended :term:`FILESPATH` as described above, you must place the files in
406your layer in the following area::
407
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
413   sure to refer to the :doc:`/bsp-guide/index`.
414
415As an example, consider the following append file used by the BSPs in
416``meta-yocto-bsp``:
417
418.. code-block:: none
419
420   meta-yocto-bsp/recipes-kernel/linux/linux-yocto_6.1.bbappend
421
422Here are the contents of this file. Be aware that the actual commit ID
423strings in this example listing might be different than the actual
424strings in the file from the ``meta-yocto-bsp`` layer upstream::
425
426  KBRANCH:genericx86  = "v6.1/standard/base"
427  KBRANCH:genericx86-64  = "v6.1/standard/base"
428  KBRANCH:beaglebone-yocto = "v6.1/standard/beaglebone"
429
430  KMACHINE:genericx86 ?= "common-pc"
431  KMACHINE:genericx86-64 ?= "common-pc-64"
432  KMACHINE:beaglebone-yocto ?= "beaglebone"
433
434  SRCREV_machine:genericx86 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
435  SRCREV_machine:genericx86-64 ?= "6ec439b4b456ce929c4c07fe457b5d6a4b468e86"
436  SRCREV_machine:beaglebone-yocto ?= "423e1996694b61fbfc8ec3bf062fc6461d64fde1"
437
438  COMPATIBLE_MACHINE:genericx86 = "genericx86"
439  COMPATIBLE_MACHINE:genericx86-64 = "genericx86-64"
440  COMPATIBLE_MACHINE:beaglebone-yocto = "beaglebone-yocto"
441
442  LINUX_VERSION:genericx86 = "6.1.30"
443  LINUX_VERSION:genericx86-64 = "6.1.30"
444  LINUX_VERSION:beaglebone-yocto = "6.1.20"
445
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
479named ``linux-yocto`` and then add a :term:`SRC_URI` statement such as the
480following to the append file. When the OpenEmbedded build system builds
481the kernel, the configuration options are picked up and applied::
482
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
488files and adds the configurations by using a :term:`SRC_URI` statement like
489the following in your append file::
490
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
503   There are other ways of grouping and defining configuration
504   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
513   moving the :term:`SRC_URI`-specified configuration options to the
514   kernel's ``meta`` branch. Not only is it easier for BSP developers
515   not to have to put those configurations in the branch,
516   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
533lines to your linux-yocto ``.bbappend`` file in your layer::
534
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
545":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
546and
547":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
548sections.
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
563following lines to the linux-yocto ``.bbappend`` file in your layer::
564
565   FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
566   SRC_URI += "file://defconfig"
567
568The :term:`SRC_URI` tells the build system how to search
569for 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
575You 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
584.. note::
585
586   The build system applies the configurations from the ``defconfig``
587   file before applying any subsequent configuration fragments. The
588   final kernel configuration is a combination of the configurations in
589   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.
593
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
598with the following content (without indentation)::
599
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
609configuration fragment and extend the :term:`FILESPATH` variable in your
610``.bbappend`` file::
611
612   FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
613   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
620":ref:`kernel-dev/common:configuring the kernel`" section.
621
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
629"out-of-tree", and then configures them using the following::
630
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
642form::
643
644   KBUILD_DEFCONFIG:<machine> ?= "defconfig_file"
645
646Here 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::
650
651   KBUILD_DEFCONFIG:raspberrypi2 ?= "bcm2709_defconfig"
652
653Aside from modifying your kernel recipe and providing your own
654``defconfig`` file, you need to be sure no files or statements set
655:term:`SRC_URI` to use a ``defconfig`` other than your "in-tree" file (e.g.
656a kernel's ``linux-``\ `machine`\ ``.inc`` file). In other words, if the
657build system detects a statement that identifies an "out-of-tree"
658``defconfig`` file, that statement will override your
659:term:`KBUILD_DEFCONFIG` variable.
660
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
669``devtool``.
670
671.. note::
672
673   Before attempting this procedure, be sure you have performed the
674   steps to get ready for updating the kernel as described in the
675   ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
676   section.
677
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
688the ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``" Section.
689
690#. *Check Out the Kernel Source Files:* First you must use ``devtool``
691   to checkout the kernel source code in its workspace.
692
693   .. note::
694
695      See this step in the
696      ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
697      section for more information.
698
699   Use the following ``devtool`` command to check out the code::
700
701      $ devtool modify linux-yocto
702
703   .. note::
704
705      During the checkout operation, there is a bug that could cause
706      errors such as the following:
707
708      .. code-block:: none
709
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
718#. *Edit the Source Files* Follow these steps to make some simple
719   changes to the source files:
720
721   #. *Change the working directory*: In the previous step, the output
722      noted where you can find the source files (e.g.
723      ``poky_sdk/workspace/sources/linux-yocto``). Change to where the
724      kernel source code is before making your edits to the
725      ``calibrate.c`` file::
726
727         $ cd poky_sdk/workspace/sources/linux-yocto
728
729   #. *Edit the source file*: Edit the ``init/calibrate.c`` file to have
730      the following changes::
731
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
749#. *Build the Updated Kernel Source:* To build the updated kernel
750   source, use ``devtool``::
751
752      $ devtool build linux-yocto
753
754#. *Create the Image With the New Kernel:* Use the
755   ``devtool build-image`` command to create a new image that has the
756   new kernel::
757
758      $ cd ~
759      $ devtool build-image core-image-minimal
760
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
766      :yocto_wiki:`TipsAndTricks/KernelDevelopmentWithEsdk </TipsAndTricks/KernelDevelopmentWithEsdk>`
767      Wiki Page.
768
769#. *Test the New Image:* For this example, you can run the new image
770   using QEMU to verify your changes:
771
772   #. *Boot the image*: Boot the modified image in the QEMU emulator
773      using this command::
774
775         $ runqemu qemux86
776
777   #. *Verify the changes*: Log into the machine using ``root`` with no
778      password and then use the following shell command to scroll
779      through the console's boot output.
780
781      .. code-block:: none
782
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
789#. *Stage and commit your changes*: Change
790   your working directory to where you modified the ``calibrate.c`` file
791   and use these Git commands to stage and commit your changes::
792
793      $ cd poky_sdk/workspace/sources/linux-yocto
794      $ git status
795      $ git add init/calibrate.c
796      $ git commit -m "calibrate: Add printk example"
797
798#. *Export the Patches and Create an Append File:* To export your
799   commits as patches and create a ``.bbappend`` file, use the following
800   command. This example uses the previously established layer named ``meta-mylayer``::
801
802      $ devtool finish linux-yocto ~/meta-mylayer
803
804   .. note::
805
806      See Step 3 of the
807      ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
808      section for information on setting up this layer.
809
810   Once the command
811   finishes, the patches and the ``.bbappend`` file are located in the
812   ``~/meta-mylayer/recipes-kernel/linux`` directory.
813
814#. *Build the Image With Your Modified Kernel:* You can now build an
815   image that includes your kernel patches. Execute the following
816   command from your :term:`Build Directory` in the terminal
817   set up to run BitBake::
818
819      $ cd poky/build
820      $ 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
826traditional kernel development (i.e. not using ``devtool``
827as described in the
828":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
829section).
830
831.. note::
832
833   Before attempting this procedure, be sure you have performed the
834   steps to get ready for updating the kernel as described in the
835   ":ref:`kernel-dev/common:getting ready for traditional kernel development`"
836   section.
837
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
848found in the
849":ref:`kernel-dev/common:getting ready for traditional kernel development`"
850Section.
851
852#. *Edit the Source Files* Prior to this step, you should have used Git
853   to create a local copy of the repository for your kernel. Assuming
854   you created the repository as directed in the
855   ":ref:`kernel-dev/common:getting ready for traditional kernel development`"
856   section, use the following commands to edit the ``calibrate.c`` file:
857
858   #. *Change the working directory*: You need to locate the source
859      files in the local copy of the kernel Git repository. Change to
860      where the kernel source code is before making your edits to the
861      ``calibrate.c`` file::
862
863         $ cd ~/linux-yocto-4.12/init
864
865   #. *Edit the source file*: Edit the ``calibrate.c`` file to have the
866      following changes::
867
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
885#. *Stage and Commit Your Changes:* Use standard Git commands to stage
886   and commit the changes you just made::
887
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
895#. *Update Your local.conf File to Point to Your Source Files:* In
896   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
901   to the following to your ``local.conf``::
902
903      $ cd poky/build/conf
904
905   Add the following to the ``local.conf``::
906
907      SRC_URI:pn-linux-yocto = "git:///path-to/linux-yocto-4.12;protocol=file;name=machine;branch=standard/base; \
908                                git:///path-to/yocto-kernel-cache;protocol=file;type=kmeta;name=meta;branch=yocto-4.12;destsuffix=${KMETA}"
909      SRCREV_meta:qemux86 = "${AUTOREV}"
910      SRCREV_machine:qemux86 = "${AUTOREV}"
911
912   .. note::
913
914      Be sure to replace `path-to`
915      with the pathname to your local Git repositories. Also, you must
916      be sure to specify the correct branch and machine types. For this
917      example, the branch is ``standard/base`` and the machine is ``qemux86``.
918
919#. *Build the Image:* With the source modified, your changes staged and
920   committed, and the ``local.conf`` file pointing to the kernel files,
921   you can now use BitBake to build the image::
922
923      $ cd poky/build
924      $ bitbake core-image-minimal
925
926#. *Boot the image*: Boot the modified image in the QEMU emulator using
927   this command. When prompted to login to the QEMU console, use "root"
928   with no password::
929
930      $ cd poky/build
931      $ runqemu qemux86
932
933#. *Look for Your Changes:* As QEMU booted, you might have seen your
934   changes rapidly scroll by. If not, use these commands to see your
935   changes:
936
937   .. code-block:: none
938
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
945#. *Generate the Patch File:* Once you are sure that your patch works
946   correctly, you can generate a ``*.patch`` file in the kernel source
947   repository::
948
949      $ cd ~/linux-yocto-4.12/init
950      $ git format-patch -1
951      0001-calibrate.c-Added-some-printk-statements.patch
952
953#. *Move the Patch File to Your Layer:* In order for subsequent builds
954   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
960   additional structure to your layer using the following commands::
961
962      $ cd ~/meta-mylayer
963      $ mkdir -p recipes-kernel recipes-kernel/linux/linux-yocto
964
965   Once you have created this
966   hierarchy in your layer, you can move the patch file using the
967   following command::
968
969      $ mv ~/linux-yocto-4.12/init/0001-calibrate.c-Added-some-printk-statements.patch ~/meta-mylayer/recipes-kernel/linux/linux-yocto
970
971#. *Create the Append File:* Finally, you need to create the
972   ``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
976   contents::
977
978      FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
979      SRC_URI += "file://0001-calibrate.c-Added-some-printk-statements.patch"
980
981   The :term:`FILESEXTRAPATHS` and :term:`SRC_URI` statements
982   enable the OpenEmbedded build system to find the patch file.
983
984   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
987   ":ref:`dev-manual/layers:appending other layers metadata with your layer`"
988   section in the Yocto Project Development Tasks Manual.
989
990   .. note::
991
992      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
995      the following sequence of commands::
996
997              $ cd poky/build
998              $ bitbake -c cleanall linux-yocto
999              $ 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
1019For more information on kernel configuration, see the
1020":ref:`kernel-dev/common:changing the configuration`" section.
1021
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
1028``menuconfig``, see :wikipedia:`Menuconfig`.
1029
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
1034   set up your environment by running the :ref:`structure-core-script` script
1035   found in the :term:`Build Directory`.
1036
1037-  You must be sure of the state of your build's configuration in the
1038   :term:`Source Directory`.
1039
1040-  Your build host must have the following two packages installed::
1041
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
1048Directory's top-level folder is ``poky``::
1049
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
1063   You can use the entire ``.config`` file as the ``defconfig`` file. For
1064   information on ``defconfig`` files, see the
1065   ":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`"
1068   sections.
1069
1070Consider an example that configures the "CONFIG_SMP" setting for the
1071``linux-yocto-4.12`` kernel.
1072
1073.. note::
1074
1075   The OpenEmbedded build system recognizes this kernel as ``linux-yocto``
1076   through Metadata (e.g. :term:`PREFERRED_VERSION`\ ``_linux-yocto ?= "4.12%"``).
1077
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
1087Saving 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
1091area 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:
1095
1096.. code-block:: none
1097
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
1110support is not set::
1111
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
1125   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.
1127
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
1140   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.
1143
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
1151layer::
1152
1153   FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
1154   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
1163   The build system applies the configurations from the ``defconfig``
1164   file before applying any subsequent configuration fragments. The
1165   final kernel configuration is a combination of the configurations in
1166   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.
1170
1171For more information on configuring the kernel, see the
1172":ref:`kernel-dev/common:changing the configuration`" section.
1173
1174Creating 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
1191   For more information about where the ``.config`` file is located, see the
1192   example in the
1193   ":ref:`kernel-dev/common:using \`\`menuconfig\`\``"
1194   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
1199multi-processor support within the kernel::
1200
1201   $ echo "CONFIG_SMP=y" >> my_smp.cfg
1202
1203.. note::
1204
1205   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.
1208
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
1216#. *Complete a Build Through Kernel Configuration:* Complete a build at
1217   least through the kernel configuration task as follows::
1218
1219      $ bitbake linux-yocto -c kernel_configme -f
1220
1221   This step ensures that you create a
1222   ``.config`` file from a known state. Because there are situations where
1223   your build state might become unknown, it is best to run this task
1224   prior to starting ``menuconfig``.
1225
1226#. *Launch menuconfig:* Run the ``menuconfig`` command::
1227
1228      $ bitbake linux-yocto -c menuconfig
1229
1230#. *Create the Configuration Fragment:* Run the ``diffconfig`` command
1231   to prepare a configuration fragment. The resulting file
1232   ``fragment.cfg`` is placed in the
1233   ``${``\ :term:`WORKDIR`\ ``}``
1234   directory::
1235
1236      $ bitbake linux-yocto -c diffconfig
1237
1238The ``diffconfig`` command creates a file that is a list of Linux kernel
1239``CONFIG_`` assignments. See the
1240":ref:`kernel-dev/common:changing the configuration`" section for additional
1241information 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
1246   BSP. See the ":ref:`kernel-dev/advanced:bsp descriptions`"
1247   section for more information.
1248
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
1259be picked up and applied when the kernel is built::
1260
1261   FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
1262   SRC_URI += "file://myconfig.cfg"
1263
1264As mentioned earlier, you can group related configurations into multiple
1265files and name them all in the :term:`SRC_URI` statement as well. For
1266example, you could group separate configurations specifically for
1267Ethernet and graphics into their own files and add those by using a
1268:term:`SRC_URI` statement like the following in your append file::
1269
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`
1279task to provide configuration validation::
1280
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.
1289See the ":ref:`kernel-dev/common:using \`\`menuconfig\`\``" section for
1290information on how to create a configuration file.
1291
1292Here is sample output from the :ref:`ref-tasks-kernel_configcheck` task:
1293
1294.. code-block:: none
1295
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
1362:ref:`kernel-dev/common:using \`\`menuconfig\`\`` section.
1363
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
1372As part of the kernel build process, the :ref:`ref-tasks-kernel_configcheck` task
1373runs. 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
1377-  Requested options that did not make it into the final ``.config`` file.
1378
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
1391   The :ref:`ref-tasks-kernel_configcheck` task can also optionally report if
1392   an option is overridden during processing.
1393
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
1401#. *Use a Working Configuration:* Start with a full configuration that
1402   you know works. Be sure the configuration builds and boots
1403   successfully. Use this configuration file as your baseline.
1404
1405#. *Run Configure and Check Tasks:* Separately run the
1406   :ref:`ref-tasks-kernel_configme` and :ref:`ref-tasks-kernel_configcheck` tasks::
1407
1408      $ bitbake linux-yocto -c kernel_configme -f
1409      $ bitbake linux-yocto -c kernel_configcheck -f
1410
1411#. *Process the Results:* Take the resulting list of files from the
1412   :ref:`ref-tasks-kernel_configcheck` task warnings and do the following:
1413
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
1424#. *Re-Run Configure and Check Tasks:* After you have worked through the
1425   output of the kernel configuration audit, you can re-run the
1426   :ref:`ref-tasks-kernel_configme` and :ref:`ref-tasks-kernel_configcheck` tasks to see the
1427   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
1438build. You can examine the values of variables by examining the
1439output of the ``bitbake -e`` command. The output is long and is more
1440easily managed in a text file, which allows for easy searches::
1441
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
1452"-dirty" at the end, it means there are uncommitted modifications in the kernel's
1453source directory. Follow these steps to clean up the version string:
1454
1455#. *Discover the Uncommitted Changes:* Go to the kernel's locally cloned
1456   Git repository (source directory) and use the following Git command
1457   to list the files that have been changed, added, or removed::
1458
1459      $ git status
1460
1461#. *Commit the Changes:* You should commit those changes to the kernel
1462   source tree regardless of whether or not you will save, export, or
1463   use the changes::
1464
1465      $ git add
1466      $ git commit -s -a -m "getting rid of -dirty"
1467
1468#. *Rebuild the Kernel Image:* Once you commit the changes, rebuild the
1469   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
1474   ":ref:`kernel-dev/common:using \`\`devtool\`\` to patch the kernel`"
1475   section. For
1476   information on building the kernel image when using BitBake, see the
1477   ":ref:`kernel-dev/common:using traditional kernel development to patch the kernel`"
1478   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
1494linux-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>`.
1499
1500Here are some basic steps you can use to work with your own sources:
1501
1502#. *Create a Copy of the Kernel Recipe:* Copy the
1503   ``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
1509#. *Create a Directory for Your Patches:* In the same directory inside
1510   your layer, create a matching directory to store your patches and
1511   configuration files (e.g. ``linux-yocto-myproject``).
1512
1513#. *Ensure You Have Configurations:* Make sure you have either a
1514   ``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
1517   the following::
1518
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.
1529   However, there is no guarantee that this configuration is valid for
1530   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
1538#. *Edit the Recipe:* Edit the following variables in your recipe as
1539   appropriate for your project:
1540
1541   -  :term:`SRC_URI`: The
1542      :term:`SRC_URI` should specify a Git repository that uses one of the
1543      supported Git fetcher protocols (i.e. ``file``, ``git``, ``http``,
1544      and so forth). The :term:`SRC_URI` variable should also specify either
1545      a ``defconfig`` file or some configuration fragment files. The
1546      skeleton recipe provides an example :term:`SRC_URI` as a syntax
1547      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
1564   -  :term:`PV`: The default :term:`PV`
1565      assignment is typically adequate. It combines the value of
1566      :term:`LINUX_VERSION` and the value ``+git`` which adds source control
1567      information to :term:`PKGV` later during the packaging phase.
1568
1569   -  :term:`COMPATIBLE_MACHINE`:
1570      A list of the machines supported by your new recipe. This variable
1571      in the example recipe is set by default to a regular expression
1572      that matches only the empty string, "(^$)". This default setting
1573      triggers an explicit build failure. You must change it to match a
1574      list of the machines that your new recipe supports. For example,
1575      to support the ``qemux86`` and ``qemux86-64`` machines, use the
1576      following form::
1577
1578         COMPATIBLE_MACHINE = "qemux86|qemux86-64"
1579
1580#. *Customize Your Recipe as Needed:* Provide further customizations to
1581   your recipe as needed just as you would customize an existing
1582   linux-yocto recipe. See the
1583   ":ref:`ref-manual/devtool-reference:modifying an existing recipe`" section
1584   for information.
1585
1586Working with Out-of-Tree Modules
1587================================
1588
1589This section describes steps to build out-of-tree modules on your target
1590and describes how to incorporate out-of-tree modules in the build.
1591
1592Building Out-of-Tree Modules on the Target
1593------------------------------------------
1594
1595While the traditional Yocto Project development model would be to
1596include kernel modules as part of the normal build process, you might
1597find it useful to build modules on the target. This could be the case if
1598your target system is capable and powerful enough to handle the
1599necessary compilation. Before deciding to build on your target, however,
1600you should consider the benefits of using a proper cross-development
1601environment from your build host.
1602
1603If you want to be able to build out-of-tree modules on the target, there
1604are some steps you need to take on the target that is running your SDK
1605image. Briefly, the ``kernel-dev`` package is installed by default on
1606all ``*.sdk`` images and the ``kernel-devsrc`` package is installed on
1607many of the ``*.sdk`` images. However, you need to create some scripts
1608prior to attempting to build the out-of-tree modules on the target that
1609is running that image.
1610
1611Prior to attempting to build the out-of-tree modules, you need to be on
1612the target as root and you need to change to the ``/usr/src/kernel``
1613directory. Next, ``make`` the scripts:
1614
1615.. code-block:: none
1616
1617   # cd /usr/src/kernel
1618   # make scripts
1619
1620Because all SDK image recipes include ``dev-pkgs``, the
1621``kernel-dev`` packages will be installed as part of the SDK image and
1622the ``kernel-devsrc`` packages will be installed as part of applicable
1623SDK images. The SDK uses the scripts when building out-of-tree modules.
1624Once you have switched to that directory and created the scripts, you
1625should be able to build your out-of-tree modules on the target.
1626
1627Incorporating Out-of-Tree Modules
1628---------------------------------
1629
1630While it is always preferable to work with sources integrated into the
1631Linux kernel sources, if you need an external kernel module, the
1632``hello-mod.bb`` recipe is available as a template from which you can
1633create your own out-of-tree Linux kernel module recipe.
1634
1635This template recipe is located in the ``poky`` Git repository of the
1636Yocto Project:
1637:yocto_git:`meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb
1638</poky/tree/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb>`.
1639
1640To get started, copy this recipe to your layer and give it a meaningful
1641name (e.g. ``mymodule_1.0.bb``). In the same directory, create a new
1642directory named ``files`` where you can store any source files, patches,
1643or other files necessary for building the module that do not come with
1644the sources. Finally, update the recipe as needed for the module.
1645Typically, you will need to set the following variables:
1646
1647-  :term:`DESCRIPTION`
1648
1649-  :term:`LICENSE* <LICENSE>`
1650
1651-  :term:`SRC_URI`
1652
1653-  :term:`PV`
1654
1655Depending on the build system used by the module sources, you might need
1656to make some adjustments. For example, a typical module ``Makefile``
1657looks much like the one provided with the ``hello-mod`` template::
1658
1659   obj-m := hello.o
1660
1661   SRC := $(shell pwd)
1662
1663   all:
1664        $(MAKE) -C $(KERNEL_SRC) M=$(SRC)
1665
1666   modules_install:
1667        $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
1668   ...
1669
1670The important point to note here is the :term:`KERNEL_SRC` variable. The
1671:ref:`ref-classes-module` class sets this variable and the :term:`KERNEL_PATH`
1672variable to ``${STAGING_KERNEL_DIR}`` with the necessary Linux kernel build
1673information to build modules. If your module ``Makefile`` uses a different
1674variable, you might want to override the :ref:`ref-tasks-compile` step, or
1675create a patch to the ``Makefile`` to work with the more typical
1676:term:`KERNEL_SRC` or :term:`KERNEL_PATH` variables.
1677
1678After you have prepared your recipe, you will likely want to include the
1679module in your images. To do this, see the documentation for the
1680following variables in the Yocto Project Reference Manual and set one of
1681them appropriately for your machine configuration file:
1682
1683-  :term:`MACHINE_ESSENTIAL_EXTRA_RDEPENDS`
1684
1685-  :term:`MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS`
1686
1687-  :term:`MACHINE_EXTRA_RDEPENDS`
1688
1689-  :term:`MACHINE_EXTRA_RRECOMMENDS`
1690
1691Modules are often not required for boot and can be excluded from certain
1692build configurations. The following allows for the most flexibility::
1693
1694   MACHINE_EXTRA_RRECOMMENDS += "kernel-module-mymodule"
1695
1696The value is
1697derived by appending the module filename without the ``.ko`` extension
1698to the string "kernel-module-".
1699
1700Because the variable is
1701:term:`RRECOMMENDS` and not a
1702:term:`RDEPENDS` variable, the build
1703will not fail if this module is not available to include in the image.
1704
1705Inspecting Changes and Commits
1706==============================
1707
1708A common question when working with a kernel is: "What changes have been
1709applied to this tree?" Rather than using "grep" across directories to
1710see what has changed, you can use Git to inspect or search the kernel
1711tree. Using Git is an efficient way to see what has changed in the tree.
1712
1713What Changed in a Kernel?
1714-------------------------
1715
1716Here are a few examples that show how to use Git commands to
1717examine changes. These examples are by no means the only way to see
1718changes.
1719
1720.. note::
1721
1722   In the following examples, unless you provide a commit range, ``kernel.org``
1723   history is blended with Yocto Project kernel changes. You can form
1724   ranges by using branch names from the kernel tree as the upper and
1725   lower commit markers with the Git commands. You can see the branch
1726   names through the web interface to the Yocto Project source
1727   repositories at :yocto_git:`/`.
1728
1729To see a full range of the changes, use the ``git whatchanged`` command
1730and specify a commit range for the branch (`commit`\ ``..``\ `commit`).
1731
1732Here is an example that looks at what has changed in the ``emenlow``
1733branch of the ``linux-yocto-3.19`` kernel. The lower commit range is the
1734commit associated with the ``standard/base`` branch, while the upper
1735commit range is the commit associated with the ``standard/emenlow``
1736branch::
1737
1738   $ git whatchanged origin/standard/base..origin/standard/emenlow
1739
1740To see short, one line summaries of changes use the ``git log`` command::
1741
1742   $ git log --oneline origin/standard/base..origin/standard/emenlow
1743
1744Use this command to see code differences for the changes::
1745
1746   $ git diff origin/standard/base..origin/standard/emenlow
1747
1748Use this command to see the commit log messages and the text
1749differences::
1750
1751   $ git show origin/standard/base..origin/standard/emenlow
1752
1753Use this command to create individual patches for each change. Here is
1754an example that creates patch files for each commit and places them
1755in your ``Documents`` directory::
1756
1757   $ git format-patch -o $HOME/Documents origin/standard/base..origin/standard/emenlow
1758
1759Showing a Particular Feature or Branch Change
1760---------------------------------------------
1761
1762Tags in the Yocto Project kernel tree divide changes for significant
1763features or branches. The ``git show`` tag command shows changes based
1764on a tag. Here is an example that shows ``systemtap`` changes::
1765
1766   $ git show systemtap
1767
1768You can use the ``git branch --contains`` tag command to
1769show the branches that contain a particular feature. This command shows
1770the branches that contain the ``systemtap`` feature::
1771
1772   $ git branch --contains systemtap
1773
1774Adding Recipe-Space Kernel Features
1775===================================
1776
1777You can add kernel features in the
1778:ref:`recipe-space <kernel-dev/advanced:recipe-space metadata>`
1779by using the :term:`KERNEL_FEATURES`
1780variable and by specifying the feature's ``.scc`` file path in the
1781:term:`SRC_URI` statement. When you
1782add features using this method, the OpenEmbedded build system checks to
1783be sure the features are present. If the features are not present, the
1784build stops. Kernel features are the last elements processed for
1785configuring and patching the kernel. Therefore, adding features in this
1786manner is a way to enforce specific features are present and enabled
1787without needing to do a full audit of any other layer's additions to the
1788:term:`SRC_URI` statement.
1789
1790You add a kernel feature by providing the feature as part of the
1791:term:`KERNEL_FEATURES` variable and by providing the path to the feature's
1792``.scc`` file, which is relative to the root of the kernel Metadata. The
1793OpenEmbedded build system searches all forms of kernel Metadata on the
1794:term:`SRC_URI` statement regardless of whether the Metadata is in the
1795"kernel-cache", system kernel Metadata, or a recipe-space Metadata (i.e.
1796part of the kernel recipe). See the
1797":ref:`kernel-dev/advanced:kernel metadata location`" section for
1798additional information.
1799
1800When you specify the feature's ``.scc`` file on the :term:`SRC_URI`
1801statement, the OpenEmbedded build system adds the directory of that
1802``.scc`` file along with all its subdirectories to the kernel feature
1803search path. Because subdirectories are searched, you can reference a
1804single ``.scc`` file in the :term:`SRC_URI` statement to reference multiple
1805kernel features.
1806
1807Consider the following example that adds the "test.scc" feature to the
1808build.
1809
1810#. *Create the Feature File:* Create a ``.scc`` file and locate it just
1811   as you would any other patch file, ``.cfg`` file, or fetcher item you
1812   specify in the :term:`SRC_URI` statement.
1813
1814   .. note::
1815
1816      -  You must add the directory of the ``.scc`` file to the
1817         fetcher's search path in the same manner as you would add a
1818         ``.patch`` file.
1819
1820      -  You can create additional ``.scc`` files beneath the directory
1821         that contains the file you are adding. All subdirectories are
1822         searched during the build as potential feature directories.
1823
1824   Continuing with the example, suppose the "test.scc" feature you are
1825   adding has a ``test.scc`` file in the following directory::
1826
1827      my_recipe
1828      |
1829      +-linux-yocto
1830         |
1831         +-test.cfg
1832         +-test.scc
1833
1834   In this example, the
1835   ``linux-yocto`` directory has both the feature ``test.scc`` file and
1836   a similarly named configuration fragment file ``test.cfg``.
1837
1838#. *Add the Feature File to SRC_URI:* Add the ``.scc`` file to the
1839   recipe's :term:`SRC_URI` statement::
1840
1841      SRC_URI += "file://test.scc"
1842
1843   The leading space before the path is important as the path is
1844   appended to the existing path.
1845
1846#. *Specify the Feature as a Kernel Feature:* Use the
1847   :term:`KERNEL_FEATURES` statement to specify the feature as a kernel
1848   feature::
1849
1850      KERNEL_FEATURES += "test.scc"
1851
1852   The OpenEmbedded build
1853   system processes the kernel feature when it builds the kernel.
1854
1855   .. note::
1856
1857      If other features are contained below "test.scc", then their
1858      directories are relative to the directory containing the ``test.scc``
1859      file.
1860