diff options
| -rw-r--r-- | documentation/dev-manual/dev-manual-common-tasks.xml | 246 |
1 files changed, 188 insertions, 58 deletions
diff --git a/documentation/dev-manual/dev-manual-common-tasks.xml b/documentation/dev-manual/dev-manual-common-tasks.xml index 4bdeedb8d7..a4d837216e 100644 --- a/documentation/dev-manual/dev-manual-common-tasks.xml +++ b/documentation/dev-manual/dev-manual-common-tasks.xml | |||
| @@ -228,65 +228,192 @@ | |||
| 228 | </note></para></listitem> | 228 | </note></para></listitem> |
| 229 | </orderedlist> | 229 | </orderedlist> |
| 230 | </para> | 230 | </para> |
| 231 | </section> | ||
| 231 | 232 | ||
| 232 | <para> | 233 | <section id='best-practices-to-follow-when-creating-layers'> |
| 233 | To create layers that are easier to maintain, you should | 234 | <title>Best Practices to Follow When Creating Layers</title> |
| 234 | consider the following: | ||
| 235 | <itemizedlist> | ||
| 236 | <listitem><para>Avoid "overlaying" entire recipes from | ||
| 237 | other layers in your configuration. | ||
| 238 | In other words, do not copy an entire recipe into your | ||
| 239 | layer and then modify it. | ||
| 240 | Use <filename>.bbappend</filename> files to override the | ||
| 241 | parts of the recipe you need to modify. | ||
| 242 | </para></listitem> | ||
| 243 | <listitem><para>Avoid duplicating include files. | ||
| 244 | Use <filename>.bbappend</filename> files for each recipe | ||
| 245 | that uses an include file. | ||
| 246 | Or, if you are introducing a new recipe that requires | ||
| 247 | the included file, use the path relative to the original | ||
| 248 | layer directory to refer to the file. | ||
| 249 | For example, use | ||
| 250 | <filename>require recipes-core/somepackage/somefile.inc</filename> | ||
| 251 | instead of <filename>require somefile.inc</filename>. | ||
| 252 | If you're finding you have to overlay the include file, | ||
| 253 | it could indicate a deficiency in the include file in | ||
| 254 | the layer to which it originally belongs. | ||
| 255 | If this is the case, you need to address that deficiency | ||
| 256 | instead of overlaying the include file. | ||
| 257 | For example, consider how Qt 4 database support plug-ins | ||
| 258 | are configured. | ||
| 259 | The Source Directory does not have MySQL or PostgreSQL, | ||
| 260 | however OpenEmbedded's layer | ||
| 261 | <filename>meta-oe</filename> does. | ||
| 262 | Consequently, <filename>meta-oe</filename> uses | ||
| 263 | <filename>.bbappend</filename> files to modify the | ||
| 264 | <filename>QT_SQL_DRIVER_FLAGS</filename> variable to | ||
| 265 | enable the appropriate plugins. | ||
| 266 | This variable was added to the | ||
| 267 | <filename>qt4.inc</filename> include file in the Source | ||
| 268 | Directory specifically to allow the | ||
| 269 | <filename>meta-oe</filename> layer to be able to control | ||
| 270 | which plugins are built.</para></listitem> | ||
| 271 | </itemizedlist> | ||
| 272 | </para> | ||
| 273 | 235 | ||
| 274 | <para> | 236 | <para> |
| 275 | We also recommend the following: | 237 | To create layers that are easier to maintain and that will |
| 276 | <itemizedlist> | 238 | not impact builds for other machines, you should consider the |
| 277 | <listitem><para>Store custom layers in a Git repository | 239 | information in the following sections. |
| 278 | that uses the | ||
| 279 | <filename>meta-<layer_name></filename> format. | ||
| 280 | </para></listitem> | ||
| 281 | <listitem><para>Clone the repository alongside other | ||
| 282 | <filename>meta</filename> directories in the | ||
| 283 | <link linkend='source-directory'>Source Directory</link>. | ||
| 284 | </para></listitem> | ||
| 285 | </itemizedlist> | ||
| 286 | Following these recommendations keeps your Source Directory and | ||
| 287 | its configuration entirely inside the Yocto Project's core | ||
| 288 | base. | ||
| 289 | </para> | 240 | </para> |
| 241 | |||
| 242 | <section id='avoid-overlaying-entire-recipes'> | ||
| 243 | <title>Avoid "Overlaying" Entire Recipes</title> | ||
| 244 | |||
| 245 | <para> | ||
| 246 | Avoid "overlaying" entire recipes from other layers in your | ||
| 247 | configuration. | ||
| 248 | In other words, do not copy an entire recipe into your | ||
| 249 | layer and then modify it. | ||
| 250 | Use <filename>.bbappend</filename> files to override the | ||
| 251 | parts of the recipe you need to modify. | ||
| 252 | </para> | ||
| 253 | </section> | ||
| 254 | |||
| 255 | <section id='avoid-duplicating-include-files'> | ||
| 256 | <title>Avoid Duplicating Include Files</title> | ||
| 257 | |||
| 258 | <para> | ||
| 259 | Avoid duplicating include files. | ||
| 260 | Use <filename>.bbappend</filename> files for each recipe | ||
| 261 | that uses an include file. | ||
| 262 | Or, if you are introducing a new recipe that requires | ||
| 263 | the included file, use the path relative to the original | ||
| 264 | layer directory to refer to the file. | ||
| 265 | For example, use | ||
| 266 | <filename>require recipes-core/somepackage/somefile.inc</filename> | ||
| 267 | instead of <filename>require somefile.inc</filename>. | ||
| 268 | If you're finding you have to overlay the include file, | ||
| 269 | it could indicate a deficiency in the include file in | ||
| 270 | the layer to which it originally belongs. | ||
| 271 | If this is the case, you need to address that deficiency | ||
| 272 | instead of overlaying the include file. | ||
| 273 | For example, consider how support plugins for the Qt 4 | ||
| 274 | database are configured. | ||
| 275 | The Source Directory does not have MySQL or PostgreSQL. | ||
| 276 | However, OpenEmbedded's layer <filename>meta-oe</filename> | ||
| 277 | does. | ||
| 278 | Consequently, <filename>meta-oe</filename> uses | ||
| 279 | <filename>.bbappend</filename> files to modify the | ||
| 280 | <filename>QT_SQL_DRIVER_FLAGS</filename> variable to | ||
| 281 | enable the appropriate plugins. | ||
| 282 | This variable was added to the <filename>qt4.inc</filename> | ||
| 283 | include file in the Source Directory specifically to allow | ||
| 284 | the <filename>meta-oe</filename> layer to be able to control | ||
| 285 | which plugins are built. | ||
| 286 | </para> | ||
| 287 | </section> | ||
| 288 | |||
| 289 | <section id='structure-your-layers'> | ||
| 290 | <title>Structure Your Layers</title> | ||
| 291 | |||
| 292 | <para> | ||
| 293 | Proper use of overrides within append files and placement | ||
| 294 | of machine-specific files within your layer can ensure that | ||
| 295 | a build is not using the wrong Metadata and negatively | ||
| 296 | impacting a build for a different machine. | ||
| 297 | Following are some examples: | ||
| 298 | <itemizedlist> | ||
| 299 | <listitem><para><emphasis>Modifying Variables to support | ||
| 300 | a different machine:</emphasis> | ||
| 301 | Suppose you have a layer named | ||
| 302 | <filename>meta-one</filename> that adds support | ||
| 303 | for building machine "one". | ||
| 304 | To do so, you use an append file named | ||
| 305 | <filename>base-files.bbappend</filename> and | ||
| 306 | create a dependency on a file named | ||
| 307 | <filename>foo</filename> that contains the | ||
| 308 | altered variables: | ||
| 309 | <literallayout class='monospaced'> | ||
| 310 | <ulink url='&YOCTO_DOCS_REF_URL;#var-DEPENDS'><filename>DEPENDS</filename></ulink> = "foo" | ||
| 311 | </literallayout> | ||
| 312 | The dependency is created during any build that | ||
| 313 | includes the layer | ||
| 314 | <filename>meta-one</filename>. | ||
| 315 | However, you might not want this dependency | ||
| 316 | for all machines. | ||
| 317 | For example, suppose you are building for | ||
| 318 | machine "two" but your | ||
| 319 | <filename>bblayers.conf</filename> file has the | ||
| 320 | <filename>meta-one</filename> layer included. | ||
| 321 | During the build, the | ||
| 322 | <filename>base-files</filename> for machine | ||
| 323 | "two" will also have the dependency on | ||
| 324 | <filename>foo</filename>.</para> | ||
| 325 | <para>To make sure your changes apply only when | ||
| 326 | building machine "one", use a machine override | ||
| 327 | with the <filename>DEPENDS</filename> statement: | ||
| 328 | <literallayout class='monospaced'> | ||
| 329 | DEPENDS_one = "foo" | ||
| 330 | </literallayout> | ||
| 331 | You should follow the same strategy when using | ||
| 332 | <filename>_append</filename> and | ||
| 333 | <filename>_prepend</filename> overrides: | ||
| 334 | <literallayout class='monospaced'> | ||
| 335 | DEPENDS_append_one = " foo" | ||
| 336 | DEPENDS_prepend_one = "foo " | ||
| 337 | </literallayout> | ||
| 338 | <note> | ||
| 339 | Avoiding "+=" and "=+" and using | ||
| 340 | machine-specific | ||
| 341 | <filename>_append</filename> | ||
| 342 | and <filename>_prepend</filename> overrides | ||
| 343 | is recommended as well. | ||
| 344 | </note></para></listitem> | ||
| 345 | <listitem><para><emphasis>Place Machine-Specific Files | ||
| 346 | in Machine-Specific Locations:</emphasis> | ||
| 347 | When you have a base recipe, such as | ||
| 348 | <filename>base-files.bb</filename>, that | ||
| 349 | contains a | ||
| 350 | <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> | ||
| 351 | statement to a file, you can use an append file | ||
| 352 | to cause the build to use your own version of | ||
| 353 | the file. | ||
| 354 | For example, an append file in your layer at | ||
| 355 | <filename>/meta-one/recipes-core/base-files/base-files.bbappend</filename> | ||
| 356 | could extend | ||
| 357 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> | ||
| 358 | using | ||
| 359 | <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> | ||
| 360 | as follows: | ||
| 361 | <literallayout class='monospaced'> | ||
| 362 | FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" | ||
| 363 | </literallayout> | ||
| 364 | The build for machine "one" will pick up your | ||
| 365 | machine-specific file as long as you have the | ||
| 366 | file in | ||
| 367 | <filename>/meta-one/recipes-core/base-files/base-files/</filename>. | ||
| 368 | However, if you are building for a different | ||
| 369 | machine and the | ||
| 370 | <filename>bblayers.conf</filename> file includes | ||
| 371 | the <filename>meta-one</filename> layer and | ||
| 372 | the location of your machine-specific file is | ||
| 373 | the first location where that file is found | ||
| 374 | according to <filename>FILESPATH</filename>, | ||
| 375 | builds for all machines will also use that | ||
| 376 | machine-specific file.</para> | ||
| 377 | <para>You can make sure that a machine-specific | ||
| 378 | file is used for a particular machine by putting | ||
| 379 | the file in a subdirectory specific to the | ||
| 380 | machine. | ||
| 381 | For example, rather than placing the file in | ||
| 382 | <filename>/meta-one/recipes-core/base-files/base-files/</filename> | ||
| 383 | as shown above, put it in | ||
| 384 | <filename>/meta-one/recipes-core/base-files/base-files/one/</filename>. | ||
| 385 | Not only does this make sure the file is used | ||
| 386 | only when building for machine "one" but the | ||
| 387 | build process locates the file more quickly.</para> | ||
| 388 | <para>In summary, you need to place all files | ||
| 389 | referenced from <filename>SRC_URI</filename> | ||
| 390 | in a machine-specific subdirectory within the | ||
| 391 | layer in order to restrict those files to | ||
| 392 | machine-specific builds.</para></listitem> | ||
| 393 | </itemizedlist> | ||
| 394 | </para> | ||
| 395 | </section> | ||
| 396 | |||
| 397 | <section id='other-recommendations'> | ||
| 398 | <title>Other Recommendations</title> | ||
| 399 | |||
| 400 | <para> | ||
| 401 | We also recommend the following: | ||
| 402 | <itemizedlist> | ||
| 403 | <listitem><para>Store custom layers in a Git repository | ||
| 404 | that uses the | ||
| 405 | <filename>meta-<layer_name></filename> format. | ||
| 406 | </para></listitem> | ||
| 407 | <listitem><para>Clone the repository alongside other | ||
| 408 | <filename>meta</filename> directories in the | ||
| 409 | <link linkend='source-directory'>Source Directory</link>. | ||
| 410 | </para></listitem> | ||
| 411 | </itemizedlist> | ||
| 412 | Following these recommendations keeps your Source Directory and | ||
| 413 | its configuration entirely inside the Yocto Project's core | ||
| 414 | base. | ||
| 415 | </para> | ||
| 416 | </section> | ||
| 290 | </section> | 417 | </section> |
| 291 | 418 | ||
| 292 | <section id='enabling-your-layer'> | 419 | <section id='enabling-your-layer'> |
| @@ -2469,9 +2596,12 @@ | |||
| 2469 | If you have distro-specific configuration files | 2596 | If you have distro-specific configuration files |
| 2470 | that are included by an existing recipe, you should | 2597 | that are included by an existing recipe, you should |
| 2471 | add a <filename>.bbappend</filename> for those. | 2598 | add a <filename>.bbappend</filename> for those. |
| 2472 | For general information on how to add recipes to | 2599 | For general information and recommendations |
| 2473 | your layer, see the "<link linkend='creating-your-own-layer'>Creating Your Own Layer</link>" | 2600 | on how to add recipes to your layer, see the |
| 2474 | section.</para></listitem> | 2601 | "<link linkend='creating-your-own-layer'>Creating Your Own Layer</link>" |
| 2602 | and | ||
| 2603 | "<link linkend='best-practices-to-follow-when-creating-layers'>Best Practices to Follow When Creating Layers</link>" | ||
| 2604 | sections.</para></listitem> | ||
| 2475 | <listitem><para>Add any image recipes that are specific | 2605 | <listitem><para>Add any image recipes that are specific |
| 2476 | to your distribution.</para></listitem> | 2606 | to your distribution.</para></listitem> |
| 2477 | <listitem><para>Add a <filename>psplash</filename> | 2607 | <listitem><para>Add a <filename>psplash</filename> |
