diff options
author | Scott Rifenbark <scott.m.rifenbark@intel.com> | 2013-09-12 15:34:48 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-09-22 12:20:42 +0100 |
commit | dcefb7cccf9f9ff1d383299804504fc76397a8ab (patch) | |
tree | 1ac5954a5a6ab49536fd02fadc7b6e78d208f5a3 /documentation/dev-manual/dev-manual-common-tasks.xml | |
parent | b1b9f43ca41394b3e81fbcd0d30350e0d4d68c94 (diff) | |
download | poky-dcefb7cccf9f9ff1d383299804504fc76397a8ab.tar.gz |
dev-manual: Added new section on "Best Practices"
Fixes [YOCTO #5037]
The information to fix this bug was very similar to some
"best practices" and "recommendations" information that was
currently buried in a section that described how to create a
layer. So, since the new information for this bug fix increased
the amount of information significantly, I have pulled out the
existing "recommendations" and "best practices" information and
combined it with this new information and placed it in its
own section dedicated to just that. The information still
resides in the main section that introduces and discusses
layers and their creation.
This is a first draft of the section. It is under review.
(From yocto-docs rev: 066de04511afb0641278f3fda4e97718b3ed5c47)
Signed-off-by: Scott Rifenbark <scott.m.rifenbark@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation/dev-manual/dev-manual-common-tasks.xml')
-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> |