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