diff options
Diffstat (limited to 'documentation')
-rw-r--r-- | documentation/poky-ref-manual/technical-details.xml | 381 |
1 files changed, 378 insertions, 3 deletions
diff --git a/documentation/poky-ref-manual/technical-details.xml b/documentation/poky-ref-manual/technical-details.xml index b34179533b..1657431495 100644 --- a/documentation/poky-ref-manual/technical-details.xml +++ b/documentation/poky-ref-manual/technical-details.xml | |||
@@ -151,12 +151,386 @@ | |||
151 | 151 | ||
152 | <para> | 152 | <para> |
153 | By design, the Yocto Project builds everything from scratch unless it can determine that | 153 | By design, the Yocto Project builds everything from scratch unless it can determine that |
154 | a given task's inputs have not changed. | 154 | parts don't need to be rebuilt. |
155 | While building from scratch ensures that everything is current, it does also | 155 | Fundamentally, building from scratch is an attraction as it means all parts are |
156 | mean that a lot of time could be spent rebuiding things that don't necessarily need built. | 156 | built fresh and there is no possibility of stale data causing problems. |
157 | When developers hit problems, they typically default back to building from scratch | ||
158 | so they know the state of things from the start. | ||
159 | </para> | ||
160 | |||
161 | <para> | ||
162 | Building an image from scratch is both an advantage and a disadvantage to the process. | ||
163 | As mentioned in the previous paragraph, building from scratch ensures that | ||
164 | everything is current and starts from a known state. | ||
165 | However, building from scratch also takes much longer as it generally means | ||
166 | rebuiding things that don't necessarily need rebuilt. | ||
167 | </para> | ||
168 | |||
169 | <para> | ||
170 | The Yocto Project implements shared state code that supports incremental builds. | ||
171 | The implementation of the shared state code answers the following questions that | ||
172 | were fundamental roadblocks within the Yocto Project incremental build support system: | ||
173 | <itemizedlist> | ||
174 | <listitem>What pieces of the system have changed and what pieces have not changed?</listitem> | ||
175 | <listitem>How are changed pieces of software removed and replaced?</listitem> | ||
176 | <listitem>How are pre-built components that don't need to be rebuilt from scratch | ||
177 | used when they are available?</listitem> | ||
178 | </itemizedlist> | ||
157 | </para> | 179 | </para> |
158 | 180 | ||
159 | <para> | 181 | <para> |
182 | For the first question, the build system detects changes in the "inputs" to a given task by | ||
183 | creating a checksum (or signature) of the task's inputs. | ||
184 | If the checksum changes, the system assumes the inputs have changed and the task needs to be | ||
185 | rerun. | ||
186 | For the second question, the shared state (sstate) code tracks which tasks add which output | ||
187 | to the build process. | ||
188 | This means the output from a given task can be removed, upgraded or otherwise manipulated. | ||
189 | The third question is partly addressed by the solution for the second question | ||
190 | assuming the build system can fetch the sstate objects from remote locations and | ||
191 | install them if they are deemed to be valid. | ||
192 | </para> | ||
193 | |||
194 | <para> | ||
195 | The rest of this section goes into detail about the overall incremental build | ||
196 | architecture, the checksums (signatures), shared state, and some tips and tricks. | ||
197 | </para> | ||
198 | |||
199 | <section id='overall-architecture'> | ||
200 | <title>Overall Architecture</title> | ||
201 | |||
202 | <para> | ||
203 | When determining what parts of the system need to be built, the Yocto Project | ||
204 | uses a per-task basis and does not use a per-recipe basis. | ||
205 | You might wonder why using a per-task basis is preferred over a per-recipe basis. | ||
206 | To help explain, consider having the IPK packaging backend enabled and then switching to DEB. | ||
207 | In this case, <filename>do_install</filename> and <filename>do_package</filename> | ||
208 | output are still valid. | ||
209 | However, with a per-recipe approach, the build would not include the | ||
210 | <filename>.deb</filename> files. | ||
211 | Consequently, you would have to invalidate the whole build and rerun it. | ||
212 | Rerunning everything is not the best situation. | ||
213 | Also in this case, the core must be "taught" much about specific tasks. | ||
214 | This methodology does not scale well and does not allow users to easily add new tasks | ||
215 | in layers or as external recipes without touching the packaged-staging core. | ||
216 | </para> | ||
217 | </section> | ||
218 | |||
219 | <section id='checksums'> | ||
220 | <title>Checksums (Signatures)</title> | ||
221 | |||
222 | <para> | ||
223 | The Yocto Project uses a checksum, which is a unique signature of a task's | ||
224 | inputs, to determine if a task needs to be run again. | ||
225 | Because it is a change in a task's inputs that trigger a rerun, the process | ||
226 | needs to detect all the inputs to a given task. | ||
227 | For shell tasks, this turns out to be fairly easy because | ||
228 | the build process generates a "run" shell script for each task and | ||
229 | it is possible to create a checksum that gives you a good idea of when | ||
230 | the task's data changes. | ||
231 | </para> | ||
232 | |||
233 | <para> | ||
234 | To complicate the problem, there are things that should not be included in | ||
235 | the checksum. | ||
236 | First, there is the actual specific build path of a given task - | ||
237 | the <filename>WORKDIR</filename>. | ||
238 | It does not matter if the working directory changes because it should not | ||
239 | affect the output for target packages. | ||
240 | Also, the build process has the objective of making native/cross packages relocatable. | ||
241 | The checksum therefore needs to exclude <filename>WORKDIR</filename>. | ||
242 | The simplistic approach for excluding the worknig directory is to set | ||
243 | <filename>WORKDIR</filename> to some fixed value and create the checksum | ||
244 | for the "run" script. | ||
245 | </para> | ||
246 | |||
247 | <para> | ||
248 | Another problem results from the "run" scripts containing functions that | ||
249 | might or might not get called. | ||
250 | The Yocto Project contains code that figures out dependencies between shell | ||
251 | functions. | ||
252 | This code is used to prune the "run" scripts down to the minimum set, | ||
253 | thereby alleviating this problem and making the "run" scripts much more | ||
254 | readable as a bonus. | ||
255 | </para> | ||
256 | |||
257 | <para> | ||
258 | So far we have solutions for shell scripts. | ||
259 | What about python tasks? | ||
260 | Handling these tasks are more difficult but the the same approach | ||
261 | applies. | ||
262 | The process needs to figure out what variables a python function accesses | ||
263 | and what functions it calls. | ||
264 | Again, the Yocto Project contains code that first figures out the variable and function | ||
265 | dependencies, and then creates a checksum for the data used as the input to | ||
266 | the task. | ||
267 | </para> | ||
268 | |||
269 | <para> | ||
270 | Like the <filename>WORKDIR</filename> case, situations exist where dependencies | ||
271 | should be ignored. | ||
272 | For these cases, you can instruct the build process to ignore a dependency | ||
273 | by using a line like the following: | ||
274 | <literallayout class='monospaced'> | ||
275 | PACKAGE_ARCHS[vardepsexclude] = "MACHINE" | ||
276 | </literallayout> | ||
277 | This example ensures that the <filename>PACKAGE_ARCHS</filename> variable does not | ||
278 | depend on the value of <filename>MACHINE</filename>, even if it does reference it. | ||
279 | </para> | ||
280 | |||
281 | <para> | ||
282 | Equally, there are cases where we need to add in dependencies | ||
283 | BitBake is not able to find. | ||
284 | You can accomplish this by using a line like the following: | ||
285 | <literallayout class='monospaced'> | ||
286 | PACKAGE_ARCHS[vardeps] = "MACHINE" | ||
287 | </literallayout> | ||
288 | This example explicitly adds the <filename>MACHINE</filename> variable as a | ||
289 | dependency for <filename>PACKAGE_ARCHS</filename>. | ||
290 | </para> | ||
291 | |||
292 | <para> | ||
293 | Consider a case with inline python, for example, where BitBake is not | ||
294 | able to figure out dependencies. | ||
295 | When running in debug mode (i.e. using <filename>-DDD</filename>), BitBake | ||
296 | produces output when it discovers something for which it cannot figure out | ||
297 | dependencies. | ||
298 | The Yocto Project team has currently not managed to cover those dependencies | ||
299 | in detail and is aware of the need to fix this situation. | ||
300 | </para> | ||
301 | |||
302 | <para> | ||
303 | Thus far, this section has limited discussion to the direct inputs into a | ||
304 | task. | ||
305 | Information based on direct inputs is referred to as the "basehash" in the code. | ||
306 | However, there is still the question of a task's indirect inputs, the things that | ||
307 | were already built and present in the build directory. | ||
308 | The checksum (or signature) for a particular task needs to add the hashes of all the | ||
309 | tasks the particular task depends upon. | ||
310 | Choosing which dependencies to add is a policy decision. | ||
311 | However, the effect is to generate a master checksum that combines the | ||
312 | basehash and the hashes of the task's dependencies. | ||
313 | </para> | ||
314 | |||
315 | <para> | ||
316 | While figuring out the dependencies and creating these checksums is good, | ||
317 | what does the Yocto Project build system do with the checksum information? | ||
318 | The build system uses a signature handler that is responsible for | ||
319 | processing the checksum information. | ||
320 | By default, there is a dummy "noop" signature handler enabled in BitBake. | ||
321 | This means that behaviour is unchanged from previous versions. | ||
322 | OECore uses the "basic" signature handler through this setting in the | ||
323 | <filename>bitbake.conf</filename> file: | ||
324 | <literallayout class='monospaced'> | ||
325 | BB_SIGNATURE_HANDLER ?= "basic" | ||
326 | </literallayout> | ||
327 | Also within the BitBake configuration file, we can give BitBake | ||
328 | some extra information to help it handle this information. | ||
329 | The following statements effectively result in a list of global | ||
330 | list of variable dependency excludes - variables never included in | ||
331 | any checksum: | ||
332 | <literallayout class='monospaced'> | ||
333 | BB_HASHBASE_WHITELIST ?= "TMPDIR FILE PATH PWD BB_TASKHASH BBPATH" | ||
334 | BB_HASHBASE_WHITELIST += "DL_DIR SSTATE_DIR THISDIR FILESEXTRAPATHS" | ||
335 | BB_HASHBASE_WHITELIST += "FILE_DIRNAME HOME LOGNAME SHELL TERM USER" | ||
336 | BB_HASHBASE_WHITELIST += "FILESPATH USERNAME STAGING_DIR_HOST STAGING_DIR_TARGET" | ||
337 | BB_HASHTASK_WHITELIST += "(.*-cross$|.*-native$|.*-cross-initial$| \ | ||
338 | .*-cross-intermediate$|^virtual:native:.*|^virtual:nativesdk:.*)" | ||
339 | </literallayout> | ||
340 | This example is actually where <filename>WORKDIR</filename> | ||
341 | is excluded since <filename>WORKDIR</filename> is constructed as a | ||
342 | path within <filename>TMPDIR</filename>, which is on the whitelist. | ||
343 | </para> | ||
344 | |||
345 | <para> | ||
346 | The <filename>BB_HASHTASK_WHITELIST</filename> covers dependent tasks and | ||
347 | excludes certain kinds of tasks from the dependency chains. | ||
348 | The effect of the previous example is to isolate the native, target, | ||
349 | and cross components. | ||
350 | So, for example, toolchain changes do not force a rebuild of the whole system. | ||
351 | </para> | ||
352 | |||
353 | <para> | ||
354 | The end result of the "basic" handler is to make some dependency and | ||
355 | hash information available to the build. | ||
356 | This includes: | ||
357 | <literallayout class='monospaced'> | ||
358 | BB_BASEHASH_task-<taskname> - the base hashes for each task in the recipe | ||
359 | BB_BASEHASH_<filename:taskname> - the base hashes for each dependent task | ||
360 | BBHASHDEPS_<filename:taskname> - The task dependencies for each task | ||
361 | BB_TASKHASH - the hash of the currently running task | ||
362 | </literallayout> | ||
363 | There is also a "basichash" <filename>BB_SIGNATURE_HANDLER</filename>, | ||
364 | which is the same as the basic version but adds the task hash to the stamp files. | ||
365 | This results in any metadata change that changes the task hash, | ||
366 | automatically causing the task to be run again. | ||
367 | This removes the need to bump <filename>PR</filename> | ||
368 | values and changes to metadata automatically ripple across the build. | ||
369 | Currently, this behavior is not the default behavior. | ||
370 | However, it is likely that the Yocto Project team will go forward with this | ||
371 | behavior in the future since all the functionality exists. | ||
372 | The reason for the delay is the potential impact to the distribution feed | ||
373 | creation as they need increasing <filename>PR</filename> fields | ||
374 | and the Yocto Project currently lacks a mechanism to automate incrementing | ||
375 | this field. | ||
376 | </para> | ||
377 | </section> | ||
378 | |||
379 | <section id='shared-state'> | ||
380 | <title>Shared State</title> | ||
381 | |||
382 | <para> | ||
383 | Checksums and dependencies as discussed in the previous section solves half the | ||
384 | problem. | ||
385 | The other part of the problem is being able to use checksum information during the build | ||
386 | and being able to reuse or rebuild specific components. | ||
387 | </para> | ||
388 | |||
389 | <para> | ||
390 | The shared state class (<filename>sstate.bbclass</filename>) | ||
391 | is a relatively generic implementation of how to | ||
392 | "capture" a snapshot of a given task. | ||
393 | The idea is that the build process does not care about the source of a | ||
394 | task's output. | ||
395 | Output could be freshly built or it could be downloaded and unpacked from | ||
396 | somewhere - the build process doesn't need to worry about its source. | ||
397 | </para> | ||
398 | |||
399 | <para> | ||
400 | There are two types of output, one is just about creating a directory | ||
401 | in <filename>WORKDIR</filename>. | ||
402 | A good example is the output of either <filename>do_install</filename> or | ||
403 | <filename>do_package</filename>. | ||
404 | The other type of output occurs when a set of data is merged into a shared directory | ||
405 | tree such as the sysroot. | ||
406 | </para> | ||
407 | |||
408 | <para> | ||
409 | The Yocto Project team has tried to keep the details of the implementation hidden in | ||
410 | <filename>sstate.bbclass</filename>. | ||
411 | From a user's perspective, adding shared state wrapping to a task | ||
412 | is as simple as this <filename>do_deploy</filename> example taken from | ||
413 | <filename>do_deploy.bbclass</filename>: | ||
414 | <literallayout class='monospaced'> | ||
415 | DEPLOYDIR = "${WORKDIR}/deploy-${PN}" | ||
416 | SSTATETASKS += "do_deploy" | ||
417 | do_deploy[sstate-name] = "deploy" | ||
418 | do_deploy[sstate-inputdirs] = "${DEPLOYDIR}" | ||
419 | do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}" | ||
420 | |||
421 | python do_deploy_setscene () { | ||
422 | sstate_setscene(d) | ||
423 | } | ||
424 | addtask do_deploy_setscene | ||
425 | </literallayout> | ||
426 | In the example, we add some extra flags to the task, a name field ("deploy"), an | ||
427 | input directory where the task sends data, and the output | ||
428 | directory where the data from the task should eventually be copied. | ||
429 | We also add a <filename>_setscene</filename> variant of the task and add the task | ||
430 | name to the <filename>SSTATETASKS</filename> list. | ||
431 | </para> | ||
432 | |||
433 | <para> | ||
434 | If you have a directory whose contents you need to preserve, | ||
435 | you can do this with a line like the following: | ||
436 | <literallayout class='monospaced'> | ||
437 | do_package[sstate-plaindirs] = "${PKGD} ${PKGDEST}" | ||
438 | </literallayout> | ||
439 | This method, as well as the following example, also works for mutliple directories. | ||
440 | <literallayout class='monospaced'> | ||
441 | do_package[sstate-inputdirs] = "${PKGDESTWORK} ${SHLIBSWORKDIR}" | ||
442 | do_package[sstate-outputdirs] = "${PKGDATA_DIR} ${SHLIBSDIR}" | ||
443 | do_package[sstate-lockfile] = "${PACKAGELOCK}" | ||
444 | </literallayout> | ||
445 | These methods also include the ability to take a lockfile when manipulating | ||
446 | shared state directory structures since some cases are sensitive to file | ||
447 | additions or removals. | ||
448 | </para> | ||
449 | |||
450 | <para> | ||
451 | Behind the scenes, the shared state code works by looking in | ||
452 | <filename>SSTATE_DIR</filename> and | ||
453 | <filename>SSTATE_MIRRORS</filename> for shared state files. | ||
454 | Here is an example: | ||
455 | <literallayout class='monospaced'> | ||
456 | SSTATE_MIRRORS ?= "\ | ||
457 | file://.* http://someserver.tld/share/sstate/ \n \ | ||
458 | file://.* file:///some/local/dir/sstate/" | ||
459 | </literallayout> | ||
460 | </para> | ||
461 | |||
462 | <para> | ||
463 | The shared state package validity can be detected just by looking at the | ||
464 | filename since the filename contains the task checksum (or signature) as | ||
465 | described earlier in this section. | ||
466 | If a valid shared state package is found, the build process downloads it | ||
467 | and uses it to accelerate the task. | ||
468 | </para> | ||
469 | |||
470 | <para> | ||
471 | The build processes uses the <filename>*_setscene</filename> tasks | ||
472 | for the task acceleration phase. | ||
473 | BitBake goes through this phase before the main execution code and tries | ||
474 | to accelerate any tasks for which it can find shared state packages. | ||
475 | If a shared state package for a task is available, the shared state | ||
476 | package is used. | ||
477 | This means the task and any tasks on which it is dependent are not | ||
478 | executed. | ||
479 | </para> | ||
480 | |||
481 | <para> | ||
482 | As a real world example, the aim is when building an IPK-based image, | ||
483 | only the <filename>do_package_write_ipk</filename> tasks would have their | ||
484 | shared state packages fetched and extracted. | ||
485 | Since the sysroot is not used, it would never get extracted. | ||
486 | This is another reason to prefer the task-based approach over a | ||
487 | recipe-based approach, which would have to install the output from every task. | ||
488 | </para> | ||
489 | </section> | ||
490 | |||
491 | <section id='tips-and-tricks'> | ||
492 | <title>Tips and Tricks</title> | ||
493 | |||
494 | <para> | ||
495 | The code in the Yocto Project that supports incremental builds is not | ||
496 | simple code. | ||
497 | Consequently, when things go wrong, debugging needs to be straightforward. | ||
498 | Because of this, the Yocto Project team included strong debugging | ||
499 | tools. | ||
500 | </para> | ||
501 | |||
502 | <para> | ||
503 | First, whenever a shared state package is written out, so is a | ||
504 | corresponding <filename>.siginfo</filename> file. | ||
505 | This practice results in a pickled python database of all | ||
506 | the metadata that went into creating the hash for a given shared state | ||
507 | package. | ||
508 | </para> | ||
509 | |||
510 | <para> | ||
511 | Second, if BitBake is run with the <filename>--dump-signatures</filename> | ||
512 | (or <filename>-S</filename>) option, BitBake dumps out | ||
513 | <filename>.siginfo</filename> files in | ||
514 | the stamp directory for every task it would have executed instead of | ||
515 | building the target package specified. | ||
516 | </para> | ||
517 | |||
518 | <para> | ||
519 | Finally, there is a <filename>bitbake-diffsigs</filename> command that | ||
520 | can process these <filename>.siginfo</filename> files. | ||
521 | If one file is specified, it will dump out the dependency | ||
522 | information in the file. | ||
523 | If two files are specified, it will compare the | ||
524 | two files and dump out the differences between the two. | ||
525 | This allows the question of "What changed between X and Y?" to be | ||
526 | answered easily. | ||
527 | </para> | ||
528 | </section> | ||
529 | </section> | ||
530 | |||
531 | <!-- | ||
532 | |||
533 | <para> | ||
160 | The Yocto Project build process uses a shared state caching scheme to avoid having to | 534 | The Yocto Project build process uses a shared state caching scheme to avoid having to |
161 | rebuild software when it is not necessary. | 535 | rebuild software when it is not necessary. |
162 | Because the build time for a Yocto image can be significant, it is helpful to try and | 536 | Because the build time for a Yocto image can be significant, it is helpful to try and |
@@ -222,6 +596,7 @@ | |||
222 | <ulink url='http://git.yoctoproject.org/cgit.cgi/poky/commit/meta/classes/package.bbclass?id=737f8bbb4f27b4837047cb9b4fbfe01dfde36d54'>commit</ulink>. | 596 | <ulink url='http://git.yoctoproject.org/cgit.cgi/poky/commit/meta/classes/package.bbclass?id=737f8bbb4f27b4837047cb9b4fbfe01dfde36d54'>commit</ulink>. |
223 | </note> | 597 | </note> |
224 | </section> | 598 | </section> |
599 | --> | ||
225 | 600 | ||
226 | </chapter> | 601 | </chapter> |
227 | <!-- | 602 | <!-- |