Andrew Geissler | f034379 | 2020-11-18 10:42:21 -0600 | [diff] [blame] | 1 | .. SPDX-License-Identifier: CC-BY-SA-2.0-UK |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 2 | |
| 3 | ***************************************** |
| 4 | The Yocto Project Development Environment |
| 5 | ***************************************** |
| 6 | |
| 7 | This chapter takes a look at the Yocto Project development environment. |
| 8 | The chapter provides Yocto Project Development environment concepts that |
| 9 | help you understand how work is accomplished in an open source |
| 10 | environment, which is very different as compared to work accomplished in |
| 11 | a closed, proprietary environment. |
| 12 | |
| 13 | Specifically, this chapter addresses open source philosophy, source |
| 14 | repositories, workflows, Git, and licensing. |
| 15 | |
| 16 | Open Source Philosophy |
| 17 | ====================== |
| 18 | |
| 19 | Open source philosophy is characterized by software development directed |
| 20 | by peer production and collaboration through an active community of |
| 21 | developers. Contrast this to the more standard centralized development |
| 22 | models used by commercial software companies where a finite set of |
| 23 | developers produces a product for sale using a defined set of procedures |
| 24 | that ultimately result in an end product whose architecture and source |
| 25 | material are closed to the public. |
| 26 | |
| 27 | Open source projects conceptually have differing concurrent agendas, |
| 28 | approaches, and production. These facets of the development process can |
| 29 | come from anyone in the public (community) who has a stake in the |
| 30 | software project. The open source environment contains new copyright, |
| 31 | licensing, domain, and consumer issues that differ from the more |
| 32 | traditional development environment. In an open source environment, the |
| 33 | end product, source material, and documentation are all available to the |
| 34 | public at no cost. |
| 35 | |
| 36 | A benchmark example of an open source project is the Linux kernel, which |
| 37 | was initially conceived and created by Finnish computer science student |
| 38 | Linus Torvalds in 1991. Conversely, a good example of a non-open source |
| 39 | project is the Windows family of operating systems developed by |
| 40 | Microsoft Corporation. |
| 41 | |
Patrick Williams | 7784c42 | 2022-11-17 07:29:11 -0600 | [diff] [blame] | 42 | Wikipedia has a good :wikipedia:`historical description of the Open Source |
| 43 | Philosophy <Open_source>`. You can also find helpful information on how |
| 44 | to participate in the Linux Community |
Andrew Geissler | c3d88e4 | 2020-10-02 09:45:00 -0500 | [diff] [blame] | 45 | `here <https://www.kernel.org/doc/html/latest/process/index.html>`__. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 46 | |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 47 | The Development Host |
| 48 | ==================== |
| 49 | |
| 50 | A development host or :term:`Build Host` is key to |
| 51 | using the Yocto Project. Because the goal of the Yocto Project is to |
| 52 | develop images or applications that run on embedded hardware, |
| 53 | development of those images and applications generally takes place on a |
Andrew Geissler | 615f2f1 | 2022-07-15 14:00:58 -0500 | [diff] [blame] | 54 | system not intended to run the software --- the development host. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 55 | |
| 56 | You need to set up a development host in order to use it with the Yocto |
| 57 | Project. Most find that it is best to have a native Linux machine |
| 58 | function as the development host. However, it is possible to use a |
| 59 | system that does not run Linux as its operating system as your |
| 60 | development host. When you have a Mac or Windows-based system, you can |
| 61 | set it up as the development host by using |
| 62 | `CROPS <https://github.com/crops/poky-container>`__, which leverages |
| 63 | `Docker Containers <https://www.docker.com/>`__. Once you take the steps |
| 64 | to set up a CROPS machine, you effectively have access to a shell |
| 65 | environment that is similar to what you see when using a Linux-based |
| 66 | development host. For the steps needed to set up a system using CROPS, |
| 67 | see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 68 | ":ref:`dev-manual/start:setting up to use cross platforms (crops)`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 69 | section in |
| 70 | the Yocto Project Development Tasks Manual. |
| 71 | |
| 72 | If your development host is going to be a system that runs a Linux |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 73 | distribution, you must still take steps to prepare the system |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 74 | for use with the Yocto Project. You need to be sure that the Linux |
| 75 | distribution on the system is one that supports the Yocto Project. You |
| 76 | also need to be sure that the correct set of host packages are installed |
| 77 | that allow development using the Yocto Project. For the steps needed to |
| 78 | set up a development host that runs Linux, see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 79 | ":ref:`dev-manual/start:setting up a native linux host`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 80 | section in the Yocto Project Development Tasks Manual. |
| 81 | |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 82 | Once your development host is set up to use the Yocto Project, there |
| 83 | are several ways of working in the Yocto Project environment: |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 84 | |
| 85 | - *Command Lines, BitBake, and Shells:* Traditional development in the |
| 86 | Yocto Project involves using the :term:`OpenEmbedded Build System`, |
| 87 | which uses |
| 88 | BitBake, in a command-line environment from a shell on your |
| 89 | development host. You can accomplish this from a host that is a |
| 90 | native Linux machine or from a host that has been set up with CROPS. |
| 91 | Either way, you create, modify, and build images and applications all |
| 92 | within a shell-based environment using components and tools available |
| 93 | through your Linux distribution and the Yocto Project. |
| 94 | |
| 95 | For a general flow of the build procedures, see the |
Andrew Geissler | 517393d | 2023-01-13 08:55:19 -0600 | [diff] [blame] | 96 | ":ref:`dev-manual/building:building a simple image`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 97 | section in the Yocto Project Development Tasks Manual. |
| 98 | |
| 99 | - *Board Support Package (BSP) Development:* Development of BSPs |
| 100 | involves using the Yocto Project to create and test layers that allow |
| 101 | easy development of images and applications targeted for specific |
| 102 | hardware. To development BSPs, you need to take some additional steps |
| 103 | beyond what was described in setting up a development host. |
| 104 | |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 105 | The :doc:`/bsp-guide/index` provides BSP-related development |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 106 | information. For specifics on development host preparation, see the |
| 107 | ":ref:`bsp-guide/bsp:preparing your build host to work with bsp layers`" |
| 108 | section in the Yocto Project Board Support Package (BSP) Developer's |
| 109 | Guide. |
| 110 | |
| 111 | - *Kernel Development:* If you are going to be developing kernels using |
| 112 | the Yocto Project you likely will be using ``devtool``. A workflow |
| 113 | using ``devtool`` makes kernel development quicker by reducing |
| 114 | iteration cycle times. |
| 115 | |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 116 | The :doc:`/kernel-dev/index` provides kernel-related |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 117 | development information. For specifics on development host |
| 118 | preparation, see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 119 | ":ref:`kernel-dev/common:preparing the build host to work on the kernel`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 120 | section in the Yocto Project Linux Kernel Development Manual. |
| 121 | |
| 122 | - *Using Toaster:* The other Yocto Project development method that |
| 123 | involves an interface that effectively puts the Yocto Project into |
| 124 | the background is Toaster. Toaster provides an interface to the |
| 125 | OpenEmbedded build system. The interface enables you to configure and |
| 126 | run your builds. Information about builds is collected and stored in |
| 127 | a database. You can use Toaster to configure and start builds on |
| 128 | multiple remote build servers. |
| 129 | |
| 130 | For steps that show you how to set up your development host to use |
| 131 | Toaster and on how to use Toaster in general, see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 132 | :doc:`/toaster-manual/index`. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 133 | |
| 134 | Yocto Project Source Repositories |
| 135 | ================================= |
| 136 | |
| 137 | The Yocto Project team maintains complete source repositories for all |
| 138 | Yocto Project files at :yocto_git:`/`. This web-based source |
| 139 | code browser is organized into categories by function such as IDE |
| 140 | Plugins, Matchbox, Poky, Yocto Linux Kernel, and so forth. From the |
| 141 | interface, you can click on any particular item in the "Name" column and |
| 142 | see the URL at the bottom of the page that you need to clone a Git |
| 143 | repository for that particular item. Having a local Git repository of |
| 144 | the :term:`Source Directory`, which |
| 145 | is usually named "poky", allows you to make changes, contribute to the |
| 146 | history, and ultimately enhance the Yocto Project's tools, Board Support |
| 147 | Packages, and so forth. |
| 148 | |
| 149 | For any supported release of Yocto Project, you can also go to the |
| 150 | :yocto_home:`Yocto Project Website <>` and select the "DOWNLOADS" |
| 151 | item from the "SOFTWARE" menu and get a released tarball of the ``poky`` |
| 152 | repository, any supported BSP tarball, or Yocto Project tools. Unpacking |
| 153 | these tarballs gives you a snapshot of the released files. |
| 154 | |
| 155 | .. note:: |
| 156 | |
| 157 | - The recommended method for setting up the Yocto Project |
| 158 | :term:`Source Directory` and the files |
Andrew Geissler | 3b8a17c | 2021-04-15 15:55:55 -0500 | [diff] [blame] | 159 | for supported BSPs (e.g., ``meta-intel``) is to use |
| 160 | :ref:`overview-manual/development-environment:git` |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 161 | to create a local copy of the upstream repositories. |
| 162 | |
| 163 | - Be sure to always work in matching branches for both the selected |
| 164 | BSP repository and the Source Directory (i.e. ``poky``) |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 165 | repository. For example, if you have checked out the "&DISTRO_NAME_NO_CAP;" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 166 | branch of ``poky`` and you are going to use ``meta-intel``, be |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 167 | sure to checkout the "&DISTRO_NAME_NO_CAP;" branch of ``meta-intel``. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 168 | |
| 169 | In summary, here is where you can get the project files needed for |
| 170 | development: |
| 171 | |
Patrick Williams | 8e7b46e | 2023-05-01 14:19:06 -0500 | [diff] [blame] | 172 | - :yocto_git:`Source Repositories: <>` This area contains Poky, Yocto |
| 173 | documentation, metadata layers, and Linux kernel. You can create local |
| 174 | copies of Git repositories for each of these areas. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 175 | |
| 176 | .. image:: figures/source-repos.png |
Andrew Geissler | d583833 | 2022-05-27 11:33:10 -0500 | [diff] [blame] | 177 | :width: 100% |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 178 | |
| 179 | For steps on how to view and access these upstream Git repositories, |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 180 | see the ":ref:`dev-manual/start:accessing source repositories`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 181 | Section in the Yocto Project Development Tasks Manual. |
| 182 | |
Patrick Williams | 8e7b46e | 2023-05-01 14:19:06 -0500 | [diff] [blame] | 183 | - :yocto_dl:`Yocto release archives: </releases/yocto>` This is where you can |
| 184 | download tarballs corresponding to each Yocto Project release. Downloading |
| 185 | and extracting these files does not produce a local copy of a Git repository |
| 186 | but rather a snapshot corresponding to a particular release. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 187 | |
Patrick Williams | 8e7b46e | 2023-05-01 14:19:06 -0500 | [diff] [blame] | 188 | - :yocto_home:`DOWNLOADS page </software-overview/downloads/>`: |
| 189 | The :yocto_home:`Yocto Project website <>` includes a "DOWNLOADS" page accessible |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 190 | through the "SOFTWARE" menu that allows you to download any Yocto |
| 191 | Project release, tool, and Board Support Package (BSP) in tarball |
Patrick Williams | 8e7b46e | 2023-05-01 14:19:06 -0500 | [diff] [blame] | 192 | form. The hyperlinks point to the tarballs under |
| 193 | :yocto_dl:`/releases/yocto/`. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 194 | |
| 195 | .. image:: figures/yp-download.png |
Andrew Geissler | d583833 | 2022-05-27 11:33:10 -0500 | [diff] [blame] | 196 | :width: 100% |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 197 | |
| 198 | For steps on how to use the "DOWNLOADS" page, see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 199 | ":ref:`dev-manual/start:using the downloads page`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 200 | section in the Yocto Project Development Tasks Manual. |
| 201 | |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 202 | Git Workflows and the Yocto Project |
| 203 | =================================== |
| 204 | |
| 205 | Developing using the Yocto Project likely requires the use of |
Andrew Geissler | 3b8a17c | 2021-04-15 15:55:55 -0500 | [diff] [blame] | 206 | :ref:`overview-manual/development-environment:git`. |
| 207 | Git is a free, open source distributed version control |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 208 | system used as part of many collaborative design environments. This |
| 209 | section provides workflow concepts using the Yocto Project and Git. In |
| 210 | particular, the information covers basic practices that describe roles |
| 211 | and actions in a collaborative development environment. |
| 212 | |
| 213 | .. note:: |
| 214 | |
| 215 | If you are familiar with this type of development environment, you |
| 216 | might not want to read this section. |
| 217 | |
| 218 | The Yocto Project files are maintained using Git in "branches" whose Git |
| 219 | histories track every change and whose structures provide branches for |
| 220 | all diverging functionality. Although there is no need to use Git, many |
| 221 | open source projects do so. |
| 222 | |
| 223 | For the Yocto Project, a key individual called the "maintainer" is |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 224 | responsible for the integrity of the development branch of a given Git |
| 225 | repository. The development branch is the "upstream" repository from which |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 226 | final or most recent builds of a project occur. The maintainer is |
| 227 | responsible for accepting changes from other developers and for |
| 228 | organizing the underlying branch structure to reflect release strategies |
| 229 | and so forth. |
| 230 | |
| 231 | .. note:: |
| 232 | |
| 233 | For information on finding out who is responsible for (maintains) a |
| 234 | particular area of code in the Yocto Project, see the |
Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 235 | ":doc:`../contributor-guide/identify-component`" |
| 236 | section of the Yocto Project and OpenEmbedded Contributor Guide. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 237 | |
| 238 | The Yocto Project ``poky`` Git repository also has an upstream |
| 239 | contribution Git repository named ``poky-contrib``. You can see all the |
| 240 | branches in this repository using the web interface of the |
| 241 | :yocto_git:`Source Repositories <>` organized within the "Poky Support" |
| 242 | area. These branches hold changes (commits) to the project that have |
| 243 | been submitted or committed by the Yocto Project development team and by |
| 244 | community members who contribute to the project. The maintainer |
| 245 | determines if the changes are qualified to be moved from the "contrib" |
| 246 | branches into the "master" branch of the Git repository. |
| 247 | |
| 248 | Developers (including contributing community members) create and |
| 249 | maintain cloned repositories of upstream branches. The cloned |
| 250 | repositories are local to their development platforms and are used to |
| 251 | develop changes. When a developer is satisfied with a particular feature |
| 252 | or change, they "push" the change to the appropriate "contrib" |
| 253 | repository. |
| 254 | |
| 255 | Developers are responsible for keeping their local repository up-to-date |
| 256 | with whatever upstream branch they are working against. They are also |
| 257 | responsible for straightening out any conflicts that might arise within |
| 258 | files that are being worked on simultaneously by more than one person. |
| 259 | All this work is done locally on the development host before anything is |
| 260 | pushed to a "contrib" area and examined at the maintainer's level. |
| 261 | |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 262 | There is a somewhat formal method by which developers commit changes and |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 263 | push them into the "contrib" area and subsequently request that the |
| 264 | maintainer include them into an upstream branch. This process is called |
| 265 | "submitting a patch" or "submitting a change." For information on |
| 266 | submitting patches and changes, see the |
Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 267 | ":doc:`../contributor-guide/submit-changes`" section in the Yocto Project |
| 268 | and OpenEmbedded Contributor Guide. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 269 | |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 270 | In summary, there is a single point of entry for changes into the |
| 271 | development branch of the Git repository, which is controlled by the |
William A. Kennington III | ac69b48 | 2021-06-02 12:28:27 -0700 | [diff] [blame] | 272 | project's maintainer. A set of developers independently |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 273 | develop, test, and submit changes to "contrib" areas for the maintainer |
| 274 | to examine. The maintainer then chooses which changes are going to |
| 275 | become a permanent part of the project. |
| 276 | |
Andrew Geissler | eff2747 | 2021-10-29 15:35:00 -0500 | [diff] [blame] | 277 | .. image:: svg/git-workflow.* |
| 278 | :width: 100% |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 279 | |
| 280 | While each development environment is unique, there are some best |
| 281 | practices or methods that help development run smoothly. The following |
| 282 | list describes some of these practices. For more information about Git |
| 283 | workflows, see the workflow topics in the `Git Community |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 284 | Book <https://book.git-scm.com>`__. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 285 | |
| 286 | - *Make Small Changes:* It is best to keep the changes you commit small |
| 287 | as compared to bundling many disparate changes into a single commit. |
| 288 | This practice not only keeps things manageable but also allows the |
| 289 | maintainer to more easily include or refuse changes. |
| 290 | |
| 291 | - *Make Complete Changes:* It is also good practice to leave the |
| 292 | repository in a state that allows you to still successfully build |
| 293 | your project. In other words, do not commit half of a feature, then |
| 294 | add the other half as a separate, later commit. Each commit should |
| 295 | take you from one buildable project state to another buildable state. |
| 296 | |
| 297 | - *Use Branches Liberally:* It is very easy to create, use, and delete |
| 298 | local branches in your working Git repository on the development |
| 299 | host. You can name these branches anything you like. It is helpful to |
| 300 | give them names associated with the particular feature or change on |
| 301 | which you are working. Once you are done with a feature or change and |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 302 | have merged it into your local development branch, simply discard the |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 303 | temporary branch. |
| 304 | |
| 305 | - *Merge Changes:* The ``git merge`` command allows you to take the |
| 306 | changes from one branch and fold them into another branch. This |
| 307 | process is especially helpful when more than a single developer might |
| 308 | be working on different parts of the same feature. Merging changes |
| 309 | also automatically identifies any collisions or "conflicts" that |
| 310 | might happen as a result of the same lines of code being altered by |
| 311 | two different developers. |
| 312 | |
| 313 | - *Manage Branches:* Because branches are easy to use, you should use a |
| 314 | system where branches indicate varying levels of code readiness. For |
| 315 | example, you can have a "work" branch to develop in, a "test" branch |
| 316 | where the code or change is tested, a "stage" branch where changes |
| 317 | are ready to be committed, and so forth. As your project develops, |
| 318 | you can merge code across the branches to reflect ever-increasing |
| 319 | stable states of the development. |
| 320 | |
| 321 | - *Use Push and Pull:* The push-pull workflow is based on the concept |
| 322 | of developers "pushing" local commits to a remote repository, which |
| 323 | is usually a contribution repository. This workflow is also based on |
| 324 | developers "pulling" known states of the project down into their |
| 325 | local development repositories. The workflow easily allows you to |
| 326 | pull changes submitted by other developers from the upstream |
| 327 | repository into your work area ensuring that you have the most recent |
| 328 | software on which to develop. The Yocto Project has two scripts named |
| 329 | ``create-pull-request`` and ``send-pull-request`` that ship with the |
| 330 | release to facilitate this workflow. You can find these scripts in |
Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 331 | the ``scripts`` folder of the :term:`Source Directory`. For information |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 332 | on how to use these scripts, see the |
Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 333 | ":ref:`contributor-guide/submit-changes:using scripts to push a change upstream and request a pull`" |
| 334 | section in the Yocto Project and OpenEmbedded Contributor Guide. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 335 | |
| 336 | - *Patch Workflow:* This workflow allows you to notify the maintainer |
| 337 | through an email that you have a change (or patch) you would like |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 338 | considered for the development branch of the Git repository. To send |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 339 | this type of change, you format the patch and then send the email |
| 340 | using the Git commands ``git format-patch`` and ``git send-email``. |
| 341 | For information on how to use these scripts, see the |
Andrew Geissler | 5082cc7 | 2023-09-11 08:41:39 -0400 | [diff] [blame] | 342 | ":doc:`../contributor-guide/submit-changes`" section in the Yocto Project |
| 343 | and OpenEmbedded Contributor Guide. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 344 | |
| 345 | Git |
| 346 | === |
| 347 | |
| 348 | The Yocto Project makes extensive use of Git, which is a free, open |
| 349 | source distributed version control system. Git supports distributed |
| 350 | development, non-linear development, and can handle large projects. It |
| 351 | is best that you have some fundamental understanding of how Git tracks |
| 352 | projects and how to work with Git if you are going to use the Yocto |
| 353 | Project for development. This section provides a quick overview of how |
| 354 | Git works and provides you with a summary of some essential Git |
| 355 | commands. |
| 356 | |
| 357 | .. note:: |
| 358 | |
| 359 | - For more information on Git, see |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 360 | https://git-scm.com/documentation. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 361 | |
| 362 | - If you need to download Git, it is recommended that you add Git to |
| 363 | your system through your distribution's "software store" (e.g. for |
| 364 | Ubuntu, use the Ubuntu Software feature). For the Git download |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 365 | page, see https://git-scm.com/download. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 366 | |
| 367 | - For information beyond the introductory nature in this section, |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 368 | see the ":ref:`dev-manual/start:locating yocto project source files`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 369 | section in the Yocto Project Development Tasks Manual. |
| 370 | |
| 371 | Repositories, Tags, and Branches |
| 372 | -------------------------------- |
| 373 | |
Andrew Geissler | 3b8a17c | 2021-04-15 15:55:55 -0500 | [diff] [blame] | 374 | As mentioned briefly in the previous section and also in the |
| 375 | ":ref:`overview-manual/development-environment:git workflows and the yocto project`" |
| 376 | section, the Yocto Project maintains source repositories at :yocto_git:`/`. |
| 377 | If you look at this web-interface of the repositories, each item is a separate |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 378 | Git repository. |
| 379 | |
| 380 | Git repositories use branching techniques that track content change (not |
| 381 | files) within a project (e.g. a new feature or updated documentation). |
| 382 | Creating a tree-like structure based on project divergence allows for |
| 383 | excellent historical information over the life of a project. This |
| 384 | methodology also allows for an environment from which you can do lots of |
| 385 | local experimentation on projects as you develop changes or new |
| 386 | features. |
| 387 | |
| 388 | A Git repository represents all development efforts for a given project. |
| 389 | For example, the Git repository ``poky`` contains all changes and |
| 390 | developments for that repository over the course of its entire life. |
| 391 | That means that all changes that make up all releases are captured. The |
| 392 | repository maintains a complete history of changes. |
| 393 | |
| 394 | You can create a local copy of any repository by "cloning" it with the |
| 395 | ``git clone`` command. When you clone a Git repository, you end up with |
| 396 | an identical copy of the repository on your development system. Once you |
| 397 | have a local copy of a repository, you can take steps to develop |
| 398 | locally. For examples on how to clone Git repositories, see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 399 | ":ref:`dev-manual/start:locating yocto project source files`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 400 | section in the Yocto Project Development Tasks Manual. |
| 401 | |
| 402 | It is important to understand that Git tracks content change and not |
| 403 | files. Git uses "branches" to organize different development efforts. |
| 404 | For example, the ``poky`` repository has several branches that include |
| 405 | the current "&DISTRO_NAME_NO_CAP;" branch, the "master" branch, and many |
| 406 | branches for past Yocto Project releases. You can see all the branches |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 407 | by going to :yocto_git:`/poky/` and clicking on the |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 408 | ``[...]`` link beneath the "Branch" heading. |
| 409 | |
| 410 | Each of these branches represents a specific area of development. The |
| 411 | "master" branch represents the current or most recent development. All |
| 412 | other branches represent offshoots of the "master" branch. |
| 413 | |
| 414 | When you create a local copy of a Git repository, the copy has the same |
| 415 | set of branches as the original. This means you can use Git to create a |
| 416 | local working area (also called a branch) that tracks a specific |
Patrick Williams | 4585273 | 2022-04-02 08:58:32 -0500 | [diff] [blame] | 417 | development branch from the upstream source Git repository. In other |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 418 | words, you can define your local Git environment to work on any |
| 419 | development branch in the repository. To help illustrate, consider the |
Andrew Geissler | c926e17 | 2021-05-07 16:11:35 -0500 | [diff] [blame] | 420 | following example Git commands:: |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 421 | |
| 422 | $ cd ~ |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 423 | $ git clone git://git.yoctoproject.org/poky -b &DISTRO_NAME_NO_CAP; |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 424 | |
| 425 | In the previous example |
| 426 | after moving to the home directory, the ``git clone`` command creates a |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 427 | local copy of the upstream ``poky`` Git repository and checks out a |
| 428 | local branch named "&DISTRO_NAME_NO_CAP;", which tracks the upstream |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 429 | "origin/&DISTRO_NAME_NO_CAP;" branch. Changes you make while in this |
| 430 | branch would ultimately affect the upstream "&DISTRO_NAME_NO_CAP;" branch |
| 431 | of the ``poky`` repository. |
| 432 | |
| 433 | It is important to understand that when you create and checkout a local |
| 434 | working branch based on a branch name, your local environment matches |
| 435 | the "tip" of that particular development branch at the time you created |
| 436 | your local branch, which could be different from the files in the |
| 437 | "master" branch of the upstream repository. In other words, creating and |
| 438 | checking out a local branch based on the "&DISTRO_NAME_NO_CAP;" branch |
| 439 | name is not the same as checking out the "master" branch in the |
| 440 | repository. Keep reading to see how you create a local snapshot of a |
| 441 | Yocto Project Release. |
| 442 | |
| 443 | Git uses "tags" to mark specific changes in a repository branch |
| 444 | structure. Typically, a tag is used to mark a special point such as the |
| 445 | final change (or commit) before a project is released. You can see the |
Andrew Geissler | 09209ee | 2020-12-13 08:44:15 -0600 | [diff] [blame] | 446 | tags used with the ``poky`` Git repository by going to :yocto_git:`/poky/` |
| 447 | and clicking on the ``[...]`` link beneath the "Tag" heading. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 448 | |
| 449 | Some key tags for the ``poky`` repository are ``jethro-14.0.3``, |
| 450 | ``morty-16.0.1``, ``pyro-17.0.0``, and |
Andrew Geissler | 9aee500 | 2022-03-30 16:27:02 +0000 | [diff] [blame] | 451 | ``&DISTRO_NAME_NO_CAP;-&DISTRO;``. These tags represent Yocto Project |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 452 | releases. |
| 453 | |
| 454 | When you create a local copy of the Git repository, you also have access |
| 455 | to all the tags in the upstream repository. Similar to branches, you can |
| 456 | create and checkout a local working Git branch based on a tag name. When |
| 457 | you do this, you get a snapshot of the Git repository that reflects the |
| 458 | state of the files when the change was made associated with that tag. |
| 459 | The most common use is to checkout a working branch that matches a |
Andrew Geissler | c926e17 | 2021-05-07 16:11:35 -0500 | [diff] [blame] | 460 | specific Yocto Project release. Here is an example:: |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 461 | |
| 462 | $ cd ~ |
| 463 | $ git clone git://git.yoctoproject.org/poky |
| 464 | $ cd poky |
| 465 | $ git fetch --tags |
| 466 | $ git checkout tags/rocko-18.0.0 -b my_rocko-18.0.0 |
| 467 | |
| 468 | In this example, the name |
| 469 | of the top-level directory of your local Yocto Project repository is |
| 470 | ``poky``. After moving to the ``poky`` directory, the ``git fetch`` |
| 471 | command makes all the upstream tags available locally in your |
| 472 | repository. Finally, the ``git checkout`` command creates and checks out |
| 473 | a branch named "my-rocko-18.0.0" that is based on the upstream branch |
| 474 | whose "HEAD" matches the commit in the repository associated with the |
| 475 | "rocko-18.0.0" tag. The files in your repository now exactly match that |
| 476 | particular Yocto Project release as it is tagged in the upstream Git |
| 477 | repository. It is important to understand that when you create and |
| 478 | checkout a local working branch based on a tag, your environment matches |
| 479 | a specific point in time and not the entire development branch (i.e. |
| 480 | from the "tip" of the branch backwards). |
| 481 | |
| 482 | Basic Commands |
| 483 | -------------- |
| 484 | |
| 485 | Git has an extensive set of commands that lets you manage changes and |
| 486 | perform collaboration over the life of a project. Conveniently though, |
| 487 | you can manage with a small set of basic operations and workflows once |
| 488 | you understand the basic philosophy behind Git. You do not have to be an |
| 489 | expert in Git to be functional. A good place to look for instruction on |
| 490 | a minimal set of Git commands is |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 491 | `here <https://git-scm.com/documentation>`__. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 492 | |
| 493 | The following list of Git commands briefly describes some basic Git |
| 494 | operations as a way to get started. As with any set of commands, this |
| 495 | list (in most cases) simply shows the base command and omits the many |
| 496 | arguments it supports. See the Git documentation for complete |
| 497 | descriptions and strategies on how to use these commands: |
| 498 | |
| 499 | - *git init:* Initializes an empty Git repository. You cannot use |
| 500 | Git commands unless you have a ``.git`` repository. |
| 501 | |
| 502 | - *git clone:* Creates a local clone of a Git repository that is on |
| 503 | equal footing with a fellow developer's Git repository or an upstream |
| 504 | repository. |
| 505 | |
| 506 | - *git add:* Locally stages updated file contents to the index that |
| 507 | Git uses to track changes. You must stage all files that have changed |
| 508 | before you can commit them. |
| 509 | |
| 510 | - *git commit:* Creates a local "commit" that documents the changes |
| 511 | you made. Only changes that have been staged can be committed. |
| 512 | Commits are used for historical purposes, for determining if a |
| 513 | maintainer of a project will allow the change, and for ultimately |
| 514 | pushing the change from your local Git repository into the project's |
| 515 | upstream repository. |
| 516 | |
| 517 | - *git status:* Reports any modified files that possibly need to be |
| 518 | staged and gives you a status of where you stand regarding local |
| 519 | commits as compared to the upstream repository. |
| 520 | |
| 521 | - *git checkout branch-name:* Changes your local working branch and |
| 522 | in this form assumes the local branch already exists. This command is |
| 523 | analogous to "cd". |
| 524 | |
Andrew Geissler | 3b8a17c | 2021-04-15 15:55:55 -0500 | [diff] [blame] | 525 | - *git checkout -b working-branch upstream-branch:* Creates and |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 526 | checks out a working branch on your local machine. The local branch |
| 527 | tracks the upstream branch. You can use your local branch to isolate |
| 528 | your work. It is a good idea to use local branches when adding |
| 529 | specific features or changes. Using isolated branches facilitates |
| 530 | easy removal of changes if they do not work out. |
| 531 | |
| 532 | - *git branch:* Displays the existing local branches associated |
| 533 | with your local repository. The branch that you have currently |
| 534 | checked out is noted with an asterisk character. |
| 535 | |
| 536 | - *git branch -D branch-name:* Deletes an existing local branch. |
| 537 | You need to be in a local branch other than the one you are deleting |
| 538 | in order to delete branch-name. |
| 539 | |
Patrick Williams | 4585273 | 2022-04-02 08:58:32 -0500 | [diff] [blame] | 540 | - *git pull \-\-rebase*: Retrieves information from an upstream Git |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 541 | repository and places it in your local Git repository. You use this |
| 542 | command to make sure you are synchronized with the repository from |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 543 | which you are basing changes (e.g. the "&DISTRO_NAME_NO_CAP;" |
Patrick Williams | 4585273 | 2022-04-02 08:58:32 -0500 | [diff] [blame] | 544 | branch). The ``--rebase`` option ensures that any local commits you |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 545 | have in your branch are preserved at the top of your local branch. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 546 | |
| 547 | - *git push repo-name local-branch:upstream-branch:* Sends |
| 548 | all your committed local changes to the upstream Git repository that |
| 549 | your local repository is tracking (e.g. a contribution repository). |
| 550 | The maintainer of the project draws from these repositories to merge |
| 551 | changes (commits) into the appropriate branch of project's upstream |
| 552 | repository. |
| 553 | |
| 554 | - *git merge:* Combines or adds changes from one local branch of |
| 555 | your repository with another branch. When you create a local Git |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 556 | repository, the default branch may be named "main". A typical |
| 557 | workflow is to create a temporary branch that is based off "main" |
| 558 | that you would use for isolated work. You would make your changes in |
| 559 | that isolated branch, stage and commit them locally, switch to the |
| 560 | "main" branch, and then use the ``git merge`` command to apply the |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 561 | changes from your isolated branch into the currently checked out |
Andrew Geissler | 595f630 | 2022-01-24 19:11:47 +0000 | [diff] [blame] | 562 | branch (e.g. "main"). After the merge is complete and if you are |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 563 | done with working in that isolated branch, you can safely delete the |
| 564 | isolated branch. |
| 565 | |
| 566 | - *git cherry-pick commits:* Choose and apply specific commits from |
| 567 | one branch into another branch. There are times when you might not be |
| 568 | able to merge all the changes in one branch with another but need to |
| 569 | pick out certain ones. |
| 570 | |
| 571 | - *gitk:* Provides a GUI view of the branches and changes in your |
| 572 | local Git repository. This command is a good way to graphically see |
| 573 | where things have diverged in your local repository. |
| 574 | |
| 575 | .. note:: |
| 576 | |
| 577 | You need to install the |
| 578 | gitk |
| 579 | package on your development system to use this command. |
| 580 | |
| 581 | - *git log:* Reports a history of your commits to the repository. |
| 582 | This report lists all commits regardless of whether you have pushed |
| 583 | them upstream or not. |
| 584 | |
| 585 | - *git diff:* Displays line-by-line differences between a local |
| 586 | working file and the same file as understood by Git. This command is |
| 587 | useful to see what you have changed in any given file. |
| 588 | |
| 589 | Licensing |
| 590 | ========= |
| 591 | |
| 592 | Because open source projects are open to the public, they have different |
| 593 | licensing structures in place. License evolution for both Open Source |
| 594 | and Free Software has an interesting history. If you are interested in |
| 595 | this history, you can find basic information here: |
| 596 | |
Patrick Williams | 7784c42 | 2022-11-17 07:29:11 -0600 | [diff] [blame] | 597 | - :wikipedia:`Open source license history <Open-source_license>` |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 598 | |
Patrick Williams | 7784c42 | 2022-11-17 07:29:11 -0600 | [diff] [blame] | 599 | - :wikipedia:`Free software license history <Free_software_license>` |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 600 | |
| 601 | In general, the Yocto Project is broadly licensed under the |
| 602 | Massachusetts Institute of Technology (MIT) License. MIT licensing |
| 603 | permits the reuse of software within proprietary software as long as the |
Patrick Williams | 03907ee | 2022-05-01 06:28:52 -0500 | [diff] [blame] | 604 | license is distributed with that software. Patches to the Yocto Project |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 605 | follow the upstream licensing scheme. You can find information on the |
Patrick Williams | 7784c42 | 2022-11-17 07:29:11 -0600 | [diff] [blame] | 606 | MIT license :wikipedia:`here <MIT_License>`. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 607 | |
| 608 | When you build an image using the Yocto Project, the build process uses |
| 609 | a known list of licenses to ensure compliance. You can find this list in |
Patrick Williams | 2390b1b | 2022-11-03 13:47:49 -0500 | [diff] [blame] | 610 | the :term:`Source Directory` at ``meta/files/common-licenses``. Once the |
| 611 | build completes, the list of all licenses found and used during that build |
| 612 | are kept in the :term:`Build Directory` at ``tmp/deploy/licenses``. |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 613 | |
| 614 | If a module requires a license that is not in the base list, the build |
| 615 | process generates a warning during the build. These tools make it easier |
| 616 | for a developer to be certain of the licenses with which their shipped |
| 617 | products must comply. However, even with these tools it is still up to |
| 618 | the developer to resolve potential licensing issues. |
| 619 | |
| 620 | The base list of licenses used by the build process is a combination of |
| 621 | the Software Package Data Exchange (SPDX) list and the Open Source |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 622 | Initiative (OSI) projects. `SPDX Group <https://spdx.org>`__ is a working |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 623 | group of the Linux Foundation that maintains a specification for a |
| 624 | standard format for communicating the components, licenses, and |
| 625 | copyrights associated with a software package. |
Andrew Geissler | d1e8949 | 2021-02-12 15:35:20 -0600 | [diff] [blame] | 626 | `OSI <https://opensource.org>`__ is a corporation dedicated to the Open |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 627 | Source Definition and the effort for reviewing and approving licenses |
| 628 | that conform to the Open Source Definition (OSD). |
| 629 | |
| 630 | You can find a list of the combined SPDX and OSI licenses that the Yocto |
| 631 | Project uses in the ``meta/files/common-licenses`` directory in your |
| 632 | :term:`Source Directory`. |
| 633 | |
| 634 | For information that can help you maintain compliance with various open |
| 635 | source licensing during the lifecycle of a product created using the |
| 636 | Yocto Project, see the |
Andrew Geissler | 517393d | 2023-01-13 08:55:19 -0600 | [diff] [blame] | 637 | ":ref:`dev-manual/licenses:maintaining open source license compliance during your product's lifecycle`" |
Andrew Geissler | c9f7865 | 2020-09-18 14:11:35 -0500 | [diff] [blame] | 638 | section in the Yocto Project Development Tasks Manual. |