xref: /openbmc/openbmc/poky/documentation/sdk-manual/extensible.rst (revision 96e4b4e121e0e2da1535d7d537d6a982a6ff5bc0)
1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
3************************
4Using the Extensible SDK
5************************
6
7This chapter describes the extensible SDK and how to install it.
8Information covers the pieces of the SDK, how to install it, and
9presents a look at using the ``devtool`` functionality. The extensible
10SDK makes it easy to add new applications and libraries to an image,
11modify the source for an existing component, test changes on the target
12hardware, and ease integration into the rest of the
13:term:`OpenEmbedded Build System`.
14
15.. note::
16
17   For a side-by-side comparison of main features supported for an
18   extensible SDK as compared to a standard SDK, see the
19   :ref:`sdk-manual/intro:introduction` section.
20
21In addition to the functionality available through ``devtool``, you can
22alternatively make use of the toolchain directly, for example from
23Makefile and Autotools. See the
24":ref:`sdk-manual/working-projects:using the sdk toolchain directly`" chapter
25for more information.
26
27Why use the Extensible SDK and What is in It?
28=============================================
29
30The extensible SDK provides a cross-development toolchain and libraries
31tailored to the contents of a specific image. You would use the
32Extensible SDK if you want a toolchain experience supplemented with the
33powerful set of ``devtool`` commands tailored for the Yocto Project
34environment.
35
36The installed extensible SDK consists of several files and directories.
37Basically, it contains an SDK environment setup script, some
38configuration files, an internal build system, and the ``devtool``
39functionality.
40
41Installing the Extensible SDK
42=============================
43
44Two ways to install the Extensible SDK
45--------------------------------------
46
47Extensible SDK can be installed in two different ways, and both have
48their own pros and cons:
49
50#. *Setting up the Extensible SDK environment directly in a Yocto build*. This
51   avoids having to produce, test, distribute and maintain separate SDK
52   installer archives, which can get very large. There is only one environment
53   for the regular Yocto build and the SDK and less code paths where things can
54   go not according to plan. It's easier to update the SDK: it simply means
55   updating the Yocto layers with git fetch or layer management tooling. The
56   SDK extensibility is better than in the second option: just run ``bitbake``
57   again to add more things to the sysroot, or add layers if even more things
58   are required.
59
60#. *Setting up the Extensible SDK from a standalone installer*. This has the
61   benefit of having a single, self-contained archive that includes all the
62   needed binary artifacts. So nothing needs to be rebuilt, and there is no
63   need to provide a well-functioning binary artefact cache over the network
64   for developers with underpowered laptops.
65
66.. _setting_up_ext_sdk_in_build:
67
68Setting up the Extensible SDK environment directly in a Yocto build
69-------------------------------------------------------------------
70
71#. Set up all the needed layers and a Yocto :term:`Build Directory`, e.g. a regular Yocto
72   build where ``bitbake`` can be executed.
73
74#. Run::
75
76      $ bitbake meta-ide-support
77      $ bitbake -c populate_sysroot gtk+3
78      # or any other target or native item that the application developer would need
79      $ bitbake build-sysroots -c build_native_sysroot && bitbake build-sysroots -c build_target_sysroot
80
81Setting up the Extensible SDK from a standalone installer
82---------------------------------------------------------
83
84The first thing you need to do is install the SDK on your :term:`Build
85Host` by running the ``*.sh`` installation script.
86
87You can download a tarball installer, which includes the pre-built
88toolchain, the ``runqemu`` script, the internal build system,
89``devtool``, and support files from the appropriate
90:yocto_dl:`toolchain </releases/yocto/yocto-&DISTRO;/toolchain/>` directory within the Index of
91Releases. Toolchains are available for several 32-bit and 64-bit
92architectures with the ``x86_64`` directories, respectively. The
93toolchains the Yocto Project provides are based off the
94``core-image-sato`` and ``core-image-minimal`` images and contain
95libraries appropriate for developing against that image.
96
97The names of the tarball installer scripts are such that a string
98representing the host system appears first in the filename and then is
99immediately followed by a string representing the target architecture.
100An extensible SDK has the string "-ext" as part of the name. Following
101is the general form::
102
103   poky-glibc-host_system-image_type-arch-toolchain-ext-release_version.sh
104
105   Where:
106       host_system is a string representing your development system:
107
108                  i686 or x86_64.
109
110       image_type is the image for which the SDK was built:
111
112                  core-image-sato or core-image-minimal
113
114       arch is a string representing the tuned target architecture:
115
116                  aarch64, armv5e, core2-64, i586, mips32r2, mips64, ppc7400, or cortexa8hf-neon
117
118       release_version is a string representing the release number of the Yocto Project:
119
120                  &DISTRO;, &DISTRO;+snapshot
121
122For example, the following SDK installer is for a 64-bit
123development host system and a i586-tuned target architecture based off
124the SDK for ``core-image-sato`` and using the current &DISTRO; snapshot::
125
126   poky-glibc-x86_64-core-image-sato-i586-toolchain-ext-&DISTRO;.sh
127
128.. note::
129
130   As an alternative to downloading an SDK, you can build the SDK
131   installer. For information on building the installer, see the
132   :ref:`sdk-manual/appendix-obtain:building an sdk installer`
133   section.
134
135The SDK and toolchains are self-contained and by default are installed
136into the ``poky_sdk`` folder in your home directory. You can choose to
137install the extensible SDK in any location when you run the installer.
138However, because files need to be written under that directory during
139the normal course of operation, the location you choose for installation
140must be writable for whichever users need to use the SDK.
141
142The following command shows how to run the installer given a toolchain
143tarball for a 64-bit x86 development host system and a 64-bit x86 target
144architecture. The example assumes the SDK installer is located in
145``~/Downloads/`` and has execution rights::
146
147   $ ./Downloads/poky-glibc-x86_64-core-image-minimal-core2-64-toolchain-ext-2.5.sh
148   Poky (Yocto Project Reference Distro) Extensible SDK installer version 2.5
149   ==========================================================================
150   Enter target directory for SDK (default: poky_sdk):
151   You are about to install the SDK to "/home/scottrif/poky_sdk". Proceed [Y/n]? Y
152   Extracting SDK..............done
153   Setting it up...
154   Extracting buildtools...
155   Preparing build system...
156   Parsing recipes: 100% |##################################################################| Time: 0:00:52
157   Initialising tasks: 100% |###############################################################| Time: 0:00:00
158   Checking sstate mirror object availability: 100% |#######################################| Time: 0:00:00
159   Loading cache: 100% |####################################################################| Time: 0:00:00
160   Initialising tasks: 100% |###############################################################| Time: 0:00:00
161   done
162   SDK has been successfully set up and is ready to be used.
163   Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
164    $ . /home/scottrif/poky_sdk/environment-setup-core2-64-poky-linux
165
166.. note::
167
168   If you do not have write permissions for the directory into which you
169   are installing the SDK, the installer notifies you and exits. For
170   that case, set up the proper permissions in the directory and run the
171   installer again.
172
173.. _running_the_ext_sdk_env:
174
175Running the Extensible SDK Environment Setup Script
176===================================================
177
178Once you have the SDK installed, you must run the SDK environment setup
179script before you can actually use the SDK.
180
181When using an SDK directly in a Yocto build, you will find the script in
182``tmp/deploy/images/qemux86-64/`` in your :term:`Build Directory`.
183
184When using a standalone SDK installer, this setup script resides in
185the directory you chose when you installed the SDK, which is either the
186default ``poky_sdk`` directory or the directory you chose during
187installation.
188
189Before running the script, be sure it is the one that matches the
190architecture for which you are developing. Environment setup scripts
191begin with the string "``environment-setup``" and include as part of
192their name the tuned target architecture. As an example, the following
193commands set the working directory to where the SDK was installed and
194then source the environment setup script. In this example, the setup
195script is for an IA-based target machine using i586 tuning::
196
197   $ cd /home/scottrif/poky_sdk
198   $ source environment-setup-core2-64-poky-linux
199   SDK environment now set up; additionally you may now run devtool to perform development tasks.
200   Run devtool --help for further details.
201
202When using the environment script directly in a Yocto build, it can
203be run similarly::
204
205   $ source tmp/deploy/images/qemux86-64/environment-setup-core2-64-poky-linux
206
207Running the setup script defines many environment variables needed in order to
208use the SDK (e.g. ``PATH``, :term:`CC`, :term:`LD`, and so forth). If you want
209to see all the environment variables the script exports, examine the
210installation file itself.
211
212.. _using_devtool:
213
214Using ``devtool`` in Your SDK Workflow
215======================================
216
217The cornerstone of the extensible SDK is a command-line tool called
218``devtool``. This tool provides a number of features that help you
219build, test and package software within the extensible SDK, and
220optionally integrate it into an image built by the OpenEmbedded build
221system.
222
223.. note::
224
225   The use of ``devtool`` is not limited to the extensible SDK. You can use
226   ``devtool`` to help you easily develop any project whose build output must be
227   part of an image built using the build system.
228
229The ``devtool`` command line is organized similarly to
230:ref:`overview-manual/development-environment:git` in that it has a number of
231sub-commands for each function. You can run ``devtool --help`` to see
232all the commands.
233
234.. note::
235
236   See the ":doc:`/ref-manual/devtool-reference`"
237   section in the Yocto Project Reference Manual.
238
239``devtool`` subcommands provide entry-points into development:
240
241-  *devtool add*: Assists in adding new software to be built.
242
243-  *devtool modify*: Sets up an environment to enable you to modify
244   the source of an existing component.
245
246-  *devtool ide-sdk*: Generates a configuration for an IDE.
247
248-  *devtool upgrade*: Updates an existing recipe so that you can
249   build it for an updated set of source files.
250
251As with the build system, "recipes" represent software packages within
252``devtool``. When you use ``devtool add``, a recipe is automatically
253created. When you use ``devtool modify``, the specified existing recipe
254is used in order to determine where to get the source code and how to
255patch it. In both cases, an environment is set up so that when you build
256the recipe a source tree that is under your control is used in order to
257allow you to make changes to the source as desired. By default, new
258recipes and the source go into a "workspace" directory under the SDK.
259
260The remainder of this section presents the ``devtool add``,
261``devtool modify``, and ``devtool upgrade`` workflows.
262
263Use ``devtool add`` to Add an Application
264-----------------------------------------
265
266The ``devtool add`` command generates a new recipe based on existing
267source code. This command takes advantage of the
268:ref:`devtool-the-workspace-layer-structure`
269layer that many ``devtool`` commands use. The command is flexible enough
270to allow you to extract source code into both the workspace or a
271separate local Git repository and to use existing code that does not
272need to be extracted.
273
274Depending on your particular scenario, the arguments and options you use
275with ``devtool add`` form different combinations. The following diagram
276shows common development flows you would use with the ``devtool add``
277command:
278
279.. image:: figures/sdk-devtool-add-flow.png
280   :width: 100%
281
282#. *Generating the New Recipe*: The top part of the flow shows three
283   scenarios by which you could use ``devtool add`` to generate a recipe
284   based on existing source code.
285
286   In a shared development environment, it is typical for other
287   developers to be responsible for various areas of source code. As a
288   developer, you are probably interested in using that source code as
289   part of your development within the Yocto Project. All you need is
290   access to the code, a recipe, and a controlled area in which to do
291   your work.
292
293   Within the diagram, three possible scenarios feed into the
294   ``devtool add`` workflow:
295
296   -  *Left*: The left scenario in the figure represents a common
297      situation where the source code does not exist locally and needs
298      to be extracted. In this situation, the source code is extracted
299      to the default workspace --- you do not want the files in some
300      specific location outside of the workspace. Thus, everything you
301      need will be located in the workspace::
302
303         $ devtool add recipe fetchuri
304
305      With this command, ``devtool`` extracts the upstream
306      source files into a local Git repository within the ``sources``
307      folder. The command then creates a recipe named recipe and a
308      corresponding append file in the workspace. If you do not provide
309      recipe, the command makes an attempt to determine the recipe name.
310
311   -  *Middle*: The middle scenario in the figure also represents a
312      situation where the source code does not exist locally. In this
313      case, the code is again upstream and needs to be extracted to some
314      local area --- this time outside of the default workspace.
315
316      .. note::
317
318         If required, ``devtool`` always creates a Git repository locally
319         during the extraction.
320
321      Furthermore, the first positional argument ``srctree`` in this case
322      identifies where the ``devtool add`` command will locate the
323      extracted code outside of the workspace. You need to specify an
324      empty directory::
325
326         $ devtool add recipe srctree fetchuri
327
328      In summary, the source code is pulled from fetchuri and extracted into the
329      location defined by ``srctree`` as a local Git repository.
330
331      Within workspace, ``devtool`` creates a recipe named recipe along
332      with an associated append file.
333
334   -  *Right*: The right scenario in the figure represents a situation
335      where the ``srctree`` has been previously prepared outside of the
336      ``devtool`` workspace.
337
338      The following command provides a new recipe name and identifies
339      the existing source tree location::
340
341         $ devtool add recipe srctree
342
343      The command examines the source code and creates a recipe named
344      recipe for the code and places the recipe into the workspace.
345
346      Because the extracted source code already exists, ``devtool`` does
347      not try to relocate the source code into the workspace --- only the
348      new recipe is placed in the workspace.
349
350      Aside from a recipe folder, the command also creates an associated
351      append folder and places an initial ``*.bbappend`` file within.
352
353#. *Edit the Recipe*: You can use ``devtool edit-recipe`` to open up the
354   editor as defined by the ``$EDITOR`` environment variable and modify
355   the file::
356
357      $ devtool edit-recipe recipe
358
359   From within the editor, you can make modifications to the recipe that
360   take effect when you build it later.
361
362#. *Build the Recipe or Rebuild the Image*: The next step you take
363   depends on what you are going to do with the new code.
364
365   If you need to eventually move the build output to the target
366   hardware, use the following ``devtool`` command::
367
368      $ devtool build recipe
369
370   On the other hand, if you want an image to contain the recipe's
371   packages from the workspace for immediate deployment onto a device
372   (e.g. for testing purposes), you can use the ``devtool build-image``
373   command::
374
375      $ devtool build-image image
376
377#. *Deploy the Build Output*: When you use the ``devtool build`` command
378   to build out your recipe, you probably want to see if the resulting
379   build output works as expected on the target hardware.
380
381   .. note::
382
383      This step assumes you have a previously built image that is
384      already either running in QEMU or is running on actual hardware.
385      Also, it is assumed that for deployment of the image to the
386      target, SSH is installed in the image and, if the image is running
387      on real hardware, you have network access to and from your
388      development machine.
389
390   You can deploy your build output to that target hardware by using the
391   ``devtool deploy-target`` command::
392
393      $ devtool deploy-target recipe target
394
395   The target is a live target machine running as an SSH server.
396
397   You can, of course, also deploy the image you build to actual
398   hardware by using the ``devtool build-image`` command. However,
399   ``devtool`` does not provide a specific command that allows you to
400   deploy the image to actual hardware.
401
402#. *Finish Your Work With the Recipe*: The ``devtool finish`` command
403   creates any patches corresponding to commits in the local Git
404   repository, moves the new recipe to a more permanent layer, and then
405   resets the recipe so that the recipe is built normally rather than
406   from the workspace::
407
408      $ devtool finish recipe layer
409
410   .. note::
411
412      Any changes you want to turn into patches must be committed to the
413      Git repository in the source tree.
414
415   As mentioned, the ``devtool finish`` command moves the final recipe
416   to its permanent layer.
417
418   As a final process of the ``devtool finish`` command, the state of
419   the standard layers and the upstream source is restored so that you
420   can build the recipe from those areas rather than the workspace.
421
422   .. note::
423
424      You can use the ``devtool reset`` command to put things back should you
425      decide you do not want to proceed with your work. If you do use this
426      command, realize that the source tree is preserved.
427
428Use ``devtool modify`` to Modify the Source of an Existing Component
429--------------------------------------------------------------------
430
431The ``devtool modify`` command prepares the way to work on existing code
432that already has a local recipe in place that is used to build the
433software. The command is flexible enough to allow you to extract code
434from an upstream source, specify the existing recipe, and keep track of
435and gather any patch files from other developers that are associated
436with the code.
437
438Depending on your particular scenario, the arguments and options you use
439with ``devtool modify`` form different combinations. The following
440diagram shows common development flows for the ``devtool modify``
441command:
442
443.. image:: figures/sdk-devtool-modify-flow.png
444   :width: 100%
445
446#. *Preparing to Modify the Code*: The top part of the flow shows three
447   scenarios by which you could use ``devtool modify`` to prepare to
448   work on source files. Each scenario assumes the following:
449
450   -  The recipe exists locally in a layer external to the ``devtool``
451      workspace.
452
453   -  The source files exist either upstream in an un-extracted state or
454      locally in a previously extracted state.
455
456   The typical situation is where another developer has created a layer
457   for use with the Yocto Project and their recipe already resides in
458   that layer. Furthermore, their source code is readily available
459   either upstream or locally.
460
461   -  *Left*: The left scenario in the figure represents a common
462      situation where the source code does not exist locally and it
463      needs to be extracted from an upstream source. In this situation,
464      the source is extracted into the default ``devtool`` workspace
465      location. The recipe, in this scenario, is in its own layer
466      outside the workspace (i.e. ``meta-``\ layername).
467
468      The following command identifies the recipe and, by default,
469      extracts the source files::
470
471         $ devtool modify recipe
472
473      Once ``devtool`` locates the recipe, ``devtool`` uses the recipe's
474      :term:`SRC_URI` statements to locate the source code and any local
475      patch files from other developers.
476
477      With this scenario, there is no ``srctree`` argument. Consequently, the
478      default behavior of the ``devtool modify`` command is to extract
479      the source files pointed to by the :term:`SRC_URI` statements into a
480      local Git structure. Furthermore, the location for the extracted
481      source is the default area within the ``devtool`` workspace. The
482      result is that the command sets up both the source code and an
483      append file within the workspace while the recipe remains in its
484      original location.
485
486      Additionally, if you have any non-patch local files (i.e. files
487      referred to with ``file://`` entries in :term:`SRC_URI` statement
488      excluding ``*.patch/`` or ``*.diff``), these files are copied to
489      an ``oe-local-files`` folder under the newly created source tree.
490      Copying the files here gives you a convenient area from which you
491      can modify the files. Any changes or additions you make to those
492      files are incorporated into the build the next time you build the
493      software just as are other changes you might have made to the
494      source.
495
496   -  *Middle*: The middle scenario in the figure represents a situation
497      where the source code also does not exist locally. In this case,
498      the code is again upstream and needs to be extracted to some local
499      area as a Git repository. The recipe, in this scenario, is again
500      local and in its own layer outside the workspace.
501
502      The following command tells ``devtool`` the recipe with which to
503      work and, in this case, identifies a local area for the extracted
504      source files that exists outside of the default ``devtool``
505      workspace::
506
507         $ devtool modify recipe srctree
508
509      .. note::
510
511         You cannot provide a URL for ``srctree`` using the ``devtool`` command.
512
513      As with all extractions, the command uses the recipe's :term:`SRC_URI`
514      statements to locate the source files and any associated patch
515      files. Non-patch files are copied to an ``oe-local-files`` folder
516      under the newly created source tree.
517
518      Once the files are located, the command by default extracts them
519      into ``srctree``.
520
521      Within workspace, ``devtool`` creates an append file for the
522      recipe. The recipe remains in its original location but the source
523      files are extracted to the location you provide with ``srctree``.
524
525   -  *Right*: The right scenario in the figure represents a situation
526      where the source tree (``srctree``) already exists locally as a
527      previously extracted Git structure outside of the ``devtool``
528      workspace. In this example, the recipe also exists elsewhere
529      locally in its own layer.
530
531      The following command tells ``devtool`` the recipe with which to
532      work, uses the "-n" option to indicate source does not need to be
533      extracted, and uses ``srctree`` to point to the previously extracted
534      source files::
535
536         $ devtool modify -n recipe srctree
537
538      If an ``oe-local-files`` subdirectory happens to exist and it
539      contains non-patch files, the files are used. However, if the
540      subdirectory does not exist and you run the ``devtool finish``
541      command, any non-patch files that might exist next to the recipe
542      are removed because it appears to ``devtool`` that you have
543      deleted those files.
544
545      Once the ``devtool modify`` command finishes, it creates only an
546      append file for the recipe in the ``devtool`` workspace. The
547      recipe and the source code remain in their original locations.
548
549#. *Edit the Source*: Once you have used the ``devtool modify`` command,
550   you are free to make changes to the source files. You can use any
551   editor you like to make and save your source code modifications.
552
553#. *Build the Recipe or Rebuild the Image*: The next step you take
554   depends on what you are going to do with the new code.
555
556   If you need to eventually move the build output to the target
557   hardware, use the following ``devtool`` command::
558
559      $ devtool build recipe
560
561   On the other hand, if you want an image to contain the recipe's
562   packages from the workspace for immediate deployment onto a device
563   (e.g. for testing purposes), you can use the ``devtool build-image``
564   command::
565
566      $ devtool build-image image
567
568#. *Deploy the Build Output*: When you use the ``devtool build`` command
569   to build out your recipe, you probably want to see if the resulting
570   build output works as expected on target hardware.
571
572   .. note::
573
574      This step assumes you have a previously built image that is
575      already either running in QEMU or running on actual hardware.
576      Also, it is assumed that for deployment of the image to the
577      target, SSH is installed in the image and if the image is running
578      on real hardware that you have network access to and from your
579      development machine.
580
581   You can deploy your build output to that target hardware by using the
582   ``devtool deploy-target`` command::
583
584      $ devtool deploy-target recipe target
585
586   The target is a live target machine running as an SSH server.
587
588   You can, of course, use other methods to deploy the image you built
589   using the ``devtool build-image`` command to actual hardware.
590   ``devtool`` does not provide a specific command to deploy the image
591   to actual hardware.
592
593#. *Finish Your Work With the Recipe*: The ``devtool finish`` command
594   creates any patches corresponding to commits in the local Git
595   repository, updates the recipe to point to them (or creates a
596   ``.bbappend`` file to do so, depending on the specified destination
597   layer), and then resets the recipe so that the recipe is built
598   normally rather than from the workspace::
599
600      $ devtool finish recipe layer
601
602   .. note::
603
604      Any changes you want to turn into patches must be staged and
605      committed within the local Git repository before you use the
606      ``devtool finish`` command.
607
608   Because there is no need to move the recipe, ``devtool finish``
609   either updates the original recipe in the original layer or the
610   command creates a ``.bbappend`` file in a different layer as provided
611   by layer. Any work you did in the ``oe-local-files`` directory is
612   preserved in the original files next to the recipe during the
613   ``devtool finish`` command.
614
615   As a final process of the ``devtool finish`` command, the state of
616   the standard layers and the upstream source is restored so that you
617   can build the recipe from those areas rather than from the workspace.
618
619   .. note::
620
621      You can use the ``devtool reset`` command to put things back should you
622      decide you do not want to proceed with your work. If you do use this
623      command, realize that the source tree is preserved.
624
625``devtool ide-sdk`` configures IDEs and bootstraps SDKs
626-------------------------------------------------------
627
628The ``devtool ide-sdk`` command can provide an IDE configuration for IDEs when
629working on the source code of one or more recipes.
630Depending on the programming language, and the build system used by the recipe,
631the tools required for cross-development and remote debugging are different.
632For example:
633
634-  A C/C++ project usually uses CMake or Meson.
635
636-  A Python project uses setuptools or one of its successors.
637
638-  A Rust project uses Cargo.
639
640Also, the IDE plugins needed for the integration of a build system with the
641IDE and the corresponding settings are usually specific to these build-systems.
642To hide all these details from the user, ``devtool ide-sdk`` does two things:
643
644-  It generates any kind of SDK needed for cross-development and remote
645   debugging of the specified recipes.
646
647-  It generates the configuration for the IDE (and the IDE plugins) for using
648   the cross-toolchain and remote debugging tools provided by the SDK directly
649   from the IDE.
650
651For supported build systems the configurations generated by ``devtool ide-sdk``
652combine the advantages of the ``devtool modify`` based workflow
653(see :ref:`using_devtool`) with the advantages of the simple Environment Setup
654script based workflow (see :ref:`running_the_ext_sdk_env`) provided by Yocto's
655SDK or eSDK:
656
657-  The source code of the recipe is in the workspace created by
658   ``devtool modify`` or ``devtool add``.
659   Using ``devtool build``, ``devtool build-image``,
660   ``devtool deploy-target`` or ``bitbake`` is possible.
661   Also ``devtool ide-sdk`` can be used to update the SDK and the IDE
662   configuration at any time.
663
664-  ``devtool ide-sdk`` aims to support multiple programming languages and
665   multiple IDEs natively. "Natively" means that the IDE is configured to call
666   the build tool (e.g. ``cmake`` or ``meson``) directly. This has several
667   advantages.
668   First of all, it is usually much faster to call for example ``cmake`` than
669   ``devtool build``.
670   It also allows to benefit from the very good integration that IDEs like
671   VSCode offer for tools like CMake or GDB.
672
673   However, supporting many programming languages and multiple
674   IDEs is quite an elaborate and constantly evolving thing. Support for IDEs
675   is therefore implemented as plugins. Plugins can also be provided by
676   optional layers.
677
678So much about the introduction to the default mode of ``devtool sdk-ide`` which
679is called the "modified" mode because it uses the workspace created by
680``devtool modify`` and the per recipe :term:`Sysroots <Sysroot>` of BitBake.
681
682For some recipes and use cases, this default behavior of ``devtool ide-sdk``
683with full ``devtool`` and ``bitbake`` integration might not be suitable.
684To offer full feature parity with the SDK and the eSDK, ``devtool ide-sdk`` has
685a second mode called "shared" mode.
686If ``devtool ide-sdk`` is called with the ``--mode=shared`` option, it
687bootstraps an SDK directly from the BitBake environment, which offers the same
688Environment Setup script as described in :ref:`running_the_ext_sdk_env`.
689In addition to the (e)SDK installer-based setup, the IDE gets configured
690to use the shared :term:`Sysroots <Sysroot>` and the tools from the SDK.
691``devtool ide-sdk --mode=shared`` is basically a wrapper for the setup of the
692extensible SDK as described in :ref:`setting_up_ext_sdk_in_build`.
693
694The use of ``devtool ide-sdk`` is an alternative to using one of the SDK
695installers.
696``devtool ide-sdk`` allows the creation of SDKs that offer all the
697functionality of the SDK and the eSDK installers. Compared to the installers,
698however, the SDK created with ``devtool ide-sdk`` is much more flexible.
699For example, it is very easy to change the :term:`MACHINE` in the
700``local.conf`` file, update the layer meta data and then regenerate the SDK.
701
702Let's take a look at an example of how to use ``devtool ide-sdk`` in each of
703the two modes:
704
705#. *Modified mode*:
706
707   In order to use the ``devtool ide-sdk``, a few settings are needed. As a
708   starting example, the following lines of code can be added to the
709   ``local.conf`` file::
710
711      # Build the companion debug file system
712      IMAGE_GEN_DEBUGFS = "1"
713      # Optimize build time: with devtool ide-sdk the dbg tar is not needed
714      IMAGE_FSTYPES_DEBUGFS = ""
715      # Without copying the binaries into roofs-dbg, GDB does not find all source files.
716      IMAGE_CLASSES += "image-combined-dbg"
717
718      # SSH is mandatory, no password simplifies the usage
719      EXTRA_IMAGE_FEATURES += "\
720         ssh-server-openssh \
721         allow-empty-password \
722         allow-root-login \
723         empty-root-password \
724      "
725
726      # Remote debugging needs gdbserver on the target device
727      IMAGE_INSTALL:append = " gdbserver"
728
729      # Add the recipes which should be modified to the image
730      # Otherwise some dependencies might be missing.
731      IMAGE_INSTALL:append = " my-recipe"
732
733   Assuming the BitBake environment is set up correctly and a workspace has
734   been created for the recipe using ``devtool modify my-recipe`` or probably
735   even better by using ``devtool modify my-recipe --debug-build``, the
736   following command can create the SDK and the configuration for VSCode in
737   the recipe workspace::
738
739      $ devtool ide-sdk my-recipe core-image-minimal --target root@192.168.7.2
740
741   The command requires an image recipe (``core-image-minimal`` for this
742   example) that is used to create the SDK.
743   This firmware image should also be installed on the target device.
744   It is possible to pass multiple package recipes::
745
746      $ devtool ide-sdk my-recipe-1 my-recipe-2 core-image-minimal --target root@192.168.7.2
747
748   ``devtool ide-sdk`` tries to create an IDE configuration for all package
749   recipes.
750
751   What this command does exactly depends on the recipe, more precisely on the
752   build tool used by the recipe. The basic idea is to configure the IDE so
753   that it calls the build tool exactly as ``bitbake`` does.
754
755   For example, a CMake preset is created for a recipe that inherits
756   :ref:`ref-classes-cmake`. In the case of VSCode, CMake presets are supported
757   by the CMake Tools plugin. This is an example of how the build configuration
758   used by ``bitbake`` is exported to an IDE configuration that gives exactly
759   the same build results.
760
761   Support for remote debugging with seamless integration into the IDE is
762   important for a cross-SDK. ``devtool ide-sdk`` automatically generates the
763   necessary helper scripts for deploying the compiled artifacts to the target
764   device as well as the necessary configuration for the debugger and the IDE.
765
766   .. note::
767
768      To ensure that the debug symbols on the build machine match the binaries
769      running on the target device, it is essential that the image built by
770      ``devtool ide-sdk`` is running on the target device.
771
772   The default IDE is VSCode. Some hints about using VSCode:
773
774   -  VSCode can be used to work on the BitBake recipes or the application
775      source code.
776      Usually there is one instance of VSCode running in the folder where the
777      BitBake recipes are. This instance has the
778      `Yocto Project BitBake plugin <https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`_
779      running.
780
781      .. warning::
782
783         Some VSCode plugins (Python, BitBake and others) need a reasonable
784         configuration to work as expected. Otherwise, some plugins try to
785         index the build directory of BitBake, which keeps your system quite
786         busy until an out of memory exception stops this nonsense.
787         Other plugins, such as the BitBake plugin, do not behave as expected.
788
789         To work around such issues, the ``oe-init-build-env`` script creates
790         an initial ``.vscode/settings.json`` file if ``code`` can be found
791         and the ``.vscode`` folder does not yet exist.
792         It is best to run ``oe-init-build-env`` once before starting VSCode.
793         An alternative approach is to use a build folder outside the layers,
794         e.g. ``oe-init-build-env ../build``.
795
796      The BitBake plugin also offers to create devtool workspaces and run
797      ``devtool ide-sdk`` with a few mouse clicks.
798      Of course, issuing commands in the terminal works as well.
799
800   -  To work on the source code of a recipe another instance of VSCode is
801      started in the recipe's workspace. Example::
802
803         code build/workspace/sources/my-recipe
804
805      This instance of VSCode uses plugins that are useful for the development
806      of the application. ``devtool ide-sdk`` generates the necessary
807      ``extensions.json``, ``settings.json``, ``tasks.json``and ``launch.json``
808      configuration files for all the involved plugins.
809
810      When the source code folder present in the workspace folder is opened in
811      VSCode for the first time, a pop-up message recommends installing the
812      required plugins.
813      After accepting the installation of the plugins, working with the source
814      code or some debugging tasks should work as usual with VSCode.
815
816      Starting the VSCode instances in the recipe workspace folders can also be
817      done by a mouse click on the recipe workspaces in the first VSCode
818      instance.
819
820   -  To work with CMake press ``Ctrl + Shift + p``, type ``cmake``. This will
821      show some possible commands like selecting a CMake preset, compiling or
822      running CTest.
823
824      For recipes inheriting :ref:`ref-classes-cmake-qemu` rather than
825      :ref:`ref-classes-cmake`, executing cross-compiled unit tests on the host
826      can be supported transparently with QEMU user-mode.
827
828   -  To work with Meson press ``Ctrl + Shift + p``, type ``meson``. This will
829      show some possible commands like compiling or executing the unit tests.
830
831      A note on running cross-compiled unit tests on the host: Meson enables
832      support for QEMU user mode by default. It is expected that the execution
833      of the unit tests from the IDE will work without any additional steps,
834      given that the code is suitable for the execution on the host machine.
835
836   -  For the deployment to the target device, just press ``Ctrl + Shift + p``,
837      type ``task``.  Select ``install && deploy-target``.
838
839   -  For remote debugging, switch to the debugging view by pressing the "play"
840      button with the ``bug icon`` on the left side. This will provide a green
841      play button with a drop-down list where a debug configuration can be
842      selected.  After selecting one of the generated configurations, press the
843      "play" button.
844
845      Starting a remote debugging session automatically initiates the
846      deployment to the target device. If this is not desired, the
847      ``"dependsOn": ["install && deploy-target...]`` parameter of the tasks
848      with ``"label": "gdbserver start...`` can be removed from the
849      ``tasks.json`` file.
850
851      VSCode supports GDB with many different setups and configurations for
852      many different use cases.  However, most of these setups have some
853      limitations when it comes to cross-development, support only a few target
854      architectures or require a high performance target device. Therefore
855      ``devtool ide-sdk`` supports the classic, generic setup with GDB on the
856      development host and gdbserver on the target device.
857
858      Roughly summarized, this means:
859
860      -  The binaries are copied via SSH to the remote target device by a
861         script referred by ``tasks.json``.
862
863      -  gdbserver is started on the remote target device via SSH by a script
864         referred by ``tasks.json``.
865
866         Changing the parameters that are passed to the debugging executable
867         requires modifying the generated script. The script is located at
868         ``oe-scripts/gdbserver_*``. Defining the parameters in the ``args``
869         field in the ``launch.json`` file does not work.
870
871      -  VSCode connects to gdbserver as documented in
872         `Remote debugging or debugging with a local debugger server
873         <https://code.visualstudio.com/docs/cpp/launch-json-reference#_remote-debugging-or-debugging-with-a-local-debugger-server>`__.
874
875   Additionally ``--ide=none`` is supported. With the ``none`` IDE parameter,
876   some generic configuration files like ``gdbinit`` files and some helper
877   scripts starting gdbserver remotely on the target device as well as the GDB
878   client on the host are generated.
879
880   Here is a usage example for the ``cmake-example`` recipe from the
881   ``meta-selftest`` layer which inherits :ref:`ref-classes-cmake-qemu`:
882
883   .. code-block:: sh
884
885      # Create the SDK
886      devtool modify cmake-example --debug-build
887      devtool ide-sdk cmake-example core-image-minimal -c --ide=none
888
889      # Install the firmware on a target device or start QEMU
890      runqemu
891
892      # From exploring the workspace of cmake-example
893      cd build/workspace/sources/cmake-example
894
895      # Find cmake-native and save the path into a variable
896      # Note: using just cmake instead of $CMAKE_NATIVE would work in many cases
897      CMAKE_NATIVE="$(jq -r '.configurePresets[0] | "\(.cmakeExecutable)"' CMakeUserPresets.json)"
898
899      # List available CMake presets
900      "$CMAKE_NATIVE" --list-presets
901      Available configure presets:
902
903        "cmake-example-cortexa57" - cmake-example: cortexa57
904
905      # Re-compile the already compiled sources
906      "$CMAKE_NATIVE" --build --preset cmake-example-cortexa57
907      ninja: no work to do.
908      # Do a clean re-build
909      "$CMAKE_NATIVE" --build --preset cmake-example-cortexa57 --target clean
910      [1/1] Cleaning all built files...
911      Cleaning... 8 files.
912      "$CMAKE_NATIVE" --build --preset cmake-example-cortexa57 --target all
913      [7/7] Linking CXX executable cmake-example
914
915      # Run the cross-compiled unit tests with QEMU user-mode
916      "$CMAKE_NATIVE" --build --preset cmake-example-cortexa57 --target test
917      [0/1] Running tests...
918      Test project .../build/tmp/work/cortexa57-poky-linux/cmake-example/1.0/cmake-example-1.0
919          Start 1: test-cmake-example
920      1/1 Test #1: test-cmake-example ...............   Passed    0.03 sec
921
922      100% tests passed, 0 tests failed out of 1
923
924      Total Test time (real) =   0.03 sec
925
926      # Using CTest directly is possible as well
927      CTEST_NATIVE="$(dirname "$CMAKE_NATIVE")/ctest"
928
929      # List available CMake presets
930      "$CTEST_NATIVE" --list-presets
931      Available test presets:
932
933        "cmake-example-cortexa57" - cmake-example: cortexa57
934
935      # Run the cross-compiled unit tests with QEMU user-mode
936      "$CTEST_NATIVE" --preset "cmake-example-cortexa57"
937      Test project ...build/tmp/work/cortexa57-poky-linux/cmake-example/1.0/cmake-example-1.0
938          Start 1: test-cmake-example
939      1/1 Test #1: test-cmake-example ...............   Passed    0.03 sec
940
941      100% tests passed, 0 tests failed out of 1
942
943      Total Test time (real) =   0.03 sec
944
945      # Deploying the new build to the target device (default is QEUM at 192.168.7.2)
946      oe-scripts/install_and_deploy_cmake-example-cortexa57
947
948      # Start a remote debugging session with gdbserver on the target and GDB on the host
949      oe-scripts/gdbserver_1234_usr-bin-cmake-example_m
950      oe-scripts/gdb_1234_usr-bin-cmake-example
951      break main
952      run
953      step
954      stepi
955      continue
956      quit
957
958      # Stop gdbserver on the target device
959      oe-scripts/gdbserver_1234_usr-bin-cmake-example_m stop
960
961#. *Shared sysroots mode*
962
963   Creating an SDK with shared :term:`Sysroots <Sysroot>` that contains all the
964   dependencies needed to work with ``my-recipe`` is possible with the following
965   example command::
966
967      $ devtool ide-sdk --mode=shared my-recipe
968
969   For VSCode the cross-toolchain is exposed as a CMake kit. CMake kits are
970   defined in ``~/.local/share/CMakeTools/cmake-tools-kits.json``.
971   The following example shows how the cross-toolchain can be selected in
972   VSCode. First of all we need a folder containing a CMake project.
973   For this example, let's create a CMake project and start VSCode::
974
975      mkdir kit-test
976      echo "project(foo VERSION 1.0)" > kit-test/CMakeLists.txt
977      code kit-test
978
979   If there is a CMake project in the workspace, cross-compilation is
980   supported:
981
982   - Press ``Ctrl + Shift + P``, type ``CMake: Scan for Kits``
983   - Press ``Ctrl + Shift + P``, type ``CMake: Select a Kit``
984
985   Finally most of the features provided by CMake and the IDE should be
986   available.
987
988   Other IDEs than VSCode are supported as well. However,
989   ``devtool ide-sdk --mode=shared --ide=none my-recipe`` is currently
990   just a simple wrapper for the setup of the extensible SDK, as described in
991   :ref:`setting_up_ext_sdk_in_build`.
992
993Use ``devtool upgrade`` to Create a Version of the Recipe that Supports a Newer Version of the Software
994-------------------------------------------------------------------------------------------------------
995
996The ``devtool upgrade`` command upgrades an existing recipe to that of a
997more up-to-date version found upstream. Throughout the life of software,
998recipes continually undergo version upgrades by their upstream
999publishers. You can use the ``devtool upgrade`` workflow to make sure
1000your recipes you are using for builds are up-to-date with their upstream
1001counterparts.
1002
1003.. note::
1004
1005   Several methods exist by which you can upgrade recipes ---
1006   ``devtool upgrade`` happens to be one. You can read about all the methods by
1007   which you can upgrade recipes in the
1008   :ref:`dev-manual/upgrading-recipes:upgrading recipes` section of the Yocto
1009   Project Development Tasks Manual.
1010
1011The ``devtool upgrade`` command is flexible enough to allow you to specify
1012source code revision and versioning schemes, extract code into or out of the
1013``devtool`` :ref:`devtool-the-workspace-layer-structure`, and work with any
1014source file forms that the
1015:ref:`bitbake-user-manual/bitbake-user-manual-fetching:fetchers` support.
1016
1017The following diagram shows the common development flow used with the
1018``devtool upgrade`` command:
1019
1020.. image:: figures/sdk-devtool-upgrade-flow.png
1021   :width: 100%
1022
1023#. *Initiate the Upgrade*: The top part of the flow shows the typical
1024   scenario by which you use the ``devtool upgrade`` command. The
1025   following conditions exist:
1026
1027   -  The recipe exists in a local layer external to the ``devtool``
1028      workspace.
1029
1030   -  The source files for the new release exist in the same location
1031      pointed to by :term:`SRC_URI`
1032      in the recipe (e.g. a tarball with the new version number in the
1033      name, or as a different revision in the upstream Git repository).
1034
1035   A common situation is where third-party software has undergone a
1036   revision so that it has been upgraded. The recipe you have access to
1037   is likely in your own layer. Thus, you need to upgrade the recipe to
1038   use the newer version of the software::
1039
1040      $ devtool upgrade -V version recipe
1041
1042   By default, the ``devtool upgrade`` command extracts source
1043   code into the ``sources`` directory in the
1044   :ref:`devtool-the-workspace-layer-structure`.
1045   If you want the code extracted to any other location, you need to
1046   provide the ``srctree`` positional argument with the command as follows::
1047
1048      $ devtool upgrade -V version recipe srctree
1049
1050   .. note::
1051
1052      In this example, the "-V" option specifies the new version. If you
1053      don't use "-V", the command upgrades the recipe to the latest
1054      version.
1055
1056   If the source files pointed to by the :term:`SRC_URI` statement in the
1057   recipe are in a Git repository, you must provide the "-S" option and
1058   specify a revision for the software.
1059
1060   Once ``devtool`` locates the recipe, it uses the :term:`SRC_URI` variable
1061   to locate the source code and any local patch files from other
1062   developers. The result is that the command sets up the source code,
1063   the new version of the recipe, and an append file all within the
1064   workspace.
1065
1066   Additionally, if you have any non-patch local files (i.e. files
1067   referred to with ``file://`` entries in :term:`SRC_URI` statement
1068   excluding ``*.patch/`` or ``*.diff``), these files are copied to an
1069   ``oe-local-files`` folder under the newly created source tree.
1070   Copying the files here gives you a convenient area from which you can
1071   modify the files. Any changes or additions you make to those files
1072   are incorporated into the build the next time you build the software
1073   just as are other changes you might have made to the source.
1074
1075#. *Resolve any Conflicts created by the Upgrade*: Conflicts could happen
1076   after upgrading the software to a new version. Conflicts occur
1077   if your recipe specifies some patch files in :term:`SRC_URI` that
1078   conflict with changes made in the new version of the software. For
1079   such cases, you need to resolve the conflicts by editing the source
1080   and following the normal ``git rebase`` conflict resolution process.
1081
1082   Before moving onto the next step, be sure to resolve any such
1083   conflicts created through use of a newer or different version of the
1084   software.
1085
1086#. *Build the Recipe or Rebuild the Image*: The next step you take
1087   depends on what you are going to do with the new code.
1088
1089   If you need to eventually move the build output to the target
1090   hardware, use the following ``devtool`` command::
1091
1092      $ devtool build recipe
1093
1094   On the other hand, if you want an image to contain the recipe's
1095   packages from the workspace for immediate deployment onto a device
1096   (e.g. for testing purposes), you can use the ``devtool build-image``
1097   command::
1098
1099      $ devtool build-image image
1100
1101#. *Deploy the Build Output*: When you use the ``devtool build`` command
1102   or ``bitbake`` to build your recipe, you probably want to see if the
1103   resulting build output works as expected on target hardware.
1104
1105   .. note::
1106
1107      This step assumes you have a previously built image that is
1108      already either running in QEMU or running on actual hardware.
1109      Also, it is assumed that for deployment of the image to the
1110      target, SSH is installed in the image and if the image is running
1111      on real hardware that you have network access to and from your
1112      development machine.
1113
1114   You can deploy your build output to that target hardware by using the
1115   ``devtool deploy-target`` command::
1116
1117      $ devtool deploy-target recipe target
1118
1119   The target is a live target machine running as an SSH server.
1120
1121   You can, of course, also deploy the image you build using the
1122   ``devtool build-image`` command to actual hardware. However,
1123   ``devtool`` does not provide a specific command that allows you to do
1124   this.
1125
1126#. *Finish Your Work With the Recipe*: The ``devtool finish`` command
1127   creates any patches corresponding to commits in the local Git
1128   repository, moves the new recipe to a more permanent layer, and then
1129   resets the recipe so that the recipe is built normally rather than
1130   from the workspace.
1131
1132   Any work you did in the ``oe-local-files`` directory is preserved in
1133   the original files next to the recipe during the ``devtool finish``
1134   command.
1135
1136   If you specify a destination layer that is the same as the original
1137   source, then the old version of the recipe and associated files are
1138   removed prior to adding the new version::
1139
1140      $ devtool finish recipe layer
1141
1142   .. note::
1143
1144      Any changes you want to turn into patches must be committed to the
1145      Git repository in the source tree.
1146
1147   As a final process of the ``devtool finish`` command, the state of
1148   the standard layers and the upstream source is restored so that you
1149   can build the recipe from those areas rather than the workspace.
1150
1151   .. note::
1152
1153      You can use the ``devtool reset`` command to put things back should you
1154      decide you do not want to proceed with your work. If you do use this
1155      command, realize that the source tree is preserved.
1156
1157A Closer Look at ``devtool add``
1158================================
1159
1160The ``devtool add`` command automatically creates a recipe based on the
1161source tree you provide with the command. Currently, the command has
1162support for the following:
1163
1164-  Autotools (``autoconf`` and ``automake``)
1165
1166-  CMake
1167
1168-  Scons
1169
1170-  ``qmake``
1171
1172-  Plain ``Makefile``
1173
1174-  Out-of-tree kernel module
1175
1176-  Binary package (i.e. "-b" option)
1177
1178-  Node.js module
1179
1180-  Python modules that use ``setuptools`` or ``distutils``
1181
1182Apart from binary packages, the determination of how a source tree
1183should be treated is automatic based on the files present within that
1184source tree. For example, if a ``CMakeLists.txt`` file is found, then
1185the source tree is assumed to be using CMake and is treated accordingly.
1186
1187.. note::
1188
1189   In most cases, you need to edit the automatically generated recipe in
1190   order to make it build properly. Typically, you would go through
1191   several edit and build cycles until the recipe successfully builds.
1192   Once the recipe builds, you could use possible further iterations to
1193   test the recipe on the target device.
1194
1195The remainder of this section covers specifics regarding how parts of
1196the recipe are generated.
1197
1198Name and Version
1199----------------
1200
1201If you do not specify a name and version on the command line,
1202``devtool add`` uses various metadata within the source tree in an
1203attempt to determine the name and version of the software being built.
1204Based on what the tool determines, ``devtool`` sets the name of the
1205created recipe file accordingly.
1206
1207If ``devtool`` cannot determine the name and version, the command prints
1208an error. For such cases, you must re-run the command and provide the
1209name and version, just the name, or just the version as part of the
1210command line.
1211
1212Sometimes the name or version determined from the source tree might be
1213incorrect. For such a case, you must reset the recipe::
1214
1215   $ devtool reset -n recipename
1216
1217After running the ``devtool reset`` command, you need to
1218run ``devtool add`` again and provide the name or the version.
1219
1220Dependency Detection and Mapping
1221--------------------------------
1222
1223The ``devtool add`` command attempts to detect build-time dependencies and map
1224them to other recipes in the system. During this mapping, the command fills in
1225the names of those recipes as part of the :term:`DEPENDS` variable within the
1226recipe. If a dependency cannot be mapped, ``devtool`` places a comment
1227in the recipe indicating such. The inability to map a dependency can
1228result from naming not being recognized or because the dependency simply
1229is not available. For cases where the dependency is not available, you
1230must use the ``devtool add`` command to add an additional recipe that
1231satisfies the dependency. Once you add that recipe, you need to update
1232the :term:`DEPENDS` variable in the original recipe to include the new
1233recipe.
1234
1235If you need to add runtime dependencies, you can do so by adding the
1236following to your recipe::
1237
1238   RDEPENDS:${PN} += "dependency1 dependency2 ..."
1239
1240.. note::
1241
1242   The ``devtool add`` command often cannot distinguish between mandatory and
1243   optional dependencies. Consequently, some of the detected dependencies might
1244   in fact be optional. When in doubt, consult the documentation or the
1245   configure script for the software the recipe is building for further
1246   details. In some cases, you might find you can substitute the
1247   dependency with an option that disables the associated functionality
1248   passed to the configure script.
1249
1250License Detection
1251-----------------
1252
1253The ``devtool add`` command attempts to determine if the software you are
1254adding is able to be distributed under a common, open-source license. If
1255so, the command sets the :term:`LICENSE` value accordingly.
1256You should double-check the value added by the command against the
1257documentation or source files for the software you are building and, if
1258necessary, update that :term:`LICENSE` value.
1259
1260The ``devtool add`` command also sets the :term:`LIC_FILES_CHKSUM`
1261value to point to all files that appear to be license-related. Realize
1262that license statements often appear in comments at the top of source
1263files or within the documentation. In such cases, the command does not
1264recognize those license statements. Consequently, you might need to
1265amend the :term:`LIC_FILES_CHKSUM` variable to point to one or more of those
1266comments if present. Setting :term:`LIC_FILES_CHKSUM` is particularly
1267important for third-party software. The mechanism attempts to ensure
1268correct licensing should you upgrade the recipe to a newer upstream
1269version in future. Any change in licensing is detected and you receive
1270an error prompting you to check the license text again.
1271
1272If the ``devtool add`` command cannot determine licensing information,
1273``devtool`` sets the :term:`LICENSE` value to "CLOSED" and leaves the
1274:term:`LIC_FILES_CHKSUM` value unset. This behavior allows you to continue
1275with development even though the settings are unlikely to be correct in
1276all cases. You should check the documentation or source files for the
1277software you are building to determine the actual license.
1278
1279Adding Makefile-Only Software
1280-----------------------------
1281
1282The use of Make by itself is very common in both proprietary and
1283open-source software. Unfortunately, Makefiles are often not written
1284with cross-compilation in mind. Thus, ``devtool add`` often cannot do
1285very much to ensure that these Makefiles build correctly. It is very
1286common, for example, to explicitly call ``gcc`` instead of using the
1287:term:`CC` variable. Usually, in a
1288cross-compilation environment, ``gcc`` is the compiler for the build
1289host and the cross-compiler is named something similar to
1290``arm-poky-linux-gnueabi-gcc`` and might require arguments (e.g. to
1291point to the associated sysroot for the target machine).
1292
1293When writing a recipe for Makefile-only software, keep the following in
1294mind:
1295
1296-  You probably need to patch the Makefile to use variables instead of
1297   hardcoding tools within the toolchain such as ``gcc`` and ``g++``.
1298
1299-  The environment in which Make runs is set up with various standard
1300   variables for compilation (e.g. :term:`CC`, :term:`CXX`, and so forth) in a
1301   similar manner to the environment set up by the SDK's environment
1302   setup script. One easy way to see these variables is to run the
1303   ``devtool build`` command on the recipe and then look in
1304   ``oe-logs/run.do_compile``. Towards the top of this file, there is
1305   a list of environment variables that are set. You can take
1306   advantage of these variables within the Makefile.
1307
1308-  If the Makefile sets a default for a variable using "=", that default
1309   overrides the value set in the environment, which is usually not
1310   desirable. For this case, you can either patch the Makefile so it
1311   sets the default using the "?=" operator, or you can alternatively
1312   force the value on the ``make`` command line. To force the value on
1313   the command line, add the variable setting to
1314   :term:`EXTRA_OEMAKE` or
1315   :term:`PACKAGECONFIG_CONFARGS`
1316   within the recipe. Here is an example using :term:`EXTRA_OEMAKE`::
1317
1318      EXTRA_OEMAKE += "'CC=${CC}' 'CXX=${CXX}'"
1319
1320   In the above example,
1321   single quotes are used around the variable settings as the values are
1322   likely to contain spaces because required default options are passed
1323   to the compiler.
1324
1325-  Hardcoding paths inside Makefiles is often problematic in a
1326   cross-compilation environment. This is particularly true because
1327   those hardcoded paths often point to locations on the build host and
1328   thus will either be read-only or will introduce contamination into
1329   the cross-compilation because they are specific to the build host
1330   rather than the target. Patching the Makefile to use prefix variables
1331   or other path variables is usually the way to handle this situation.
1332
1333-  Sometimes a Makefile runs target-specific commands such as
1334   ``ldconfig``. For such cases, you might be able to apply patches that
1335   remove these commands from the Makefile.
1336
1337Adding Native Tools
1338-------------------
1339
1340Often, you need to build additional tools that run on the :term:`Build Host`
1341as opposed to the target. You should indicate this requirement by using one of
1342the following methods when you run ``devtool add``:
1343
1344-  Specify the name of the recipe such that it ends with "-native".
1345   Specifying the name like this produces a recipe that only builds for
1346   the build host.
1347
1348-  Specify the "--also-native" option with the ``devtool add``
1349   command. Specifying this option creates a recipe file that still
1350   builds for the target but also creates a variant with a "-native"
1351   suffix that builds for the build host.
1352
1353.. note::
1354
1355   If you need to add a tool that is shipped as part of a source tree
1356   that builds code for the target, you can typically accomplish this by
1357   building the native and target parts separately rather than within
1358   the same compilation process. Realize though that with the
1359   "--also-native" option, you can add the tool using just one
1360   recipe file.
1361
1362Adding Node.js Modules
1363----------------------
1364
1365You can use the ``devtool add`` command two different ways to add
1366Node.js modules: through ``npm`` or from a repository or local source.
1367
1368Use the following form to add Node.js modules through ``npm``::
1369
1370   $ devtool add "npm://registry.npmjs.org;name=forever;version=0.15.1"
1371
1372The name and
1373version parameters are mandatory. Lockdown and shrinkwrap files are
1374generated and pointed to by the recipe in order to freeze the version
1375that is fetched for the dependencies according to the first time. This
1376also saves checksums that are verified on future fetches. Together,
1377these behaviors ensure the reproducibility and integrity of the build.
1378
1379.. note::
1380
1381   -  You must use quotes around the URL. ``devtool add`` does not
1382      require the quotes, but the shell considers ";" as a splitter
1383      between multiple commands. Thus, without the quotes,
1384      ``devtool add`` does not receive the other parts, which results in
1385      several "command not found" errors.
1386
1387   -  In order to support adding Node.js modules, a ``nodejs`` recipe
1388      must be part of your SDK.
1389
1390As mentioned earlier, you can also add Node.js modules directly from a
1391repository or local source tree. To add modules this way, use
1392``devtool add`` in the following form::
1393
1394   $ devtool add https://github.com/diversario/node-ssdp
1395
1396In this example, ``devtool`` fetches the specified Git repository, detects the
1397code as Node.js code, fetches dependencies using ``npm``, and sets
1398:term:`SRC_URI` accordingly.
1399
1400Working With Recipes
1401====================
1402
1403When building a recipe using the ``devtool build`` command, the typical
1404build progresses as follows:
1405
1406#. Fetch the source
1407
1408#. Unpack the source
1409
1410#. Configure the source
1411
1412#. Compile the source
1413
1414#. Install the build output
1415
1416#. Package the installed output
1417
1418For recipes in the workspace, fetching and unpacking is disabled as the
1419source tree has already been prepared and is persistent. Each of these
1420build steps is defined as a function (task), usually with a "do\_" prefix
1421(e.g. :ref:`ref-tasks-fetch`,
1422:ref:`ref-tasks-unpack`, and so
1423forth). These functions are typically shell scripts but can instead be
1424written in Python.
1425
1426If you look at the contents of a recipe, you will see that the recipe
1427does not include complete instructions for building the software.
1428Instead, common functionality is encapsulated in classes inherited with
1429the ``inherit`` directive. This technique leaves the recipe to describe
1430just the things that are specific to the software being built. There is
1431a :ref:`ref-classes-base` class that is implicitly inherited by all recipes
1432and provides the functionality that most recipes typically need.
1433
1434The remainder of this section presents information useful when working
1435with recipes.
1436
1437Finding Logs and Work Files
1438---------------------------
1439
1440After the first run of the ``devtool build`` command, recipes that were
1441previously created using the ``devtool add`` command or whose sources
1442were modified using the ``devtool modify`` command contain symbolic
1443links created within the source tree:
1444
1445-  ``oe-logs``: This link points to the directory in which log files and
1446   run scripts for each build step are created.
1447
1448-  ``oe-workdir``: This link points to the temporary work area for the
1449   recipe. The following locations under ``oe-workdir`` are particularly
1450   useful:
1451
1452   -  ``image/``: Contains all of the files installed during the
1453      :ref:`ref-tasks-install` stage.
1454      Within a recipe, this directory is referred to by the expression
1455      ``${``\ :term:`D`\ ``}``.
1456
1457   -  ``sysroot-destdir/``: Contains a subset of files installed within
1458      :ref:`ref-tasks-install` that have been put into the shared sysroot. For
1459      more information, see the
1460      ":ref:`dev-manual/new-recipe:sharing files between recipes`" section.
1461
1462   -  ``packages-split/``: Contains subdirectories for each package
1463      produced by the recipe. For more information, see the
1464      ":ref:`sdk-manual/extensible:packaging`" section.
1465
1466You can use these links to get more information on what is happening at
1467each build step.
1468
1469Setting Configure Arguments
1470---------------------------
1471
1472If the software your recipe is building uses GNU autoconf, then a fixed
1473set of arguments is passed to it to enable cross-compilation plus any
1474extras specified by :term:`EXTRA_OECONF` or :term:`PACKAGECONFIG_CONFARGS`
1475set within the recipe. If you wish to pass additional options, add them
1476to :term:`EXTRA_OECONF` or :term:`PACKAGECONFIG_CONFARGS`. Other supported build
1477tools have similar variables (e.g.  :term:`EXTRA_OECMAKE` for CMake,
1478:term:`EXTRA_OESCONS` for Scons, and so forth). If you need to pass anything on
1479the ``make`` command line, you can use :term:`EXTRA_OEMAKE` or the
1480:term:`PACKAGECONFIG_CONFARGS` variables to do so.
1481
1482You can use the ``devtool configure-help`` command to help you set the
1483arguments listed in the previous paragraph. The command determines the
1484exact options being passed, and shows them to you along with any custom
1485arguments specified through :term:`EXTRA_OECONF` or
1486:term:`PACKAGECONFIG_CONFARGS`. If applicable, the command also shows you
1487the output of the configure script's "--help" option as a
1488reference.
1489
1490Sharing Files Between Recipes
1491-----------------------------
1492
1493Recipes often need to use files provided by other recipes on the
1494:term:`Build Host`. For example,
1495an application linking to a common library needs access to the library
1496itself and its associated headers. The way this access is accomplished
1497within the extensible SDK is through the sysroot. There is one sysroot per
1498"machine" for which the SDK is being built. In practical terms, this
1499means there is a sysroot for the target machine, and a sysroot for
1500the build host.
1501
1502Recipes should never write files directly into the sysroot. Instead,
1503files should be installed into standard locations during the
1504:ref:`ref-tasks-install` task within the ``${``\ :term:`D`\ ``}`` directory. A
1505subset of these files automatically goes into the sysroot. The reason
1506for this limitation is that almost all files that go into the sysroot
1507are cataloged in manifests in order to ensure they can be removed later
1508when a recipe is modified or removed. Thus, the sysroot is able to
1509remain free from stale files.
1510
1511Packaging
1512---------
1513
1514Packaging is not always particularly relevant within the extensible SDK.
1515However, if you examine how build output gets into the final image on
1516the target device, it is important to understand packaging because the
1517contents of the image are expressed in terms of packages and not
1518recipes.
1519
1520During the :ref:`ref-tasks-package` task, files installed during the
1521:ref:`ref-tasks-install` task are split into one main package, which is almost
1522always named the same as the recipe, and into several other packages. This
1523separation exists because not all of those installed files are useful in every
1524image. For example, you probably do not need any of the documentation installed
1525in a production image. Consequently, for each recipe the documentation
1526files are separated into a ``-doc`` package. Recipes that package
1527software containing optional modules or plugins might undergo additional
1528package splitting as well.
1529
1530After building a recipe, you can see where files have gone by looking in
1531the ``oe-workdir/packages-split`` directory, which contains a
1532subdirectory for each package. Apart from some advanced cases, the
1533:term:`PACKAGES` and :term:`FILES` variables controls
1534splitting. The :term:`PACKAGES` variable lists all of the packages to be
1535produced, while the :term:`FILES` variable specifies which files to include
1536in each package by using an override to specify the package. For
1537example, ``FILES:${PN}`` specifies the files to go into the main package
1538(i.e. the main package has the same name as the recipe and
1539``${``\ :term:`PN`\ ``}`` evaluates to the
1540recipe name). The order of the :term:`PACKAGES` value is significant. For
1541each installed file, the first package whose :term:`FILES` value matches the
1542file is the package into which the file goes. Both the :term:`PACKAGES` and
1543:term:`FILES` variables have default values. Consequently, you might find
1544you do not even need to set these variables in your recipe unless the
1545software the recipe is building installs files into non-standard
1546locations.
1547
1548Restoring the Target Device to its Original State
1549=================================================
1550
1551If you use the ``devtool deploy-target`` command to write a recipe's
1552build output to the target, and you are working on an existing component
1553of the system, then you might find yourself in a situation where you
1554need to restore the original files that existed prior to running the
1555``devtool deploy-target`` command. Because the ``devtool deploy-target``
1556command backs up any files it overwrites, you can use the
1557``devtool undeploy-target`` command to restore those files and remove
1558any other files the recipe deployed. Consider the following example::
1559
1560   $ devtool undeploy-target lighttpd root@192.168.7.2
1561
1562If you have deployed
1563multiple applications, you can remove them all using the "-a" option
1564thus restoring the target device to its original state::
1565
1566   $ devtool undeploy-target -a root@192.168.7.2
1567
1568Information about files deployed to
1569the target as well as any backed up files are stored on the target
1570itself. This storage, of course, requires some additional space on the
1571target machine.
1572
1573.. note::
1574
1575   The ``devtool deploy-target`` and ``devtool undeploy-target`` commands do
1576   not currently interact with any package management system on the target
1577   device (e.g. RPM or OPKG). Consequently, you should not intermingle
1578   ``devtool deploy-target`` and package manager operations on the target
1579   device. Doing so could result in a conflicting set of files.
1580
1581Installing Additional Items Into the Extensible SDK
1582===================================================
1583
1584Out of the box the extensible SDK typically only comes with a small
1585number of tools and libraries. A minimal SDK starts mostly empty and is
1586populated on-demand. Sometimes you must explicitly install extra items
1587into the SDK. If you need these extra items, you can first search for
1588the items using the ``devtool search`` command. For example, suppose you
1589need to link to libGL but you are not sure which recipe provides libGL.
1590You can use the following command to find out::
1591
1592   $ devtool search libGL mesa
1593   A free implementation of the OpenGL API
1594
1595Once you know the recipe
1596(i.e. ``mesa`` in this example), you can install it.
1597
1598When using the extensible SDK directly in a Yocto build
1599-------------------------------------------------------
1600
1601In this scenario, the Yocto build tooling, e.g. ``bitbake``
1602is directly accessible to build additional items, and it
1603can simply be executed directly::
1604
1605   $ bitbake curl-native
1606   # Add newly built native items to native sysroot
1607   $ bitbake build-sysroots -c build_native_sysroot
1608   $ bitbake mesa
1609   # Add newly built target items to target sysroot
1610   $ bitbake build-sysroots -c build_target_sysroot
1611
1612When using a standalone installer for the Extensible SDK
1613--------------------------------------------------------
1614
1615::
1616
1617   $ devtool sdk-install mesa
1618
1619By default, the ``devtool sdk-install`` command assumes
1620the item is available in pre-built form from your SDK provider. If the
1621item is not available and it is acceptable to build the item from
1622source, you can add the "-s" option as follows::
1623
1624   $ devtool sdk-install -s mesa
1625
1626It is important to remember that building the item from source
1627takes significantly longer than installing the pre-built artifact. Also,
1628if there is no recipe for the item you want to add to the SDK, you must
1629instead add the item using the ``devtool add`` command.
1630
1631Applying Updates to an Installed Extensible SDK
1632===============================================
1633
1634If you are working with an installed extensible SDK that gets
1635occasionally updated (e.g. a third-party SDK), then you will need to
1636manually "pull down" the updates into the installed SDK.
1637
1638To update your installed SDK, use ``devtool`` as follows::
1639
1640   $ devtool sdk-update
1641
1642The previous command assumes your SDK provider has set the default update URL
1643for you through the :term:`SDK_UPDATE_URL` variable as described in the
1644":ref:`sdk-manual/appendix-customizing:Providing Updates to the Extensible SDK After Installation`"
1645section. If the SDK provider has not set that default URL, you need to
1646specify it yourself in the command as follows::
1647
1648   $ devtool sdk-update path_to_update_directory
1649
1650.. note::
1651
1652   The URL needs to point specifically to a published SDK and not to an
1653   SDK installer that you would download and install.
1654
1655Creating a Derivative SDK With Additional Components
1656====================================================
1657
1658You might need to produce an SDK that contains your own custom
1659libraries. A good example would be if you were a vendor with customers
1660that use your SDK to build their own platform-specific software and
1661those customers need an SDK that has custom libraries. In such a case,
1662you can produce a derivative SDK based on the currently installed SDK
1663fairly easily by following these steps:
1664
1665#. If necessary, install an extensible SDK that you want to use as a
1666   base for your derivative SDK.
1667
1668#. Source the environment script for the SDK.
1669
1670#. Add the extra libraries or other components you want by using the
1671   ``devtool add`` command.
1672
1673#. Run the ``devtool build-sdk`` command.
1674
1675The previous steps take the recipes added to the workspace and construct
1676a new SDK installer that contains those recipes and the resulting binary
1677artifacts. The recipes go into their own separate layer in the
1678constructed derivative SDK, which leaves the workspace clean and ready
1679for users to add their own recipes.
1680