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