diff options
| author | Scott Rifenbark <srifenbark@gmail.com> | 2017-09-22 12:18:18 -0700 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-09-26 11:18:59 +0100 |
| commit | de671802c8de9311cc292456d69cafb7be128b0b (patch) | |
| tree | 99272375914e3bf041f044803d0a24d83b6d7624 /documentation | |
| parent | c1d3dbb5bdbea42c3f4b4706872bd2444e850c7c (diff) | |
| download | poky-de671802c8de9311cc292456d69cafb7be128b0b.tar.gz | |
dev-manual: Compatibility program and moving kernel configuration
Should have been two commits but I forgot to do them separately.
1. I updated the YP Compatible Program section.
2. I moved the "Configuring the Kernel" section from the dev-manual
to the kernel-dev manual.
(From yocto-docs rev: cdb5bbc917db55a2ca987ce9b9ed371f9fca6524)
Signed-off-by: Scott Rifenbark <srifenbark@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation')
| -rw-r--r-- | documentation/dev-manual/dev-manual-common-tasks.xml | 591 | ||||
| -rw-r--r-- | documentation/kernel-dev/kernel-dev-advanced.xml | 6 | ||||
| -rw-r--r-- | documentation/kernel-dev/kernel-dev-common.xml | 528 | ||||
| -rw-r--r-- | documentation/kernel-dev/kernel-dev-intro.xml | 2 | ||||
| -rw-r--r-- | documentation/ref-manual/ref-tasks.xml | 8 |
5 files changed, 592 insertions, 543 deletions
diff --git a/documentation/dev-manual/dev-manual-common-tasks.xml b/documentation/dev-manual/dev-manual-common-tasks.xml index 0c2e60f006..f82d37e1dc 100644 --- a/documentation/dev-manual/dev-manual-common-tasks.xml +++ b/documentation/dev-manual/dev-manual-common-tasks.xml | |||
| @@ -442,54 +442,65 @@ | |||
| 442 | existing Yocto Project layers (i.e. the layer is compatible | 442 | existing Yocto Project layers (i.e. the layer is compatible |
| 443 | with the Yocto Project). | 443 | with the Yocto Project). |
| 444 | Ensuring compatibility makes the layer easy to be consumed | 444 | Ensuring compatibility makes the layer easy to be consumed |
| 445 | by others in the Yocto Project community and allows you | 445 | by others in the Yocto Project community and could allow you |
| 446 | permission to use the Yocto Project Compatibility logo. | 446 | permission to use the Yocto Project Compatibility Logo. |
| 447 | </para> | 447 | <note> |
| 448 | 448 | Only Yocto Project member organizations are permitted to | |
| 449 | <para> | 449 | use the Yocto Project Compatibility Logo. |
| 450 | Version 1.0 of the Yocto Project Compatibility Program has | 450 | The logo is not available for general use. |
| 451 | been in existence for a number of releases. | 451 | For information on how to become a Yocto Project member |
| 452 | This version of the program consists of the layer application | 452 | organization, see the |
| 453 | process that requests permission to use the Yocto Project | 453 | <ulink url='&YOCTO_HOME_URL;/ecosystem/member-organizations'>Member Organizations</ulink> |
| 454 | Compatibility logo for your layer and application. | 454 | page of the Yocto Project website. |
| 455 | You can find version 1.0 of the form at | 455 | </note> |
| 456 | <ulink url='https://www.yoctoproject.org/webform/yocto-project-compatible-registration'></ulink>. | ||
| 457 | To be granted permission to use the logo, you need to be able | ||
| 458 | to answer "Yes" to the questions or have an acceptable | ||
| 459 | explanation for any questions answered "No". | ||
| 460 | </para> | 456 | </para> |
| 461 | 457 | ||
| 462 | <para> | 458 | <para> |
| 463 | A second version (2.0) of the Yocto Project Compatibility | 459 | The Yocto Project Compatibility Program consists of a layer |
| 464 | Program is currently under development. | 460 | application process that requests permission to use the Yocto |
| 465 | Included as part of version 2.0 (and currently available) is | 461 | Project Compatibility Logo for your layer and application. |
| 466 | the <filename>yocto-compat-layer.py</filename> script. | 462 | The process consists of two parts: |
| 467 | When run against a layer, this script tests the layer against | 463 | <orderedlist> |
| 468 | tighter constraints based on experiences of how layers have | 464 | <listitem><para> |
| 469 | worked in the real world and where pitfalls have been found. | 465 | Successfully passing a script |
| 466 | (<filename>yocto-compat-layer.py</filename>) that | ||
| 467 | when run against your layer, tests it against | ||
| 468 | constraints based on experiences of how layers have | ||
| 469 | worked in the real world and where pitfalls have been | ||
| 470 | found. | ||
| 471 | Getting a "PASS" result from the script is required for | ||
| 472 | successful compatibility registration. | ||
| 473 | </para></listitem> | ||
| 474 | <listitem><para> | ||
| 475 | Completion of an application acceptance form, which | ||
| 476 | you can find at | ||
| 477 | <ulink url='https://www.yoctoproject.org/webform/yocto-project-compatible-registration'></ulink>. | ||
| 478 | </para></listitem> | ||
| 479 | </orderedlist> | ||
| 470 | </para> | 480 | </para> |
| 471 | 481 | ||
| 472 | <para> | 482 | <para> |
| 473 | Part of the 2.0 version of the program that is not currently | 483 | To be granted permission to use the logo, you need to satisfy |
| 474 | available but is in development is an updated compatibility | 484 | the following: |
| 475 | application form. | 485 | <itemizedlist> |
| 476 | This updated form, among other questions, specifically | 486 | <listitem><para> |
| 477 | asks if your layer has passed the test using the | 487 | Be able to check the box indicating that you |
| 478 | <filename>yocto-compat-layer.py</filename> script. | 488 | got a "PASS" when running the script against your |
| 479 | <note><title>Tip</title> | 489 | layer. |
| 480 | Even though the updated application form is currently | 490 | </para></listitem> |
| 481 | unavailable for version 2.0 of the Yocto Project | 491 | <listitem><para> |
| 482 | Compatibility Program, the | 492 | Answer "Yes" to the questions on the form or have an |
| 483 | <filename>yocto-compat-layer.py</filename> script is | 493 | acceptable explanation for any questions answered "No". |
| 484 | available in OE-Core. | 494 | </para></listitem> |
| 485 | You can use the script to assess the status of your | 495 | <listitem><para> |
| 486 | layers in advance of the 2.0 release of the program. | 496 | You need to be a Yocto Project Member Organization. |
| 487 | </note> | 497 | </para></listitem> |
| 498 | </itemizedlist> | ||
| 488 | </para> | 499 | </para> |
| 489 | 500 | ||
| 490 | <para> | 501 | <para> |
| 491 | The remainder of this section presents information on the | 502 | The remainder of this section presents information on the |
| 492 | version 1.0 registration form and on the | 503 | registration form and on the |
| 493 | <filename>yocto-compat-layer.py</filename> script. | 504 | <filename>yocto-compat-layer.py</filename> script. |
| 494 | </para> | 505 | </para> |
| 495 | 506 | ||
| @@ -497,10 +508,10 @@ | |||
| 497 | <title>Yocto Project Compatibility Program Application</title> | 508 | <title>Yocto Project Compatibility Program Application</title> |
| 498 | 509 | ||
| 499 | <para> | 510 | <para> |
| 500 | Use the 1.0 version of the form to apply for your | 511 | Use the form to apply for your layer's compatibility |
| 501 | layer's compatibility approval. | 512 | approval. |
| 502 | Upon successful application, you can use the Yocto | 513 | Upon successful application, you can use the Yocto |
| 503 | Project Compatibility logo with your layer and the | 514 | Project Compatibility Logo with your layer and the |
| 504 | application that uses your layer. | 515 | application that uses your layer. |
| 505 | </para> | 516 | </para> |
| 506 | 517 | ||
| @@ -542,22 +553,14 @@ | |||
| 542 | <title><filename>yocto-compat-layer.py</filename> Script</title> | 553 | <title><filename>yocto-compat-layer.py</filename> Script</title> |
| 543 | 554 | ||
| 544 | <para> | 555 | <para> |
| 545 | The <filename>yocto-compat-layer.py</filename> script, | 556 | The <filename>yocto-compat-layer.py</filename> script |
| 546 | which is currently available, provides you a way to | 557 | provides you a way to assess how compatible your layer is |
| 547 | assess how compatible your layer is with the Yocto | 558 | with the Yocto Project. |
| 548 | Project. | ||
| 549 | You should run this script prior to using the form to | 559 | You should run this script prior to using the form to |
| 550 | apply for compatibility as described in the previous | 560 | apply for compatibility as described in the previous |
| 551 | section. | 561 | section. |
| 552 | <note> | 562 | You need to achieve a "PASS" result in order to have |
| 553 | Because the script is part of the 2.0 release of the | 563 | your application form successfully processed. |
| 554 | Yocto Project Compatibility Program, you are not | ||
| 555 | required to successfully run your layer against it | ||
| 556 | in order to be granted compatibility status. | ||
| 557 | However, it is a good idea as it promotes | ||
| 558 | well-behaved layers and gives you an idea of where your | ||
| 559 | layer stands regarding compatibility. | ||
| 560 | </note> | ||
| 561 | </para> | 564 | </para> |
| 562 | 565 | ||
| 563 | <para> | 566 | <para> |
| @@ -6142,479 +6145,6 @@ Some notes from Cal: | |||
| 6142 | </para> | 6145 | </para> |
| 6143 | </section> | 6146 | </section> |
| 6144 | 6147 | ||
| 6145 | <section id='configuring-the-kernel'> | ||
| 6146 | <title>Configuring the Kernel</title> | ||
| 6147 | |||
| 6148 | <para> | ||
| 6149 | Configuring the Yocto Project kernel consists of making sure the | ||
| 6150 | <filename>.config</filename> file has all the right information | ||
| 6151 | in it for the image you are building. | ||
| 6152 | You can use the <filename>menuconfig</filename> tool and | ||
| 6153 | configuration fragments to make sure your | ||
| 6154 | <filename>.config</filename> file is just how you need it. | ||
| 6155 | You can also save known configurations in a | ||
| 6156 | <filename>defconfig</filename> file that the build system can use | ||
| 6157 | for kernel configuration. | ||
| 6158 | </para> | ||
| 6159 | |||
| 6160 | <para> | ||
| 6161 | This section describes how to use <filename>menuconfig</filename>, | ||
| 6162 | create and use configuration fragments, and how to interactively | ||
| 6163 | modify your <filename>.config</filename> file to create the | ||
| 6164 | leanest kernel configuration file possible. | ||
| 6165 | </para> | ||
| 6166 | |||
| 6167 | <para> | ||
| 6168 | For more information on kernel configuration, see the | ||
| 6169 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#changing-the-configuration'>Changing the Configuration</ulink>" | ||
| 6170 | section in the Yocto Project Linux Kernel Development Manual. | ||
| 6171 | </para> | ||
| 6172 | |||
| 6173 | <section id='using-menuconfig'> | ||
| 6174 | <title>Using <filename>menuconfig</filename></title> | ||
| 6175 | |||
| 6176 | <para> | ||
| 6177 | The easiest way to define kernel configurations is to set them through the | ||
| 6178 | <filename>menuconfig</filename> tool. | ||
| 6179 | This tool provides an interactive method with which | ||
| 6180 | to set kernel configurations. | ||
| 6181 | For general information on <filename>menuconfig</filename>, see | ||
| 6182 | <ulink url='http://en.wikipedia.org/wiki/Menuconfig'></ulink>. | ||
| 6183 | </para> | ||
| 6184 | |||
| 6185 | <para> | ||
| 6186 | To use the <filename>menuconfig</filename> tool in the Yocto Project development | ||
| 6187 | environment, you must launch it using BitBake. | ||
| 6188 | Thus, the environment must be set up using the | ||
| 6189 | <ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>&OE_INIT_FILE;</filename></ulink> | ||
| 6190 | script found in the | ||
| 6191 | <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>. | ||
| 6192 | You must also be sure of the state of your build in the | ||
| 6193 | <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>. | ||
| 6194 | The following commands run <filename>menuconfig</filename> | ||
| 6195 | assuming the Source Directory's top-level folder is | ||
| 6196 | <filename>~/poky</filename>: | ||
| 6197 | <literallayout class='monospaced'> | ||
| 6198 | $ cd poky | ||
| 6199 | $ source oe-init-build-env | ||
| 6200 | $ bitbake linux-yocto -c kernel_configme -f | ||
| 6201 | $ bitbake linux-yocto -c menuconfig | ||
| 6202 | </literallayout> | ||
| 6203 | Once <filename>menuconfig</filename> comes up, its standard | ||
| 6204 | interface allows you to interactively examine and configure | ||
| 6205 | all the kernel configuration parameters. | ||
| 6206 | After making your changes, simply exit the tool and save your | ||
| 6207 | changes to create an updated version of the | ||
| 6208 | <filename>.config</filename> configuration file. | ||
| 6209 | </para> | ||
| 6210 | |||
| 6211 | <para> | ||
| 6212 | Consider an example that configures the <filename>linux-yocto-3.14</filename> | ||
| 6213 | kernel. | ||
| 6214 | The OpenEmbedded build system recognizes this kernel as | ||
| 6215 | <filename>linux-yocto</filename>. | ||
| 6216 | Thus, the following commands from the shell in which you previously sourced the | ||
| 6217 | environment initialization script cleans the shared state cache and the | ||
| 6218 | <ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink> | ||
| 6219 | directory and then runs <filename>menuconfig</filename>: | ||
| 6220 | <literallayout class='monospaced'> | ||
| 6221 | $ bitbake linux-yocto -c menuconfig | ||
| 6222 | </literallayout> | ||
| 6223 | </para> | ||
| 6224 | |||
| 6225 | <para> | ||
| 6226 | Once <filename>menuconfig</filename> launches, use the interface | ||
| 6227 | to navigate through the selections to find the configuration settings in | ||
| 6228 | which you are interested. | ||
| 6229 | For example, consider the <filename>CONFIG_SMP</filename> configuration setting. | ||
| 6230 | You can find it at <filename>Processor Type and Features</filename> under | ||
| 6231 | the configuration selection <filename>Symmetric Multi-processing Support</filename>. | ||
| 6232 | After highlighting the selection, use the arrow keys to select or deselect | ||
| 6233 | the setting. | ||
| 6234 | When you are finished with all your selections, exit out and save them. | ||
| 6235 | </para> | ||
| 6236 | |||
| 6237 | <para> | ||
| 6238 | Saving the selections updates the <filename>.config</filename> configuration file. | ||
| 6239 | This is the file that the OpenEmbedded build system uses to configure the | ||
| 6240 | kernel during the build. | ||
| 6241 | You can find and examine this file in the Build Directory in | ||
| 6242 | <filename>tmp/work/</filename>. | ||
| 6243 | The actual <filename>.config</filename> is located in the area where the | ||
| 6244 | specific kernel is built. | ||
| 6245 | For example, if you were building a Linux Yocto kernel based on the | ||
| 6246 | Linux 3.14 kernel and you were building a QEMU image targeted for | ||
| 6247 | <filename>x86</filename> architecture, the | ||
| 6248 | <filename>.config</filename> file would be located here: | ||
| 6249 | <literallayout class='monospaced'> | ||
| 6250 | poky/build/tmp/work/qemux86-poky-linux/linux-yocto-3.14.11+git1+84f... | ||
| 6251 | ...656ed30-r1/linux-qemux86-standard-build | ||
| 6252 | </literallayout> | ||
| 6253 | <note> | ||
| 6254 | The previous example directory is artificially split and many of the characters | ||
| 6255 | in the actual filename are omitted in order to make it more readable. | ||
| 6256 | Also, depending on the kernel you are using, the exact pathname | ||
| 6257 | for <filename>linux-yocto-3.14...</filename> might differ. | ||
| 6258 | </note> | ||
| 6259 | </para> | ||
| 6260 | |||
| 6261 | <para> | ||
| 6262 | Within the <filename>.config</filename> file, you can see the kernel settings. | ||
| 6263 | For example, the following entry shows that symmetric multi-processor support | ||
| 6264 | is not set: | ||
| 6265 | <literallayout class='monospaced'> | ||
| 6266 | # CONFIG_SMP is not set | ||
| 6267 | </literallayout> | ||
| 6268 | </para> | ||
| 6269 | |||
| 6270 | <para> | ||
| 6271 | A good method to isolate changed configurations is to use a combination of the | ||
| 6272 | <filename>menuconfig</filename> tool and simple shell commands. | ||
| 6273 | Before changing configurations with <filename>menuconfig</filename>, copy the | ||
| 6274 | existing <filename>.config</filename> and rename it to something else, | ||
| 6275 | use <filename>menuconfig</filename> to make | ||
| 6276 | as many changes as you want and save them, then compare the renamed configuration | ||
| 6277 | file against the newly created file. | ||
| 6278 | You can use the resulting differences as your base to create configuration fragments | ||
| 6279 | to permanently save in your kernel layer. | ||
| 6280 | <note> | ||
| 6281 | Be sure to make a copy of the <filename>.config</filename> and don't just | ||
| 6282 | rename it. | ||
| 6283 | The build system needs an existing <filename>.config</filename> | ||
| 6284 | from which to work. | ||
| 6285 | </note> | ||
| 6286 | </para> | ||
| 6287 | </section> | ||
| 6288 | |||
| 6289 | <section id='creating-a-defconfig-file'> | ||
| 6290 | <title>Creating a <filename>defconfig</filename> File</title> | ||
| 6291 | |||
| 6292 | <para> | ||
| 6293 | A <filename>defconfig</filename> file is simply a | ||
| 6294 | <filename>.config</filename> renamed to "defconfig". | ||
| 6295 | You can use a <filename>defconfig</filename> file | ||
| 6296 | to retain a known set of kernel configurations from which the | ||
| 6297 | OpenEmbedded build system can draw to create the final | ||
| 6298 | <filename>.config</filename> file. | ||
| 6299 | <note> | ||
| 6300 | Out-of-the-box, the Yocto Project never ships a | ||
| 6301 | <filename>defconfig</filename> or | ||
| 6302 | <filename>.config</filename> file. | ||
| 6303 | The OpenEmbedded build system creates the final | ||
| 6304 | <filename>.config</filename> file used to configure the | ||
| 6305 | kernel. | ||
| 6306 | </note> | ||
| 6307 | </para> | ||
| 6308 | |||
| 6309 | <para> | ||
| 6310 | To create a <filename>defconfig</filename>, start with a | ||
| 6311 | complete, working Linux kernel <filename>.config</filename> | ||
| 6312 | file. | ||
| 6313 | Copy that file to the appropriate | ||
| 6314 | <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink><filename>}</filename> | ||
| 6315 | directory in your layer's | ||
| 6316 | <filename>recipes-kernel/linux</filename> directory, and rename | ||
| 6317 | the copied file to "defconfig". | ||
| 6318 | Then, add the following lines to the linux-yocto | ||
| 6319 | <filename>.bbappend</filename> file in your layer: | ||
| 6320 | <literallayout class='monospaced'> | ||
| 6321 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" | ||
| 6322 | SRC_URI += "file://defconfig" | ||
| 6323 | </literallayout> | ||
| 6324 | The | ||
| 6325 | <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> | ||
| 6326 | tells the build system how to search for the file, while the | ||
| 6327 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> | ||
| 6328 | extends the | ||
| 6329 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> | ||
| 6330 | variable (search directories) to include the | ||
| 6331 | <filename>${PN}</filename> directory you created to hold the | ||
| 6332 | configuration changes. | ||
| 6333 | <note> | ||
| 6334 | The build system applies the configurations from the | ||
| 6335 | <filename>defconfig</filename> file before applying any | ||
| 6336 | subsequent configuration fragments. | ||
| 6337 | The final kernel configuration is a combination of the | ||
| 6338 | configurations in the <filename>defconfig</filename> | ||
| 6339 | file and any configuration fragments you provide. | ||
| 6340 | You need to realize that if you have any configuration | ||
| 6341 | fragments, the build system applies these on top of and | ||
| 6342 | after applying the existing defconfig file configurations. | ||
| 6343 | </note> | ||
| 6344 | For more information on configuring the kernel, see the | ||
| 6345 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#changing-the-configuration'>Changing the Configuration</ulink>" | ||
| 6346 | and | ||
| 6347 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#generating-configuration-files'>Generating Configuration Files</ulink>" | ||
| 6348 | sections, both in the Yocto Project Linux Kernel Development | ||
| 6349 | Manual. | ||
| 6350 | </para> | ||
| 6351 | </section> | ||
| 6352 | |||
| 6353 | <section id='creating-config-fragments'> | ||
| 6354 | <title>Creating Configuration Fragments</title> | ||
| 6355 | |||
| 6356 | <para> | ||
| 6357 | Configuration fragments are simply kernel options that appear in a file | ||
| 6358 | placed where the OpenEmbedded build system can find and apply them. | ||
| 6359 | Syntactically, the configuration statement is identical to what would appear | ||
| 6360 | in the <filename>.config</filename> file, which is in the | ||
| 6361 | <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>: | ||
| 6362 | <literallayout class='monospaced'> | ||
| 6363 | tmp/work/<replaceable>arch</replaceable>-poky-linux/linux-yocto-<replaceable>release_specific_string</replaceable>/linux-<replaceable>arch</replaceable>-<replaceable>build_type</replaceable> | ||
| 6364 | </literallayout> | ||
| 6365 | </para> | ||
| 6366 | |||
| 6367 | <para> | ||
| 6368 | It is simple to create a configuration fragment. | ||
| 6369 | For example, issuing the following from the shell creates a configuration fragment | ||
| 6370 | file named <filename>my_smp.cfg</filename> that enables multi-processor support | ||
| 6371 | within the kernel: | ||
| 6372 | <literallayout class='monospaced'> | ||
| 6373 | $ echo "CONFIG_SMP=y" >> my_smp.cfg | ||
| 6374 | </literallayout> | ||
| 6375 | <note> | ||
| 6376 | All configuration fragment files must use the | ||
| 6377 | <filename>.cfg</filename> extension in order for the | ||
| 6378 | OpenEmbedded build system to recognize them as a | ||
| 6379 | configuration fragment. | ||
| 6380 | </note> | ||
| 6381 | </para> | ||
| 6382 | |||
| 6383 | <para> | ||
| 6384 | Where do you put your configuration fragment files? | ||
| 6385 | You can place these files in the same area pointed to by | ||
| 6386 | <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>. | ||
| 6387 | The OpenEmbedded build system picks up the configuration and | ||
| 6388 | adds it to the kernel's configuration. | ||
| 6389 | For example, suppose you had a set of configuration options | ||
| 6390 | in a file called <filename>myconfig.cfg</filename>. | ||
| 6391 | If you put that file inside a directory named | ||
| 6392 | <filename>linux-yocto</filename> that resides in the same | ||
| 6393 | directory as the kernel's append file and then add a | ||
| 6394 | <filename>SRC_URI</filename> statement such as the following | ||
| 6395 | to the kernel's append file, those configuration options | ||
| 6396 | will be picked up and applied when the kernel is built. | ||
| 6397 | <literallayout class='monospaced'> | ||
| 6398 | SRC_URI += "file://myconfig.cfg" | ||
| 6399 | </literallayout> | ||
| 6400 | </para> | ||
| 6401 | |||
| 6402 | <para> | ||
| 6403 | As mentioned earlier, you can group related configurations into multiple files and | ||
| 6404 | name them all in the <filename>SRC_URI</filename> statement as well. | ||
| 6405 | For example, you could group separate configurations specifically for Ethernet and graphics | ||
| 6406 | into their own files and add those by using a <filename>SRC_URI</filename> statement like the | ||
| 6407 | following in your append file: | ||
| 6408 | <literallayout class='monospaced'> | ||
| 6409 | SRC_URI += "file://myconfig.cfg \ | ||
| 6410 | file://eth.cfg \ | ||
| 6411 | file://gfx.cfg" | ||
| 6412 | </literallayout> | ||
| 6413 | </para> | ||
| 6414 | </section> | ||
| 6415 | |||
| 6416 | <section id='fine-tuning-the-kernel-configuration-file'> | ||
| 6417 | <title>Fine-Tuning the Kernel Configuration File</title> | ||
| 6418 | |||
| 6419 | <para> | ||
| 6420 | You can make sure the <filename>.config</filename> file is as lean or efficient as | ||
| 6421 | possible by reading the output of the kernel configuration fragment audit, | ||
| 6422 | noting any issues, making changes to correct the issues, and then repeating. | ||
| 6423 | </para> | ||
| 6424 | |||
| 6425 | <para> | ||
| 6426 | As part of the kernel build process, the | ||
| 6427 | <filename>do_kernel_configcheck</filename> task runs. | ||
| 6428 | This task validates the kernel configuration by checking the final | ||
| 6429 | <filename>.config</filename> file against the input files. | ||
| 6430 | During the check, the task produces warning messages for the following | ||
| 6431 | issues: | ||
| 6432 | <itemizedlist> | ||
| 6433 | <listitem><para>Requested options that did not make the final | ||
| 6434 | <filename>.config</filename> file.</para></listitem> | ||
| 6435 | <listitem><para>Configuration items that appear twice in the same | ||
| 6436 | configuration fragment.</para></listitem> | ||
| 6437 | <listitem><para>Configuration items tagged as "required" that were overridden. | ||
| 6438 | </para></listitem> | ||
| 6439 | <listitem><para>A board overrides a non-board specific option.</para></listitem> | ||
| 6440 | <listitem><para>Listed options not valid for the kernel being processed. | ||
| 6441 | In other words, the option does not appear anywhere.</para></listitem> | ||
| 6442 | </itemizedlist> | ||
| 6443 | <note> | ||
| 6444 | The <filename>do_kernel_configcheck</filename> task can | ||
| 6445 | also optionally report if an option is overridden during | ||
| 6446 | processing. | ||
| 6447 | </note> | ||
| 6448 | </para> | ||
| 6449 | |||
| 6450 | <para> | ||
| 6451 | For each output warning, a message points to the file | ||
| 6452 | that contains a list of the options and a pointer to the | ||
| 6453 | configuration fragment that defines them. | ||
| 6454 | Collectively, the files are the key to streamlining the | ||
| 6455 | configuration. | ||
| 6456 | </para> | ||
| 6457 | |||
| 6458 | <para> | ||
| 6459 | To streamline the configuration, do the following: | ||
| 6460 | <orderedlist> | ||
| 6461 | <listitem><para>Start with a full configuration that you | ||
| 6462 | know works - it builds and boots successfully. | ||
| 6463 | This configuration file will be your baseline. | ||
| 6464 | </para></listitem> | ||
| 6465 | <listitem><para>Separately run the | ||
| 6466 | <filename>do_kernel_configme</filename> and | ||
| 6467 | <filename>do_kernel_configcheck</filename> tasks. | ||
| 6468 | </para></listitem> | ||
| 6469 | <listitem><para>Take the resulting list of files from the | ||
| 6470 | <filename>do_kernel_configcheck</filename> task | ||
| 6471 | warnings and do the following: | ||
| 6472 | <itemizedlist> | ||
| 6473 | <listitem><para> | ||
| 6474 | Drop values that are redefined in the fragment | ||
| 6475 | but do not change the final | ||
| 6476 | <filename>.config</filename> file. | ||
| 6477 | </para></listitem> | ||
| 6478 | <listitem><para> | ||
| 6479 | Analyze and potentially drop values from the | ||
| 6480 | <filename>.config</filename> file that override | ||
| 6481 | required configurations. | ||
| 6482 | </para></listitem> | ||
| 6483 | <listitem><para> | ||
| 6484 | Analyze and potentially remove non-board | ||
| 6485 | specific options. | ||
| 6486 | </para></listitem> | ||
| 6487 | <listitem><para> | ||
| 6488 | Remove repeated and invalid options. | ||
| 6489 | </para></listitem> | ||
| 6490 | </itemizedlist></para></listitem> | ||
| 6491 | <listitem><para> | ||
| 6492 | After you have worked through the output of the kernel | ||
| 6493 | configuration audit, you can re-run the | ||
| 6494 | <filename>do_kernel_configme</filename> and | ||
| 6495 | <filename>do_kernel_configcheck</filename> tasks to | ||
| 6496 | see the results of your changes. | ||
| 6497 | If you have more issues, you can deal with them as | ||
| 6498 | described in the previous step. | ||
| 6499 | </para></listitem> | ||
| 6500 | </orderedlist> | ||
| 6501 | </para> | ||
| 6502 | |||
| 6503 | <para> | ||
| 6504 | Iteratively working through steps two through four eventually yields | ||
| 6505 | a minimal, streamlined configuration file. | ||
| 6506 | Once you have the best <filename>.config</filename>, you can build the Linux | ||
| 6507 | Yocto kernel. | ||
| 6508 | </para> | ||
| 6509 | </section> | ||
| 6510 | |||
| 6511 | <section id='determining-hardware-and-non-hardware-features-for-the-kernel-configuration-audit-phase'> | ||
| 6512 | <title>Determining Hardware and Non-Hardware Features for the Kernel Configuration Audit Phase</title> | ||
| 6513 | |||
| 6514 | <para> | ||
| 6515 | This section describes part of the kernel configuration audit | ||
| 6516 | phase that most developers can ignore. | ||
| 6517 | During this part of the audit phase, the contents of the final | ||
| 6518 | <filename>.config</filename> file are compared against the | ||
| 6519 | fragments specified by the system. | ||
| 6520 | These fragments can be system fragments, distro fragments, | ||
| 6521 | or user specified configuration elements. | ||
| 6522 | Regardless of their origin, the OpenEmbedded build system | ||
| 6523 | warns the user if a specific option is not included in the | ||
| 6524 | final kernel configuration. | ||
| 6525 | </para> | ||
| 6526 | |||
| 6527 | <para> | ||
| 6528 | In order to not overwhelm the user with configuration warnings, | ||
| 6529 | by default the system only reports on missing "hardware" | ||
| 6530 | options because a missing hardware option could mean a boot | ||
| 6531 | failure or that important hardware is not available. | ||
| 6532 | </para> | ||
| 6533 | |||
| 6534 | <para> | ||
| 6535 | To determine whether or not a given option is "hardware" or | ||
| 6536 | "non-hardware", the kernel Metadata contains files that | ||
| 6537 | classify individual or groups of options as either hardware | ||
| 6538 | or non-hardware. | ||
| 6539 | To better show this, consider a situation where the | ||
| 6540 | Yocto Project kernel cache contains the following files: | ||
| 6541 | <literallayout class='monospaced'> | ||
| 6542 | kernel-cache/features/drm-psb/hardware.cfg | ||
| 6543 | kernel-cache/features/kgdb/hardware.cfg | ||
| 6544 | kernel-cache/ktypes/base/hardware.cfg | ||
| 6545 | kernel-cache/bsp/mti-malta32/hardware.cfg | ||
| 6546 | kernel-cache/bsp/fsl-mpc8315e-rdb/hardware.cfg | ||
| 6547 | kernel-cache/bsp/qemu-ppc32/hardware.cfg | ||
| 6548 | kernel-cache/bsp/qemuarma9/hardware.cfg | ||
| 6549 | kernel-cache/bsp/mti-malta64/hardware.cfg | ||
| 6550 | kernel-cache/bsp/arm-versatile-926ejs/hardware.cfg | ||
| 6551 | kernel-cache/bsp/common-pc/hardware.cfg | ||
| 6552 | kernel-cache/bsp/common-pc-64/hardware.cfg | ||
| 6553 | kernel-cache/features/rfkill/non-hardware.cfg | ||
| 6554 | kernel-cache/ktypes/base/non-hardware.cfg | ||
| 6555 | kernel-cache/features/aufs/non-hardware.kcf | ||
| 6556 | kernel-cache/features/ocf/non-hardware.kcf | ||
| 6557 | kernel-cache/ktypes/base/non-hardware.kcf | ||
| 6558 | kernel-cache/ktypes/base/hardware.kcf | ||
| 6559 | kernel-cache/bsp/qemu-ppc32/hardware.kcf | ||
| 6560 | </literallayout> | ||
| 6561 | The following list provides explanations for the various | ||
| 6562 | files: | ||
| 6563 | <itemizedlist> | ||
| 6564 | <listitem><para><filename>hardware.kcf</filename>: | ||
| 6565 | Specifies a list of kernel Kconfig files that contain | ||
| 6566 | hardware options only. | ||
| 6567 | </para></listitem> | ||
| 6568 | <listitem><para><filename>non-hardware.kcf</filename>: | ||
| 6569 | Specifies a list of kernel Kconfig files that contain | ||
| 6570 | non-hardware options only. | ||
| 6571 | </para></listitem> | ||
| 6572 | <listitem><para><filename>hardware.cfg</filename>: | ||
| 6573 | Specifies a list of kernel | ||
| 6574 | <filename>CONFIG_</filename> options that are hardware, | ||
| 6575 | regardless of whether or not they are within a Kconfig | ||
| 6576 | file specified by a hardware or non-hardware | ||
| 6577 | Kconfig file (i.e. <filename>hardware.kcf</filename> or | ||
| 6578 | <filename>non-hardware.kcf</filename>). | ||
| 6579 | </para></listitem> | ||
| 6580 | <listitem><para><filename>non-hardware.cfg</filename>: | ||
| 6581 | Specifies a list of kernel | ||
| 6582 | <filename>CONFIG_</filename> options that are | ||
| 6583 | not hardware, regardless of whether or not they are | ||
| 6584 | within a Kconfig file specified by a hardware or | ||
| 6585 | non-hardware Kconfig file (i.e. | ||
| 6586 | <filename>hardware.kcf</filename> or | ||
| 6587 | <filename>non-hardware.kcf</filename>). | ||
| 6588 | </para></listitem> | ||
| 6589 | </itemizedlist> | ||
| 6590 | Here is a specific example using the | ||
| 6591 | <filename>kernel-cache/bsp/mti-malta32/hardware.cfg</filename>: | ||
| 6592 | <literallayout class='monospaced'> | ||
| 6593 | CONFIG_SERIAL_8250 | ||
| 6594 | CONFIG_SERIAL_8250_CONSOLE | ||
| 6595 | CONFIG_SERIAL_8250_NR_UARTS | ||
| 6596 | CONFIG_SERIAL_8250_PCI | ||
| 6597 | CONFIG_SERIAL_CORE | ||
| 6598 | CONFIG_SERIAL_CORE_CONSOLE | ||
| 6599 | CONFIG_VGA_ARB | ||
| 6600 | </literallayout> | ||
| 6601 | The kernel configuration audit automatically detects these | ||
| 6602 | files (hence the names must be exactly the ones discussed here), | ||
| 6603 | and uses them as inputs when generating warnings about the | ||
| 6604 | final <filename>.config</filename> file. | ||
| 6605 | </para> | ||
| 6606 | |||
| 6607 | <para> | ||
| 6608 | A user-specified kernel Metadata repository, or recipe space | ||
| 6609 | feature, can use these same files to classify options that are | ||
| 6610 | found within its <filename>.cfg</filename> files as hardware | ||
| 6611 | or non-hardware, to prevent the OpenEmbedded build system from | ||
| 6612 | producing an error or warning when an option is not in the | ||
| 6613 | final <filename>.config</filename> file. | ||
| 6614 | </para> | ||
| 6615 | </section> | ||
| 6616 | </section> | ||
| 6617 | |||
| 6618 | <section id='making-images-more-secure'> | 6148 | <section id='making-images-more-secure'> |
| 6619 | <title>Making Images More Secure</title> | 6149 | <title>Making Images More Secure</title> |
| 6620 | 6150 | ||
| @@ -7243,8 +6773,11 @@ Some notes from Cal: | |||
| 7243 | see the | 6773 | see the |
| 7244 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#generating-configuration-files'>Generating Configuration Files</ulink>" | 6774 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#generating-configuration-files'>Generating Configuration Files</ulink>" |
| 7245 | section of the Yocto Project Linux Kernel Development | 6775 | section of the Yocto Project Linux Kernel Development |
| 7246 | Manual and the "<link linkend='creating-config-fragments'>Creating Configuration Fragments</link>" | 6776 | Manual and the |
| 7247 | section, which is in this manual.</para></listitem> | 6777 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#creating-config-fragments'>Creating Configuration Fragments</ulink>" |
| 6778 | section in the Yocto Project Linux Kernel Development | ||
| 6779 | Manual. | ||
| 6780 | </para></listitem> | ||
| 7248 | <listitem><para><filename>bitbake -u taskexp -g <replaceable>bitbake_target</replaceable></filename>: | 6781 | <listitem><para><filename>bitbake -u taskexp -g <replaceable>bitbake_target</replaceable></filename>: |
| 7249 | Using the BitBake command with these options brings up | 6782 | Using the BitBake command with these options brings up |
| 7250 | a Dependency Explorer from which you can view file | 6783 | a Dependency Explorer from which you can view file |
diff --git a/documentation/kernel-dev/kernel-dev-advanced.xml b/documentation/kernel-dev/kernel-dev-advanced.xml index 0394e08444..a6f01a8e2a 100644 --- a/documentation/kernel-dev/kernel-dev-advanced.xml +++ b/documentation/kernel-dev/kernel-dev-advanced.xml | |||
| @@ -318,10 +318,10 @@ | |||
| 318 | CONFIG_NR_CPUS=64 | 318 | CONFIG_NR_CPUS=64 |
| 319 | </literallayout> | 319 | </literallayout> |
| 320 | You can find information on configuration fragment files in the | 320 | You can find information on configuration fragment files in the |
| 321 | "<ulink url='&YOCTO_DOCS_DEV_URL;#creating-config-fragments'>Creating Configuration Fragments</ulink>" | 321 | "<link linkend='creating-config-fragments'>Creating Configuration Fragments</link>" |
| 322 | section of the Yocto Project Development Manual and in | 322 | section and in |
| 323 | the "<link linkend='generating-configuration-files'>Generating Configuration Files</link>" | 323 | the "<link linkend='generating-configuration-files'>Generating Configuration Files</link>" |
| 324 | section earlier in this manual. | 324 | section. |
| 325 | </para> | 325 | </para> |
| 326 | 326 | ||
| 327 | <para> | 327 | <para> |
diff --git a/documentation/kernel-dev/kernel-dev-common.xml b/documentation/kernel-dev/kernel-dev-common.xml index 28bedd1785..7f61b434cd 100644 --- a/documentation/kernel-dev/kernel-dev-common.xml +++ b/documentation/kernel-dev/kernel-dev-common.xml | |||
| @@ -900,8 +900,8 @@ | |||
| 900 | <para> | 900 | <para> |
| 901 | For a detailed example showing how to configure the kernel, | 901 | For a detailed example showing how to configure the kernel, |
| 902 | see the | 902 | see the |
| 903 | "<ulink url='&YOCTO_DOCS_DEV_URL;#configuring-the-kernel'>Configuring the Kernel</ulink>" | 903 | "<link linkend='configuring-the-kernel'>Configuring the Kernel</link>" |
| 904 | section in the Yocto Project Development Manual. | 904 | section. |
| 905 | </para> | 905 | </para> |
| 906 | </section> | 906 | </section> |
| 907 | 907 | ||
| @@ -1445,6 +1445,522 @@ | |||
| 1445 | </para> | 1445 | </para> |
| 1446 | </section> | 1446 | </section> |
| 1447 | 1447 | ||
| 1448 | |||
| 1449 | |||
| 1450 | |||
| 1451 | |||
| 1452 | |||
| 1453 | |||
| 1454 | |||
| 1455 | |||
| 1456 | |||
| 1457 | |||
| 1458 | |||
| 1459 | |||
| 1460 | |||
| 1461 | |||
| 1462 | |||
| 1463 | |||
| 1464 | |||
| 1465 | |||
| 1466 | |||
| 1467 | |||
| 1468 | |||
| 1469 | |||
| 1470 | |||
| 1471 | |||
| 1472 | |||
| 1473 | |||
| 1474 | |||
| 1475 | |||
| 1476 | <section id='configuring-the-kernel'> | ||
| 1477 | <title>Configuring the Kernel</title> | ||
| 1478 | |||
| 1479 | <para> | ||
| 1480 | Configuring the Yocto Project kernel consists of making sure the | ||
| 1481 | <filename>.config</filename> file has all the right information | ||
| 1482 | in it for the image you are building. | ||
| 1483 | You can use the <filename>menuconfig</filename> tool and | ||
| 1484 | configuration fragments to make sure your | ||
| 1485 | <filename>.config</filename> file is just how you need it. | ||
| 1486 | You can also save known configurations in a | ||
| 1487 | <filename>defconfig</filename> file that the build system can use | ||
| 1488 | for kernel configuration. | ||
| 1489 | </para> | ||
| 1490 | |||
| 1491 | <para> | ||
| 1492 | This section describes how to use <filename>menuconfig</filename>, | ||
| 1493 | create and use configuration fragments, and how to interactively | ||
| 1494 | modify your <filename>.config</filename> file to create the | ||
| 1495 | leanest kernel configuration file possible. | ||
| 1496 | </para> | ||
| 1497 | |||
| 1498 | <para> | ||
| 1499 | For more information on kernel configuration, see the | ||
| 1500 | "<link linkend='changing-the-configuration'>Changing the Configuration</link>" | ||
| 1501 | section. | ||
| 1502 | </para> | ||
| 1503 | |||
| 1504 | <section id='using-menuconfig'> | ||
| 1505 | <title>Using <filename>menuconfig</filename></title> | ||
| 1506 | |||
| 1507 | <para> | ||
| 1508 | The easiest way to define kernel configurations is to set them through the | ||
| 1509 | <filename>menuconfig</filename> tool. | ||
| 1510 | This tool provides an interactive method with which | ||
| 1511 | to set kernel configurations. | ||
| 1512 | For general information on <filename>menuconfig</filename>, see | ||
| 1513 | <ulink url='http://en.wikipedia.org/wiki/Menuconfig'></ulink>. | ||
| 1514 | </para> | ||
| 1515 | |||
| 1516 | <para> | ||
| 1517 | To use the <filename>menuconfig</filename> tool in the Yocto Project development | ||
| 1518 | environment, you must launch it using BitBake. | ||
| 1519 | Thus, the environment must be set up using the | ||
| 1520 | <ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>&OE_INIT_FILE;</filename></ulink> | ||
| 1521 | script found in the | ||
| 1522 | <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>. | ||
| 1523 | You must also be sure of the state of your build in the | ||
| 1524 | <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>. | ||
| 1525 | The following commands run <filename>menuconfig</filename> | ||
| 1526 | assuming the Source Directory's top-level folder is | ||
| 1527 | <filename>~/poky</filename>: | ||
| 1528 | <literallayout class='monospaced'> | ||
| 1529 | $ cd poky | ||
| 1530 | $ source oe-init-build-env | ||
| 1531 | $ bitbake linux-yocto -c kernel_configme -f | ||
| 1532 | $ bitbake linux-yocto -c menuconfig | ||
| 1533 | </literallayout> | ||
| 1534 | Once <filename>menuconfig</filename> comes up, its standard | ||
| 1535 | interface allows you to interactively examine and configure | ||
| 1536 | all the kernel configuration parameters. | ||
| 1537 | After making your changes, simply exit the tool and save your | ||
| 1538 | changes to create an updated version of the | ||
| 1539 | <filename>.config</filename> configuration file. | ||
| 1540 | </para> | ||
| 1541 | |||
| 1542 | <para> | ||
| 1543 | Consider an example that configures the <filename>linux-yocto-3.14</filename> | ||
| 1544 | kernel. | ||
| 1545 | The OpenEmbedded build system recognizes this kernel as | ||
| 1546 | <filename>linux-yocto</filename>. | ||
| 1547 | Thus, the following commands from the shell in which you previously sourced the | ||
| 1548 | environment initialization script cleans the shared state cache and the | ||
| 1549 | <ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink> | ||
| 1550 | directory and then runs <filename>menuconfig</filename>: | ||
| 1551 | <literallayout class='monospaced'> | ||
| 1552 | $ bitbake linux-yocto -c menuconfig | ||
| 1553 | </literallayout> | ||
| 1554 | </para> | ||
| 1555 | |||
| 1556 | <para> | ||
| 1557 | Once <filename>menuconfig</filename> launches, use the interface | ||
| 1558 | to navigate through the selections to find the configuration settings in | ||
| 1559 | which you are interested. | ||
| 1560 | For example, consider the <filename>CONFIG_SMP</filename> configuration setting. | ||
| 1561 | You can find it at <filename>Processor Type and Features</filename> under | ||
| 1562 | the configuration selection <filename>Symmetric Multi-processing Support</filename>. | ||
| 1563 | After highlighting the selection, use the arrow keys to select or deselect | ||
| 1564 | the setting. | ||
| 1565 | When you are finished with all your selections, exit out and save them. | ||
| 1566 | </para> | ||
| 1567 | |||
| 1568 | <para> | ||
| 1569 | Saving the selections updates the <filename>.config</filename> configuration file. | ||
| 1570 | This is the file that the OpenEmbedded build system uses to configure the | ||
| 1571 | kernel during the build. | ||
| 1572 | You can find and examine this file in the Build Directory in | ||
| 1573 | <filename>tmp/work/</filename>. | ||
| 1574 | The actual <filename>.config</filename> is located in the area where the | ||
| 1575 | specific kernel is built. | ||
| 1576 | For example, if you were building a Linux Yocto kernel based on the | ||
| 1577 | Linux 3.14 kernel and you were building a QEMU image targeted for | ||
| 1578 | <filename>x86</filename> architecture, the | ||
| 1579 | <filename>.config</filename> file would be located here: | ||
| 1580 | <literallayout class='monospaced'> | ||
| 1581 | poky/build/tmp/work/qemux86-poky-linux/linux-yocto-3.14.11+git1+84f... | ||
| 1582 | ...656ed30-r1/linux-qemux86-standard-build | ||
| 1583 | </literallayout> | ||
| 1584 | <note> | ||
| 1585 | The previous example directory is artificially split and many of the characters | ||
| 1586 | in the actual filename are omitted in order to make it more readable. | ||
| 1587 | Also, depending on the kernel you are using, the exact pathname | ||
| 1588 | for <filename>linux-yocto-3.14...</filename> might differ. | ||
| 1589 | </note> | ||
| 1590 | </para> | ||
| 1591 | |||
| 1592 | <para> | ||
| 1593 | Within the <filename>.config</filename> file, you can see the kernel settings. | ||
| 1594 | For example, the following entry shows that symmetric multi-processor support | ||
| 1595 | is not set: | ||
| 1596 | <literallayout class='monospaced'> | ||
| 1597 | # CONFIG_SMP is not set | ||
| 1598 | </literallayout> | ||
| 1599 | </para> | ||
| 1600 | |||
| 1601 | <para> | ||
| 1602 | A good method to isolate changed configurations is to use a combination of the | ||
| 1603 | <filename>menuconfig</filename> tool and simple shell commands. | ||
| 1604 | Before changing configurations with <filename>menuconfig</filename>, copy the | ||
| 1605 | existing <filename>.config</filename> and rename it to something else, | ||
| 1606 | use <filename>menuconfig</filename> to make | ||
| 1607 | as many changes as you want and save them, then compare the renamed configuration | ||
| 1608 | file against the newly created file. | ||
| 1609 | You can use the resulting differences as your base to create configuration fragments | ||
| 1610 | to permanently save in your kernel layer. | ||
| 1611 | <note> | ||
| 1612 | Be sure to make a copy of the <filename>.config</filename> and don't just | ||
| 1613 | rename it. | ||
| 1614 | The build system needs an existing <filename>.config</filename> | ||
| 1615 | from which to work. | ||
| 1616 | </note> | ||
| 1617 | </para> | ||
| 1618 | </section> | ||
| 1619 | |||
| 1620 | <section id='creating-a-defconfig-file'> | ||
| 1621 | <title>Creating a <filename>defconfig</filename> File</title> | ||
| 1622 | |||
| 1623 | <para> | ||
| 1624 | A <filename>defconfig</filename> file is simply a | ||
| 1625 | <filename>.config</filename> renamed to "defconfig". | ||
| 1626 | You can use a <filename>defconfig</filename> file | ||
| 1627 | to retain a known set of kernel configurations from which the | ||
| 1628 | OpenEmbedded build system can draw to create the final | ||
| 1629 | <filename>.config</filename> file. | ||
| 1630 | <note> | ||
| 1631 | Out-of-the-box, the Yocto Project never ships a | ||
| 1632 | <filename>defconfig</filename> or | ||
| 1633 | <filename>.config</filename> file. | ||
| 1634 | The OpenEmbedded build system creates the final | ||
| 1635 | <filename>.config</filename> file used to configure the | ||
| 1636 | kernel. | ||
| 1637 | </note> | ||
| 1638 | </para> | ||
| 1639 | |||
| 1640 | <para> | ||
| 1641 | To create a <filename>defconfig</filename>, start with a | ||
| 1642 | complete, working Linux kernel <filename>.config</filename> | ||
| 1643 | file. | ||
| 1644 | Copy that file to the appropriate | ||
| 1645 | <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink><filename>}</filename> | ||
| 1646 | directory in your layer's | ||
| 1647 | <filename>recipes-kernel/linux</filename> directory, and rename | ||
| 1648 | the copied file to "defconfig". | ||
| 1649 | Then, add the following lines to the linux-yocto | ||
| 1650 | <filename>.bbappend</filename> file in your layer: | ||
| 1651 | <literallayout class='monospaced'> | ||
| 1652 | FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" | ||
| 1653 | SRC_URI += "file://defconfig" | ||
| 1654 | </literallayout> | ||
| 1655 | The | ||
| 1656 | <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> | ||
| 1657 | tells the build system how to search for the file, while the | ||
| 1658 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> | ||
| 1659 | extends the | ||
| 1660 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> | ||
| 1661 | variable (search directories) to include the | ||
| 1662 | <filename>${PN}</filename> directory you created to hold the | ||
| 1663 | configuration changes. | ||
| 1664 | <note> | ||
| 1665 | The build system applies the configurations from the | ||
| 1666 | <filename>defconfig</filename> file before applying any | ||
| 1667 | subsequent configuration fragments. | ||
| 1668 | The final kernel configuration is a combination of the | ||
| 1669 | configurations in the <filename>defconfig</filename> | ||
| 1670 | file and any configuration fragments you provide. | ||
| 1671 | You need to realize that if you have any configuration | ||
| 1672 | fragments, the build system applies these on top of and | ||
| 1673 | after applying the existing defconfig file configurations. | ||
| 1674 | </note> | ||
| 1675 | For more information on configuring the kernel, see the | ||
| 1676 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#changing-the-configuration'>Changing the Configuration</ulink>" | ||
| 1677 | and | ||
| 1678 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#generating-configuration-files'>Generating Configuration Files</ulink>" | ||
| 1679 | sections, both in the Yocto Project Linux Kernel Development | ||
| 1680 | Manual. | ||
| 1681 | </para> | ||
| 1682 | </section> | ||
| 1683 | |||
| 1684 | <section id='creating-config-fragments'> | ||
| 1685 | <title>Creating Configuration Fragments</title> | ||
| 1686 | |||
| 1687 | <para> | ||
| 1688 | Configuration fragments are simply kernel options that appear in a file | ||
| 1689 | placed where the OpenEmbedded build system can find and apply them. | ||
| 1690 | Syntactically, the configuration statement is identical to what would appear | ||
| 1691 | in the <filename>.config</filename> file, which is in the | ||
| 1692 | <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>: | ||
| 1693 | <literallayout class='monospaced'> | ||
| 1694 | tmp/work/<replaceable>arch</replaceable>-poky-linux/linux-yocto-<replaceable>release_specific_string</replaceable>/linux-<replaceable>arch</replaceable>-<replaceable>build_type</replaceable> | ||
| 1695 | </literallayout> | ||
| 1696 | </para> | ||
| 1697 | |||
| 1698 | <para> | ||
| 1699 | It is simple to create a configuration fragment. | ||
| 1700 | For example, issuing the following from the shell creates a configuration fragment | ||
| 1701 | file named <filename>my_smp.cfg</filename> that enables multi-processor support | ||
| 1702 | within the kernel: | ||
| 1703 | <literallayout class='monospaced'> | ||
| 1704 | $ echo "CONFIG_SMP=y" >> my_smp.cfg | ||
| 1705 | </literallayout> | ||
| 1706 | <note> | ||
| 1707 | All configuration fragment files must use the | ||
| 1708 | <filename>.cfg</filename> extension in order for the | ||
| 1709 | OpenEmbedded build system to recognize them as a | ||
| 1710 | configuration fragment. | ||
| 1711 | </note> | ||
| 1712 | </para> | ||
| 1713 | |||
| 1714 | <para> | ||
| 1715 | Where do you put your configuration fragment files? | ||
| 1716 | You can place these files in the same area pointed to by | ||
| 1717 | <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>. | ||
| 1718 | The OpenEmbedded build system picks up the configuration and | ||
| 1719 | adds it to the kernel's configuration. | ||
| 1720 | For example, suppose you had a set of configuration options | ||
| 1721 | in a file called <filename>myconfig.cfg</filename>. | ||
| 1722 | If you put that file inside a directory named | ||
| 1723 | <filename>linux-yocto</filename> that resides in the same | ||
| 1724 | directory as the kernel's append file and then add a | ||
| 1725 | <filename>SRC_URI</filename> statement such as the following | ||
| 1726 | to the kernel's append file, those configuration options | ||
| 1727 | will be picked up and applied when the kernel is built. | ||
| 1728 | <literallayout class='monospaced'> | ||
| 1729 | SRC_URI += "file://myconfig.cfg" | ||
| 1730 | </literallayout> | ||
| 1731 | </para> | ||
| 1732 | |||
| 1733 | <para> | ||
| 1734 | As mentioned earlier, you can group related configurations into multiple files and | ||
| 1735 | name them all in the <filename>SRC_URI</filename> statement as well. | ||
| 1736 | For example, you could group separate configurations specifically for Ethernet and graphics | ||
| 1737 | into their own files and add those by using a <filename>SRC_URI</filename> statement like the | ||
| 1738 | following in your append file: | ||
| 1739 | <literallayout class='monospaced'> | ||
| 1740 | SRC_URI += "file://myconfig.cfg \ | ||
| 1741 | file://eth.cfg \ | ||
| 1742 | file://gfx.cfg" | ||
| 1743 | </literallayout> | ||
| 1744 | </para> | ||
| 1745 | </section> | ||
| 1746 | |||
| 1747 | <section id='fine-tuning-the-kernel-configuration-file'> | ||
| 1748 | <title>Fine-Tuning the Kernel Configuration File</title> | ||
| 1749 | |||
| 1750 | <para> | ||
| 1751 | You can make sure the <filename>.config</filename> file is as lean or efficient as | ||
| 1752 | possible by reading the output of the kernel configuration fragment audit, | ||
| 1753 | noting any issues, making changes to correct the issues, and then repeating. | ||
| 1754 | </para> | ||
| 1755 | |||
| 1756 | <para> | ||
| 1757 | As part of the kernel build process, the | ||
| 1758 | <filename>do_kernel_configcheck</filename> task runs. | ||
| 1759 | This task validates the kernel configuration by checking the final | ||
| 1760 | <filename>.config</filename> file against the input files. | ||
| 1761 | During the check, the task produces warning messages for the following | ||
| 1762 | issues: | ||
| 1763 | <itemizedlist> | ||
| 1764 | <listitem><para>Requested options that did not make the final | ||
| 1765 | <filename>.config</filename> file.</para></listitem> | ||
| 1766 | <listitem><para>Configuration items that appear twice in the same | ||
| 1767 | configuration fragment.</para></listitem> | ||
| 1768 | <listitem><para>Configuration items tagged as "required" that were overridden. | ||
| 1769 | </para></listitem> | ||
| 1770 | <listitem><para>A board overrides a non-board specific option.</para></listitem> | ||
| 1771 | <listitem><para>Listed options not valid for the kernel being processed. | ||
| 1772 | In other words, the option does not appear anywhere.</para></listitem> | ||
| 1773 | </itemizedlist> | ||
| 1774 | <note> | ||
| 1775 | The <filename>do_kernel_configcheck</filename> task can | ||
| 1776 | also optionally report if an option is overridden during | ||
| 1777 | processing. | ||
| 1778 | </note> | ||
| 1779 | </para> | ||
| 1780 | |||
| 1781 | <para> | ||
| 1782 | For each output warning, a message points to the file | ||
| 1783 | that contains a list of the options and a pointer to the | ||
| 1784 | configuration fragment that defines them. | ||
| 1785 | Collectively, the files are the key to streamlining the | ||
| 1786 | configuration. | ||
| 1787 | </para> | ||
| 1788 | |||
| 1789 | <para> | ||
| 1790 | To streamline the configuration, do the following: | ||
| 1791 | <orderedlist> | ||
| 1792 | <listitem><para>Start with a full configuration that you | ||
| 1793 | know works - it builds and boots successfully. | ||
| 1794 | This configuration file will be your baseline. | ||
| 1795 | </para></listitem> | ||
| 1796 | <listitem><para>Separately run the | ||
| 1797 | <filename>do_kernel_configme</filename> and | ||
| 1798 | <filename>do_kernel_configcheck</filename> tasks. | ||
| 1799 | </para></listitem> | ||
| 1800 | <listitem><para>Take the resulting list of files from the | ||
| 1801 | <filename>do_kernel_configcheck</filename> task | ||
| 1802 | warnings and do the following: | ||
| 1803 | <itemizedlist> | ||
| 1804 | <listitem><para> | ||
| 1805 | Drop values that are redefined in the fragment | ||
| 1806 | but do not change the final | ||
| 1807 | <filename>.config</filename> file. | ||
| 1808 | </para></listitem> | ||
| 1809 | <listitem><para> | ||
| 1810 | Analyze and potentially drop values from the | ||
| 1811 | <filename>.config</filename> file that override | ||
| 1812 | required configurations. | ||
| 1813 | </para></listitem> | ||
| 1814 | <listitem><para> | ||
| 1815 | Analyze and potentially remove non-board | ||
| 1816 | specific options. | ||
| 1817 | </para></listitem> | ||
| 1818 | <listitem><para> | ||
| 1819 | Remove repeated and invalid options. | ||
| 1820 | </para></listitem> | ||
| 1821 | </itemizedlist></para></listitem> | ||
| 1822 | <listitem><para> | ||
| 1823 | After you have worked through the output of the kernel | ||
| 1824 | configuration audit, you can re-run the | ||
| 1825 | <filename>do_kernel_configme</filename> and | ||
| 1826 | <filename>do_kernel_configcheck</filename> tasks to | ||
| 1827 | see the results of your changes. | ||
| 1828 | If you have more issues, you can deal with them as | ||
| 1829 | described in the previous step. | ||
| 1830 | </para></listitem> | ||
| 1831 | </orderedlist> | ||
| 1832 | </para> | ||
| 1833 | |||
| 1834 | <para> | ||
| 1835 | Iteratively working through steps two through four eventually yields | ||
| 1836 | a minimal, streamlined configuration file. | ||
| 1837 | Once you have the best <filename>.config</filename>, you can build the Linux | ||
| 1838 | Yocto kernel. | ||
| 1839 | </para> | ||
| 1840 | </section> | ||
| 1841 | |||
| 1842 | <section id='determining-hardware-and-non-hardware-features-for-the-kernel-configuration-audit-phase'> | ||
| 1843 | <title>Determining Hardware and Non-Hardware Features for the Kernel Configuration Audit Phase</title> | ||
| 1844 | |||
| 1845 | <para> | ||
| 1846 | This section describes part of the kernel configuration audit | ||
| 1847 | phase that most developers can ignore. | ||
| 1848 | During this part of the audit phase, the contents of the final | ||
| 1849 | <filename>.config</filename> file are compared against the | ||
| 1850 | fragments specified by the system. | ||
| 1851 | These fragments can be system fragments, distro fragments, | ||
| 1852 | or user specified configuration elements. | ||
| 1853 | Regardless of their origin, the OpenEmbedded build system | ||
| 1854 | warns the user if a specific option is not included in the | ||
| 1855 | final kernel configuration. | ||
| 1856 | </para> | ||
| 1857 | |||
| 1858 | <para> | ||
| 1859 | In order to not overwhelm the user with configuration warnings, | ||
| 1860 | by default the system only reports on missing "hardware" | ||
| 1861 | options because a missing hardware option could mean a boot | ||
| 1862 | failure or that important hardware is not available. | ||
| 1863 | </para> | ||
| 1864 | |||
| 1865 | <para> | ||
| 1866 | To determine whether or not a given option is "hardware" or | ||
| 1867 | "non-hardware", the kernel Metadata contains files that | ||
| 1868 | classify individual or groups of options as either hardware | ||
| 1869 | or non-hardware. | ||
| 1870 | To better show this, consider a situation where the | ||
| 1871 | Yocto Project kernel cache contains the following files: | ||
| 1872 | <literallayout class='monospaced'> | ||
| 1873 | kernel-cache/features/drm-psb/hardware.cfg | ||
| 1874 | kernel-cache/features/kgdb/hardware.cfg | ||
| 1875 | kernel-cache/ktypes/base/hardware.cfg | ||
| 1876 | kernel-cache/bsp/mti-malta32/hardware.cfg | ||
| 1877 | kernel-cache/bsp/fsl-mpc8315e-rdb/hardware.cfg | ||
| 1878 | kernel-cache/bsp/qemu-ppc32/hardware.cfg | ||
| 1879 | kernel-cache/bsp/qemuarma9/hardware.cfg | ||
| 1880 | kernel-cache/bsp/mti-malta64/hardware.cfg | ||
| 1881 | kernel-cache/bsp/arm-versatile-926ejs/hardware.cfg | ||
| 1882 | kernel-cache/bsp/common-pc/hardware.cfg | ||
| 1883 | kernel-cache/bsp/common-pc-64/hardware.cfg | ||
| 1884 | kernel-cache/features/rfkill/non-hardware.cfg | ||
| 1885 | kernel-cache/ktypes/base/non-hardware.cfg | ||
| 1886 | kernel-cache/features/aufs/non-hardware.kcf | ||
| 1887 | kernel-cache/features/ocf/non-hardware.kcf | ||
| 1888 | kernel-cache/ktypes/base/non-hardware.kcf | ||
| 1889 | kernel-cache/ktypes/base/hardware.kcf | ||
| 1890 | kernel-cache/bsp/qemu-ppc32/hardware.kcf | ||
| 1891 | </literallayout> | ||
| 1892 | The following list provides explanations for the various | ||
| 1893 | files: | ||
| 1894 | <itemizedlist> | ||
| 1895 | <listitem><para><filename>hardware.kcf</filename>: | ||
| 1896 | Specifies a list of kernel Kconfig files that contain | ||
| 1897 | hardware options only. | ||
| 1898 | </para></listitem> | ||
| 1899 | <listitem><para><filename>non-hardware.kcf</filename>: | ||
| 1900 | Specifies a list of kernel Kconfig files that contain | ||
| 1901 | non-hardware options only. | ||
| 1902 | </para></listitem> | ||
| 1903 | <listitem><para><filename>hardware.cfg</filename>: | ||
| 1904 | Specifies a list of kernel | ||
| 1905 | <filename>CONFIG_</filename> options that are hardware, | ||
| 1906 | regardless of whether or not they are within a Kconfig | ||
| 1907 | file specified by a hardware or non-hardware | ||
| 1908 | Kconfig file (i.e. <filename>hardware.kcf</filename> or | ||
| 1909 | <filename>non-hardware.kcf</filename>). | ||
| 1910 | </para></listitem> | ||
| 1911 | <listitem><para><filename>non-hardware.cfg</filename>: | ||
| 1912 | Specifies a list of kernel | ||
| 1913 | <filename>CONFIG_</filename> options that are | ||
| 1914 | not hardware, regardless of whether or not they are | ||
| 1915 | within a Kconfig file specified by a hardware or | ||
| 1916 | non-hardware Kconfig file (i.e. | ||
| 1917 | <filename>hardware.kcf</filename> or | ||
| 1918 | <filename>non-hardware.kcf</filename>). | ||
| 1919 | </para></listitem> | ||
| 1920 | </itemizedlist> | ||
| 1921 | Here is a specific example using the | ||
| 1922 | <filename>kernel-cache/bsp/mti-malta32/hardware.cfg</filename>: | ||
| 1923 | <literallayout class='monospaced'> | ||
| 1924 | CONFIG_SERIAL_8250 | ||
| 1925 | CONFIG_SERIAL_8250_CONSOLE | ||
| 1926 | CONFIG_SERIAL_8250_NR_UARTS | ||
| 1927 | CONFIG_SERIAL_8250_PCI | ||
| 1928 | CONFIG_SERIAL_CORE | ||
| 1929 | CONFIG_SERIAL_CORE_CONSOLE | ||
| 1930 | CONFIG_VGA_ARB | ||
| 1931 | </literallayout> | ||
| 1932 | The kernel configuration audit automatically detects these | ||
| 1933 | files (hence the names must be exactly the ones discussed here), | ||
| 1934 | and uses them as inputs when generating warnings about the | ||
| 1935 | final <filename>.config</filename> file. | ||
| 1936 | </para> | ||
| 1937 | |||
| 1938 | <para> | ||
| 1939 | A user-specified kernel Metadata repository, or recipe space | ||
| 1940 | feature, can use these same files to classify options that are | ||
| 1941 | found within its <filename>.cfg</filename> files as hardware | ||
| 1942 | or non-hardware, to prevent the OpenEmbedded build system from | ||
| 1943 | producing an error or warning when an option is not in the | ||
| 1944 | final <filename>.config</filename> file. | ||
| 1945 | </para> | ||
| 1946 | </section> | ||
| 1947 | </section> | ||
| 1948 | |||
| 1949 | |||
| 1950 | |||
| 1951 | |||
| 1952 | |||
| 1953 | |||
| 1954 | |||
| 1955 | |||
| 1956 | |||
| 1957 | |||
| 1958 | |||
| 1959 | |||
| 1960 | |||
| 1961 | |||
| 1962 | |||
| 1963 | |||
| 1448 | <section id='using-an-iterative-development-process'> | 1964 | <section id='using-an-iterative-development-process'> |
| 1449 | <title>Using an Iterative Development Process</title> | 1965 | <title>Using an Iterative Development Process</title> |
| 1450 | 1966 | ||
| @@ -1538,8 +2054,8 @@ | |||
| 1538 | "<link linkend='changing-the-configuration'>Changing the Configuration</link>" section. | 2054 | "<link linkend='changing-the-configuration'>Changing the Configuration</link>" section. |
| 1539 | For more information on the <filename>.config</filename> file, | 2055 | For more information on the <filename>.config</filename> file, |
| 1540 | see the | 2056 | see the |
| 1541 | "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" | 2057 | "<link linkend='using-menuconfig'>Using <filename>menuconfig</filename></link>" |
| 1542 | section in the Yocto Project Development Manual. | 2058 | section. |
| 1543 | <note> | 2059 | <note> |
| 1544 | You can determine what a variable expands to by looking | 2060 | You can determine what a variable expands to by looking |
| 1545 | at the output of the <filename>bitbake -e</filename> | 2061 | at the output of the <filename>bitbake -e</filename> |
| @@ -1650,8 +2166,8 @@ | |||
| 1650 | <para> | 2166 | <para> |
| 1651 | For more information on how to use the | 2167 | For more information on how to use the |
| 1652 | <filename>menuconfig</filename> tool, see the | 2168 | <filename>menuconfig</filename> tool, see the |
| 1653 | "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" | 2169 | "<link linkend='using-menuconfig'>Using <filename>menuconfig</filename></link>" |
| 1654 | section in the Yocto Project Development Manual. | 2170 | section. |
| 1655 | </para> | 2171 | </para> |
| 1656 | </section> | 2172 | </section> |
| 1657 | 2173 | ||
diff --git a/documentation/kernel-dev/kernel-dev-intro.xml b/documentation/kernel-dev/kernel-dev-intro.xml index b2fe19c175..174ab93ab0 100644 --- a/documentation/kernel-dev/kernel-dev-intro.xml +++ b/documentation/kernel-dev/kernel-dev-intro.xml | |||
| @@ -231,7 +231,7 @@ | |||
| 231 | and you have saved them, you can directly compare the | 231 | and you have saved them, you can directly compare the |
| 232 | resulting <filename>.config</filename> file against an | 232 | resulting <filename>.config</filename> file against an |
| 233 | existing original and gather those changes into a | 233 | existing original and gather those changes into a |
| 234 | <ulink url='&YOCTO_DOCS_DEV_URL;#creating-config-fragments'>configuration fragment file</ulink> | 234 | <link linkend='creating-config-fragments'>configuration fragment file</link> |
| 235 | to be referenced from within the kernel's | 235 | to be referenced from within the kernel's |
| 236 | <filename>.bbappend</filename> file.</para> | 236 | <filename>.bbappend</filename> file.</para> |
| 237 | 237 | ||
diff --git a/documentation/ref-manual/ref-tasks.xml b/documentation/ref-manual/ref-tasks.xml index 2d23bbaabf..e145518989 100644 --- a/documentation/ref-manual/ref-tasks.xml +++ b/documentation/ref-manual/ref-tasks.xml | |||
| @@ -960,8 +960,8 @@ | |||
| 960 | section in the Yocto Project Linux Kernel Development Manual | 960 | section in the Yocto Project Linux Kernel Development Manual |
| 961 | for more information on this configuration tool. | 961 | for more information on this configuration tool. |
| 962 | You can also reference the | 962 | You can also reference the |
| 963 | "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" | 963 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" |
| 964 | section in the Yocto Project Development Manual. | 964 | section in the Yocto Project Linux Kernel Development Manual. |
| 965 | </para> | 965 | </para> |
| 966 | </section> | 966 | </section> |
| 967 | 967 | ||
| @@ -988,8 +988,8 @@ | |||
| 988 | <para> | 988 | <para> |
| 989 | Runs <filename>make menuconfig</filename> for the kernel. | 989 | Runs <filename>make menuconfig</filename> for the kernel. |
| 990 | For information on <filename>menuconfig</filename>, see the | 990 | For information on <filename>menuconfig</filename>, see the |
| 991 | "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" | 991 | "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>" |
| 992 | section in the Yocto Project Development Manual. | 992 | section in the Yocto Project Linux Kernel Development Manual. |
| 993 | </para> | 993 | </para> |
| 994 | </section> | 994 | </section> |
| 995 | 995 | ||
