summaryrefslogtreecommitdiffstats
path: root/documentation/sdk-manual
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/sdk-manual')
-rw-r--r--documentation/sdk-manual/appendix-obtain.rst6
-rw-r--r--documentation/sdk-manual/extensible.rst219
-rw-r--r--documentation/sdk-manual/intro.rst4
-rw-r--r--documentation/sdk-manual/using.rst2
4 files changed, 162 insertions, 69 deletions
diff --git a/documentation/sdk-manual/appendix-obtain.rst b/documentation/sdk-manual/appendix-obtain.rst
index d06d6ec6b5..a42cbc31bb 100644
--- a/documentation/sdk-manual/appendix-obtain.rst
+++ b/documentation/sdk-manual/appendix-obtain.rst
@@ -29,7 +29,7 @@ and then run the script to hand-install the toolchain.
29Follow these steps to locate and hand-install the toolchain: 29Follow these steps to locate and hand-install the toolchain:
30 30
31#. *Go to the Installers Directory:* Go to 31#. *Go to the Installers Directory:* Go to
32 :yocto_dl:`/releases/yocto/yocto-&DISTRO;/toolchain/` 32 :yocto_dl:`/releases/yocto/&DISTRO_REL_LATEST_TAG;/toolchain/`
33 33
34#. *Open the Folder for Your Build Host:* Open the folder that matches 34#. *Open the Folder for Your Build Host:* Open the folder that matches
35 your :term:`Build Host` (i.e. 35 your :term:`Build Host` (i.e.
@@ -201,7 +201,7 @@ Follow these steps to extract the root filesystem:
201 Image File:* You need to find and download the root filesystem image 201 Image File:* You need to find and download the root filesystem image
202 file that is appropriate for your target system. These files are kept 202 file that is appropriate for your target system. These files are kept
203 in machine-specific folders in the 203 in machine-specific folders in the
204 :yocto_dl:`Index of Releases </releases/yocto/yocto-&DISTRO;/machines/>` 204 :yocto_dl:`Index of Releases </releases/yocto/&DISTRO_REL_LATEST_TAG;/machines/>`
205 in the "machines" directory. 205 in the "machines" directory.
206 206
207 The machine-specific folders of the "machines" directory contain 207 The machine-specific folders of the "machines" directory contain
@@ -245,7 +245,7 @@ Follow these steps to extract the root filesystem:
245 245
246 Here is an example command that extracts the root filesystem 246 Here is an example command that extracts the root filesystem
247 from a previously built root filesystem image that was downloaded 247 from a previously built root filesystem image that was downloaded
248 from the :yocto_dl:`Index of Releases </releases/yocto/yocto-&DISTRO;/machines/>`. 248 from the :yocto_dl:`Index of Releases </releases/yocto/&DISTRO_REL_LATEST_TAG;/machines/>`.
249 This command extracts the root filesystem into the ``core2-64-sato`` 249 This command extracts the root filesystem into the ``core2-64-sato``
250 directory:: 250 directory::
251 251
diff --git a/documentation/sdk-manual/extensible.rst b/documentation/sdk-manual/extensible.rst
index 3f6a754d88..ab4956f466 100644
--- a/documentation/sdk-manual/extensible.rst
+++ b/documentation/sdk-manual/extensible.rst
@@ -87,7 +87,7 @@ Host` by running the ``*.sh`` installation script.
87You can download a tarball installer, which includes the pre-built 87You can download a tarball installer, which includes the pre-built
88toolchain, the ``runqemu`` script, the internal build system, 88toolchain, the ``runqemu`` script, the internal build system,
89``devtool``, and support files from the appropriate 89``devtool``, and support files from the appropriate
90:yocto_dl:`toolchain </releases/yocto/yocto-&DISTRO;/toolchain/>` directory within the Index of 90:yocto_dl:`toolchain </releases/yocto/&DISTRO_REL_LATEST_TAG;/toolchain/>` directory within the Index of
91Releases. Toolchains are available for several 32-bit and 64-bit 91Releases. Toolchains are available for several 32-bit and 64-bit
92architectures with the ``x86_64`` directories, respectively. The 92architectures with the ``x86_64`` directories, respectively. The
93toolchains the Yocto Project provides are based off the 93toolchains the Yocto Project provides are based off the
@@ -178,7 +178,7 @@ Running the Extensible SDK Environment Setup Script
178Once you have the SDK installed, you must run the SDK environment setup 178Once you have the SDK installed, you must run the SDK environment setup
179script before you can actually use the SDK. 179script before you can actually use the SDK.
180 180
181When using a SDK directly in a Yocto build, you will find the script in 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`. 182``tmp/deploy/images/qemux86-64/`` in your :term:`Build Directory`.
183 183
184When using a standalone SDK installer, this setup script resides in 184When using a standalone SDK installer, this setup script resides in
@@ -622,28 +622,91 @@ command:
622 decide you do not want to proceed with your work. If you do use this 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. 623 command, realize that the source tree is preserved.
624 624
625``devtool ide-sdk`` configures IDEs for the extensible SDK 625``devtool ide-sdk`` configures IDEs and bootstraps SDKs
626---------------------------------------------------------- 626-------------------------------------------------------
627 627
628``devtool ide-sdk`` automatically configures IDEs to use the extensible SDK. 628The ``devtool ide-sdk`` command can provide an IDE configuration for IDEs when
629To make sure that all parts of the extensible SDK required by the generated 629working on the source code of one or more recipes.
630IDE configuration are available, ``devtool ide-sdk`` uses BitBake in the 630Depending on the programming language, and the build system used by the recipe,
631background to bootstrap the extensible SDK. 631the tools required for cross-development and remote debugging are different.
632For example:
632 633
633The extensible SDK supports two different development modes. 634- A C/C++ project usually uses CMake or Meson.
634``devtool ide-sdk`` supports both of them:
635 635
636#. *Modified mode*: 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.
637 663
638 By default ``devtool ide-sdk`` generates IDE configurations for recipes in 664- ``devtool ide-sdk`` aims to support multiple programming languages and
639 workspaces created by ``devtool modify`` or ``devtool add`` as described in 665 multiple IDEs natively. "Natively" means that the IDE is configured to call
640 :ref:`using_devtool`. This mode creates IDE configurations with support for 666 the build tool (e.g. ``cmake`` or ``meson``) directly. This has several
641 advanced features, such as deploying the binaries to the remote target 667 advantages.
642 device and performing remote debugging sessions. The generated IDE 668 First of all, it is usually much faster to call for example ``cmake`` than
643 configurations use the per recipe sysroots as Bitbake does internally. 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.
644 677
645 In order to use the tool, a few settings are needed. As a starting example, 678So much about the introduction to the default mode of ``devtool sdk-ide`` which
646 the following lines of code can be added to the ``local.conf`` file:: 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::
647 710
648 # Build the companion debug file system 711 # Build the companion debug file system
649 IMAGE_GEN_DEBUGFS = "1" 712 IMAGE_GEN_DEBUGFS = "1"
@@ -666,15 +729,20 @@ The extensible SDK supports two different development modes.
666 IMAGE_INSTALL:append = " my-recipe" 729 IMAGE_INSTALL:append = " my-recipe"
667 730
668 Assuming the BitBake environment is set up correctly and a workspace has 731 Assuming the BitBake environment is set up correctly and a workspace has
669 been created for the recipe using ``devtool modify my-recipe``, the 732 been created for the recipe using ``devtool modify my-recipe`` or probably
733 even better by using ``devtool modify my-recipe --debug-build``, the
670 following command can create the SDK and the configuration for VSCode in 734 following command can create the SDK and the configuration for VSCode in
671 the recipe workspace:: 735 the recipe workspace::
672 736
673 $ devtool ide-sdk my-recipe core-image-minimal --target root@192.168.7.2 737 $ devtool ide-sdk my-recipe core-image-minimal --target root@192.168.7.2
674 738
675 The command requires an image recipe (``core-image-minimal`` for this example) 739 The command requires an image recipe (``core-image-minimal`` for this
676 that is used to create the SDK. This firmware image should also be installed 740 example) that is used to create the SDK.
677 on the target device. It is possible to pass multiple package recipes. 741 This firmware image should also be installed on the target device.
742 It is possible to pass multiple package recipes::
743
744 $ devtool ide-sdk my-recipe-1 my-recipe-2 core-image-minimal --target root@192.168.7.2
745
678 ``devtool ide-sdk`` tries to create an IDE configuration for all package 746 ``devtool ide-sdk`` tries to create an IDE configuration for all package
679 recipes. 747 recipes.
680 748
@@ -684,9 +752,9 @@ The extensible SDK supports two different development modes.
684 752
685 For example, a CMake preset is created for a recipe that inherits 753 For example, a CMake preset is created for a recipe that inherits
686 :ref:`ref-classes-cmake`. In the case of VSCode, CMake presets are supported 754 :ref:`ref-classes-cmake`. In the case of VSCode, CMake presets are supported
687 by the CMake Tools plugin. This is an example of how the build 755 by the CMake Tools plugin. This is an example of how the build configuration
688 configuration used by ``bitbake`` is exported to an IDE configuration that 756 used by ``bitbake`` is exported to an IDE configuration that gives exactly
689 gives exactly the same build results. 757 the same build results.
690 758
691 Support for remote debugging with seamless integration into the IDE is 759 Support for remote debugging with seamless integration into the IDE is
692 important for a cross-SDK. ``devtool ide-sdk`` automatically generates the 760 important for a cross-SDK. ``devtool ide-sdk`` automatically generates the
@@ -699,23 +767,54 @@ The extensible SDK supports two different development modes.
699 running on the target device, it is essential that the image built by 767 running on the target device, it is essential that the image built by
700 ``devtool ide-sdk`` is running on the target device. 768 ``devtool ide-sdk`` is running on the target device.
701 769
702 ``devtool ide-sdk`` aims to support multiple programming languages and
703 multiple IDEs natively. "Natively" means that the IDE is configured to call
704 the build tool (e.g. CMake or Meson) directly. This has several advantages.
705 First of all, it is much faster than ``devtool build``, but it also allows
706 to use the very good integration of tools like CMake or GDB in VSCode and
707 other IDEs. However, supporting many programming languages and multiple
708 IDEs is quite an elaborate and constantly evolving thing. Support for IDEs
709 is therefore implemented as plugins. Plugins can also be provided by
710 optional layers.
711
712 The default IDE is VSCode. Some hints about using VSCode: 770 The default IDE is VSCode. Some hints about using VSCode:
713 771
714 - To work on the source code of a recipe an instance of VSCode is started in 772 - VSCode can be used to work on the BitBake recipes or the application
715 the recipe's workspace. Example:: 773 source code.
774 Usually there is one instance of VSCode running in the folder where the
775 BitBake recipes are. This instance has the
776 `Yocto Project BitBake plugin <https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`_
777 running.
778
779 .. warning::
780
781 Some VSCode plugins (Python, BitBake and others) need a reasonable
782 configuration to work as expected. Otherwise, some plugins try to
783 index the build directory of BitBake, which keeps your system quite
784 busy until an out of memory exception stops this nonsense.
785 Other plugins, such as the BitBake plugin, do not behave as expected.
786
787 To work around such issues, the ``oe-init-build-env`` script creates
788 an initial ``.vscode/settings.json`` file if ``code`` can be found
789 and the ``.vscode`` folder does not yet exist.
790 It is best to run ``oe-init-build-env`` once before starting VSCode.
791 An alternative approach is to use a build folder outside the layers,
792 e.g. ``oe-init-build-env ../build``.
793
794 The BitBake plugin also offers to create devtool workspaces and run
795 ``devtool ide-sdk`` with a few mouse clicks.
796 Of course, issuing commands in the terminal works as well.
797
798 - To work on the source code of a recipe another instance of VSCode is
799 started in the recipe's workspace. Example::
716 800
717 code build/workspace/sources/my-recipe 801 code build/workspace/sources/my-recipe
718 802
803 This instance of VSCode uses plugins that are useful for the development
804 of the application. ``devtool ide-sdk`` generates the necessary
805 ``extensions.json``, ``settings.json``, ``tasks.json`` and ``launch.json``
806 configuration files for all the involved plugins.
807
808 When the source code folder present in the workspace folder is opened in
809 VSCode for the first time, a pop-up message recommends installing the
810 required plugins.
811 After accepting the installation of the plugins, working with the source
812 code or some debugging tasks should work as usual with VSCode.
813
814 Starting the VSCode instances in the recipe workspace folders can also be
815 done by a mouse click on the recipe workspaces in the first VSCode
816 instance.
817
719 - To work with CMake press ``Ctrl + Shift + p``, type ``cmake``. This will 818 - To work with CMake press ``Ctrl + Shift + p``, type ``cmake``. This will
720 show some possible commands like selecting a CMake preset, compiling or 819 show some possible commands like selecting a CMake preset, compiling or
721 running CTest. 820 running CTest.
@@ -728,10 +827,9 @@ The extensible SDK supports two different development modes.
728 show some possible commands like compiling or executing the unit tests. 827 show some possible commands like compiling or executing the unit tests.
729 828
730 A note on running cross-compiled unit tests on the host: Meson enables 829 A note on running cross-compiled unit tests on the host: Meson enables
731 support for QEMU user-mode by default. It is expected that the execution 830 support for QEMU user mode by default. It is expected that the execution
732 of the unit tests from the IDE will work easily without any additional 831 of the unit tests from the IDE will work without any additional steps,
733 steps, provided that the code is suitable for execution on the host 832 given that the code is suitable for the execution on the host machine.
734 machine.
735 833
736 - For the deployment to the target device, just press ``Ctrl + Shift + p``, 834 - For the deployment to the target device, just press ``Ctrl + Shift + p``,
737 type ``task``. Select ``install && deploy-target``. 835 type ``task``. Select ``install && deploy-target``.
@@ -742,23 +840,23 @@ The extensible SDK supports two different development modes.
742 selected. After selecting one of the generated configurations, press the 840 selected. After selecting one of the generated configurations, press the
743 "play" button. 841 "play" button.
744 842
745 Starting a remote debugging session automatically initiates the deployment 843 Starting a remote debugging session automatically initiates the
746 to the target device. If this is not desired, the 844 deployment to the target device. If this is not desired, the
747 ``"dependsOn": ["install && deploy-target...]`` parameter of the tasks 845 ``"dependsOn": ["install && deploy-target...]`` parameter of the tasks
748 with ``"label": "gdbserver start...`` can be removed from the 846 with ``"label": "gdbserver start...`` can be removed from the
749 ``tasks.json`` file. 847 ``tasks.json`` file.
750 848
751 VSCode supports GDB with many different setups and configurations for many 849 VSCode supports GDB with many different setups and configurations for
752 different use cases. However, most of these setups have some limitations 850 many different use cases. However, most of these setups have some
753 when it comes to cross-development, support only a few target 851 limitations when it comes to cross-development, support only a few target
754 architectures or require a high performance target device. Therefore 852 architectures or require a high performance target device. Therefore
755 ``devtool ide-sdk`` supports the classic, generic setup with GDB on the 853 ``devtool ide-sdk`` supports the classic, generic setup with GDB on the
756 development host and gdbserver on the target device. 854 development host and gdbserver on the target device.
757 855
758 Roughly summarized, this means: 856 Roughly summarized, this means:
759 857
760 - The binaries are copied via SSH to the remote target device by a script 858 - The binaries are copied via SSH to the remote target device by a
761 referred by ``tasks.json``. 859 script referred by ``tasks.json``.
762 860
763 - gdbserver is started on the remote target device via SSH by a script 861 - gdbserver is started on the remote target device via SSH by a script
764 referred by ``tasks.json``. 862 referred by ``tasks.json``.
@@ -783,8 +881,8 @@ The extensible SDK supports two different development modes.
783 .. code-block:: sh 881 .. code-block:: sh
784 882
785 # Create the SDK 883 # Create the SDK
786 devtool modify cmake-example 884 devtool modify cmake-example --debug-build
787 devtool ide-sdk cmake-example core-image-minimal -c --debug-build-config --ide=none 885 devtool ide-sdk cmake-example core-image-minimal -c --ide=none
788 886
789 # Install the firmware on a target device or start QEMU 887 # Install the firmware on a target device or start QEMU
790 runqemu 888 runqemu
@@ -860,16 +958,9 @@ The extensible SDK supports two different development modes.
860 958
861#. *Shared sysroots mode* 959#. *Shared sysroots mode*
862 960
863 For some recipes and use cases a per-recipe sysroot based SDK is not 961 Creating an SDK with shared :term:`Sysroots <Sysroot>` that contains all the
864 suitable. Optionally ``devtool ide-sdk`` configures the IDE to use the 962 dependencies needed to work with ``my-recipe`` is possible with the following
865 toolchain provided by the extensible SDK as described in 963 example command::
866 :ref:`running_the_ext_sdk_env`. ``devtool ide-sdk --mode=shared`` is
867 basically a wrapper for the setup of the extensible SDK as described in
868 :ref:`setting_up_ext_sdk_in_build`. The IDE gets a configuration to use the
869 shared sysroots.
870
871 Creating a SDK with shared sysroots that contains all the dependencies needed
872 to work with ``my-recipe`` is possible with the following example command::
873 964
874 $ devtool ide-sdk --mode=shared my-recipe 965 $ devtool ide-sdk --mode=shared my-recipe
875 966
@@ -883,12 +974,14 @@ The extensible SDK supports two different development modes.
883 echo "project(foo VERSION 1.0)" > kit-test/CMakeLists.txt 974 echo "project(foo VERSION 1.0)" > kit-test/CMakeLists.txt
884 code kit-test 975 code kit-test
885 976
886 If there is a CMake project in the workspace, cross-compilation is supported: 977 If there is a CMake project in the workspace, cross-compilation is
978 supported:
887 979
888 - Press ``Ctrl + Shift + P``, type ``CMake: Scan for Kits`` 980 - Press ``Ctrl + Shift + P``, type ``CMake: Scan for Kits``
889 - Press ``Ctrl + Shift + P``, type ``CMake: Select a Kit`` 981 - Press ``Ctrl + Shift + P``, type ``CMake: Select a Kit``
890 982
891 Finally most of the features provided by CMake and the IDE should be available. 983 Finally most of the features provided by CMake and the IDE should be
984 available.
892 985
893 Other IDEs than VSCode are supported as well. However, 986 Other IDEs than VSCode are supported as well. However,
894 ``devtool ide-sdk --mode=shared --ide=none my-recipe`` is currently 987 ``devtool ide-sdk --mode=shared --ide=none my-recipe`` is currently
diff --git a/documentation/sdk-manual/intro.rst b/documentation/sdk-manual/intro.rst
index e8fd191dbc..fbfc8c2ac7 100644
--- a/documentation/sdk-manual/intro.rst
+++ b/documentation/sdk-manual/intro.rst
@@ -173,7 +173,7 @@ You just need to follow these general steps:
173 root filesystem images. 173 root filesystem images.
174 174
175 If you are going to develop your application on hardware, go to the 175 If you are going to develop your application on hardware, go to the
176 :yocto_dl:`machines </releases/yocto/yocto-&DISTRO;/machines/>` download area and choose a 176 :yocto_dl:`machines </releases/yocto/&DISTRO_REL_LATEST_TAG;/machines/>` download area and choose a
177 target machine area from which to download the kernel image and root 177 target machine area from which to download the kernel image and root
178 filesystem. This download area could have several files in it that 178 filesystem. This download area could have several files in it that
179 support development using actual hardware. For example, the area 179 support development using actual hardware. For example, the area
@@ -183,7 +183,7 @@ You just need to follow these general steps:
183 183
184 If you are going to develop your application and then run and test it 184 If you are going to develop your application and then run and test it
185 using the QEMU emulator, go to the 185 using the QEMU emulator, go to the
186 :yocto_dl:`machines/qemu </releases/yocto/yocto-&DISTRO;/machines/qemu>` download area. From this 186 :yocto_dl:`machines/qemu </releases/yocto/&DISTRO_REL_LATEST_TAG;/machines/qemu>` download area. From this
187 area, go down into the directory for your target architecture (e.g. 187 area, go down into the directory for your target architecture (e.g.
188 ``qemux86_64`` for an Intel-based 64-bit architecture). Download the 188 ``qemux86_64`` for an Intel-based 64-bit architecture). Download the
189 kernel, root filesystem, and any other files you need for your 189 kernel, root filesystem, and any other files you need for your
diff --git a/documentation/sdk-manual/using.rst b/documentation/sdk-manual/using.rst
index f1ff0c76ca..bfb306abf5 100644
--- a/documentation/sdk-manual/using.rst
+++ b/documentation/sdk-manual/using.rst
@@ -43,7 +43,7 @@ Host` by running the ``*.sh`` installation script.
43 43
44You can download a tarball installer, which includes the pre-built 44You can download a tarball installer, which includes the pre-built
45toolchain, the ``runqemu`` script, and support files from the 45toolchain, the ``runqemu`` script, and support files from the
46appropriate :yocto_dl:`toolchain </releases/yocto/yocto-&DISTRO;/toolchain/>` directory within 46appropriate :yocto_dl:`toolchain </releases/yocto/&DISTRO_REL_LATEST_TAG;/toolchain/>` directory within
47the Index of Releases. Toolchains are available for several 32-bit and 47the Index of Releases. Toolchains are available for several 32-bit and
4864-bit architectures with the ``x86_64`` directories, respectively. The 4864-bit architectures with the ``x86_64`` directories, respectively. The
49toolchains the Yocto Project provides are based off the 49toolchains the Yocto Project provides are based off the