blob: bba93ccefaa42d21842d9e278c02edf3276a6842 [file] [log] [blame]
Brad Bishop316dfdd2018-06-25 12:45:53 -04001<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
2"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
3[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >
4
5<chapter id='overview-development-environment'>
6<title>The Yocto Project Development Environment</title>
7
8<para>
9 This chapter takes a look at the Yocto Project development
10 environment.
11 The chapter provides Yocto Project Development environment concepts that
12 help you understand how work is accomplished in an open source environment,
13 which is very different as compared to work accomplished in a closed,
14 proprietary environment.
15</para>
16
17<para>
18 Specifically, this chapter addresses open source philosophy, source
19 repositories, workflows, Git, and licensing.
20</para>
21
22<section id='open-source-philosophy'>
23 <title>Open Source Philosophy</title>
24
25 <para>
26 Open source philosophy is characterized by software development
27 directed by peer production and collaboration through an active
28 community of developers.
29 Contrast this to the more standard centralized development models
30 used by commercial software companies where a finite set of developers
31 produces a product for sale using a defined set of procedures that
32 ultimately result in an end product whose architecture and source
33 material are closed to the public.
34 </para>
35
36 <para>
37 Open source projects conceptually have differing concurrent agendas,
38 approaches, and production.
39 These facets of the development process can come from anyone in the
40 public (community) who has a stake in the software project.
41 The open source environment contains new copyright, licensing, domain,
42 and consumer issues that differ from the more traditional development
43 environment.
44 In an open source environment, the end product, source material,
45 and documentation are all available to the public at no cost.
46 </para>
47
48 <para>
49 A benchmark example of an open source project is the Linux kernel,
50 which was initially conceived and created by Finnish computer science
51 student Linus Torvalds in 1991.
52 Conversely, a good example of a non-open source project is the
53 <trademark class='registered'>Windows</trademark> family of operating
54 systems developed by
55 <trademark class='registered'>Microsoft</trademark> Corporation.
56 </para>
57
58 <para>
59 Wikipedia has a good historical description of the Open Source
60 Philosophy
61 <ulink url='http://en.wikipedia.org/wiki/Open_source'>here</ulink>.
62 You can also find helpful information on how to participate in the
63 Linux Community
64 <ulink url='http://ldn.linuxfoundation.org/book/how-participate-linux-community'>here</ulink>.
65 </para>
66</section>
67
68<section id='gs-the-development-host'>
69 <title>The Development Host</title>
70
71 <para>
72 A development host or
73 <ulink url='&YOCTO_DOCS_REF_URL;#hardware-build-system-term'>build host</ulink>
74 is key to using the Yocto Project.
75 Because the goal of the Yocto Project is to develop images or
76 applications that run on embedded hardware, development of those
77 images and applications generally takes place on a system not
78 intended to run the software - the development host.
79 </para>
80
81 <para>
82 You need to set up a development host in order to use it with the
83 Yocto Project.
84 Most find that it is best to have a native Linux machine function as
85 the development host.
86 However, it is possible to use a system that does not run Linux
87 as its operating system as your development host.
88 When you have a Mac or Windows-based system, you can set it up
89 as the development host by using
90 <ulink url='https://git.yoctoproject.org/cgit/cgit.cgi/crops/about/'>CROPS</ulink>,
91 which leverages
92 <ulink url='https://www.docker.com/'>Docker Containers</ulink>.
93 Once you take the steps to set up a CROPS machine, you effectively
94 have access to a shell environment that is similar to what you see
95 when using a Linux-based development host.
96 For the steps needed to set up a system using CROPS, see the
97 "<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-to-use-crops'>Setting Up to Use CROss PlatformS (CROPS)</ulink>"
98 section in the Yocto Project Development Tasks Manual.
99 </para>
100
101 <para>
102 If your development host is going to be a system that runs a Linux
103 distribution, steps still exist that you must take to prepare the
104 system for use with the Yocto Project.
105 You need to be sure that the Linux distribution on the system is
106 one that supports the Yocto Project.
107 You also need to be sure that the correct set of host packages are
108 installed that allow development using the Yocto Project.
109 For the steps needed to set up a development host that runs Linux,
110 see the
111 "<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-a-native-linux-host'>Setting Up a Native Linux Host</ulink>"
112 section in the Yocto Project Development Tasks Manual.
113 </para>
114
115 <para>
116 Once your development host is set up to use the Yocto Project,
117 several methods exist for you to do work in the Yocto Project
118 environment:
119 <itemizedlist>
120 <listitem><para>
121 <emphasis>Command Lines, BitBake, and Shells:</emphasis>
122 Traditional development in the Yocto Project involves using the
123 <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink>,
124 which uses BitBake, in a command-line environment from a shell
125 on your development host.
126 You can accomplish this from a host that is a native Linux
127 machine or from a host that has been set up with CROPS.
128 Either way, you create, modify, and build images and
129 applications all within a shell-based environment using
130 components and tools available through your Linux distribution
131 and the Yocto Project.</para>
132
133 <para>For a general flow of the build procedures, see the
134 "<ulink url='&YOCTO_DOCS_DEV_URL;#dev-building-a-simple-image'>Building a Simple Image</ulink>"
135 section in the Yocto Project Development Tasks Manual.
136 </para></listitem>
137 <listitem><para>
138 <emphasis>Board Support Package (BSP) Development:</emphasis>
139 Development of BSPs involves using the Yocto Project to
140 create and test layers that allow easy development of
141 images and applications targeted for specific hardware.
142 To development BSPs, you need to take some additional steps
143 beyond what was described in setting up a development host.
144 </para>
145
146 <para>The
147 <ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Package (BSP) Developer's Guide</ulink>
148 provides BSP-related development information.
149 For specifics on development host preparation, see the
150 "<ulink url='&YOCTO_DOCS_BSP_URL;#preparing-your-build-host-to-work-with-bsp-layers'>Preparing Your Build Host to Work With BSP Layers</ulink>"
151 section in the Yocto Project Board Support Package (BSP)
152 Developer's Guide.
153 </para></listitem>
154 <listitem><para>
155 <emphasis>Kernel Development:</emphasis>
156 If you are going to be developing kernels using the Yocto
157 Project you likely will be using <filename>devtool</filename>.
158 A workflow using <filename>devtool</filename> makes kernel
159 development quicker by reducing iteration cycle times.</para>
160
161 <para>The
162 <ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;'>Yocto Project Linux Kernel Development Manual</ulink>
163 provides kernel-related development information.
164 For specifics on development host preparation, see the
165 "<ulink url='&YOCTO_DOCS_KERNEL_DEV_URL;#preparing-the-build-host-to-work-on-the-kernel'>Preparing the Build Host to Work on the Kernel</ulink>"
166 section in the Yocto Project Linux Kernel Development Manual.
167 </para></listitem>
168 <listitem><para>
169 <emphasis>Using the <trademark class='trade'>Eclipse</trademark> IDE:</emphasis>
170 One of two Yocto Project development methods that involves an
171 interface that effectively puts the Yocto Project into the
172 background is the popular Eclipse IDE.
173 This method of development is advantageous if you are already
174 familiar with working within Eclipse.
175 Development is supported through a plugin that you install
176 onto your development host.</para>
177
178 <para>For steps that show you how to set up your development
179 host to use the Eclipse Yocto Project plugin, see the
180 "<ulink url='&YOCTO_DOCS_SDK_URL;#sdk-eclipse-project'>Developing Applications Using <trademark class='trade'>Eclipse</trademark></ulink>"
181 Chapter in the Yocto Project Application Development and the
182 Extensible Software Development Kit (eSDK) manual.
183 </para></listitem>
184 <listitem><para>
185 <emphasis>Using Toaster:</emphasis>
186 The other Yocto Project development method that involves an
187 interface that effectively puts the Yocto Project into the
188 background is Toaster.
189 Toaster provides an interface to the OpenEmbedded build system.
190 The interface enables you to configure and run your builds.
191 Information about builds is collected and stored in a database.
192 You can use Toaster to configure and start builds on multiple
193 remote build servers.</para>
194
195 <para>For steps that show you how to set up your development
196 host to use Toaster and on how to use Toaster in general,
197 see the
198 <ulink url='&YOCTO_DOCS_TOAST_URL;'>Toaster User Manual</ulink>.
199 </para></listitem>
200 </itemizedlist>
201 </para>
202</section>
203
204<section id='yocto-project-repositories'>
205 <title>Yocto Project Source Repositories</title>
206
207 <para>
208 The Yocto Project team maintains complete source repositories for all
209 Yocto Project files at
210 <ulink url='&YOCTO_GIT_URL;'></ulink>.
211 This web-based source code browser is organized into categories by
212 function such as IDE Plugins, Matchbox, Poky, Yocto Linux Kernel, and
213 so forth.
214 From the interface, you can click on any particular item in the "Name"
215 column and see the URL at the bottom of the page that you need to clone
216 a Git repository for that particular item.
217 Having a local Git repository of the
218 <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>,
219 which is usually named "poky", allows
220 you to make changes, contribute to the history, and ultimately enhance
221 the Yocto Project's tools, Board Support Packages, and so forth.
222 </para>
223
224 <para>
225 For any supported release of Yocto Project, you can also go to the
226 <ulink url='&YOCTO_HOME_URL;'>Yocto Project Website</ulink> and
227 select the "DOWNLOADS" item from the "SOFTWARE" menu and get a
228 released tarball of the <filename>poky</filename> repository, any
229 supported BSP tarball, or Yocto Project tools.
230 Unpacking these tarballs gives you a snapshot of the released
231 files.
232 <note><title>Notes</title>
233 <itemizedlist>
234 <listitem><para>
235 The recommended method for setting up the Yocto Project
236 <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
237 and the files for supported BSPs
238 (e.g., <filename>meta-intel</filename>) is to use
239 <link linkend='git'>Git</link> to create a local copy of
240 the upstream repositories.
241 </para></listitem>
242 <listitem><para>
243 Be sure to always work in matching branches for both
244 the selected BSP repository and the Source Directory
245 (i.e. <filename>poky</filename>) repository.
246 For example, if you have checked out the "master" branch
247 of <filename>poky</filename> and you are going to use
248 <filename>meta-intel</filename>, be sure to checkout the
249 "master" branch of <filename>meta-intel</filename>.
250 </para></listitem>
251 </itemizedlist>
252 </note>
253 </para>
254
255 <para>
256 In summary, here is where you can get the project files needed for
257 development:
258 <itemizedlist>
259 <listitem><para id='source-repositories'>
260 <emphasis>
261 <ulink url='&YOCTO_GIT_URL;'>Source Repositories:</ulink>
262 </emphasis>
263 This area contains IDE Plugins, Matchbox, Poky, Poky Support,
264 Tools, Yocto Linux Kernel, and Yocto Metadata Layers.
265 You can create local copies of Git repositories for each of
266 these areas.</para>
267
268 <para>
269 <imagedata fileref="figures/source-repos.png" align="center" width="6in" depth="4in" />
270 For steps on how to view and access these upstream Git
271 repositories, see the
272 "<ulink url='&YOCTO_DOCS_DEV_URL;#accessing-source-repositories'>Accessing Source Repositories</ulink>"
273 Section in the Yocto Project Development Tasks Manual.
274 </para></listitem>
275 <listitem><para><anchor id='index-downloads' />
276 <emphasis>
277 <ulink url='&YOCTO_DL_URL;/releases/'>Index of /releases:</ulink>
278 </emphasis>
279 This is an index of releases such as
280 the <trademark class='trade'>Eclipse</trademark>
281 Yocto Plug-in, miscellaneous support, Poky, Pseudo, installers
282 for cross-development toolchains, and all released versions of
283 Yocto Project in the form of images or tarballs.
284 Downloading and extracting these files does not produce a local
285 copy of the Git repository but rather a snapshot of a
286 particular release or image.</para>
287
288 <para>
289 <imagedata fileref="figures/index-downloads.png" align="center" width="6in" depth="3.5in" />
290 For steps on how to view and access these files, see the
291 "<ulink url='&YOCTO_DOCS_DEV_URL;#accessing-index-of-releases'>Accessing Index of Releases</ulink>"
292 section in the Yocto Project Development Tasks Manual.
293 </para></listitem>
294 <listitem><para id='downloads-page'>
295 <emphasis>"DOWNLOADS" page for the
296 <ulink url='&YOCTO_HOME_URL;'>Yocto Project Website</ulink>:
297 </emphasis></para>
298
299 <para>The Yocto Project website includes a "DOWNLOADS" page
300 accessible through the "SOFTWARE" menu that allows you to
301 download any Yocto Project release, tool, and Board Support
302 Package (BSP) in tarball form.
303 The tarballs are similar to those found in the
304 <ulink url='&YOCTO_DL_URL;/releases/'>Index of /releases:</ulink>
305 area.</para>
306
307 <para>
308 <imagedata fileref="figures/yp-download.png" align="center" width="6in" depth="4in" />
309 For steps on how to use the "DOWNLOADS" page, see the
310 "<ulink url='&YOCTO_DOCS_DEV_URL;#using-the-downloads-page'>Using the Downloads Page</ulink>"
311 section in the Yocto Project Development Tasks Manual.
312 </para></listitem>
313 </itemizedlist>
314 </para>
315</section>
316
317<section id='gs-git-workflows-and-the-yocto-project'>
318 <title>Git Workflows and the Yocto Project</title>
319
320 <para>
321 Developing using the Yocto Project likely requires the use of
322 <link linkend='git'>Git</link>.
323 Git is a free, open source distributed version control system
324 used as part of many collaborative design environments.
325 This section provides workflow concepts using the Yocto Project and
326 Git.
327 In particular, the information covers basic practices that describe
328 roles and actions in a collaborative development environment.
329 <note>
330 If you are familiar with this type of development environment, you
331 might not want to read this section.
332 </note>
333 </para>
334
335 <para>
336 The Yocto Project files are maintained using Git in "branches"
337 whose Git histories track every change and whose structures
338 provide branches for all diverging functionality.
339 Although there is no need to use Git, many open source projects do so.
340 <para>
341
342 </para>
343 For the Yocto Project, a key individual called the "maintainer" is
344 responsible for the integrity of the "master" branch of a given Git
345 repository.
346 The "master" branch is the “upstream” repository from which final or
347 most recent builds of a project occur.
348 The maintainer is responsible for accepting changes from other
349 developers and for organizing the underlying branch structure to
350 reflect release strategies and so forth.
351 <note>
352 For information on finding out who is responsible for (maintains)
353 a particular area of code in the Yocto Project, see the
354 "<ulink url='&YOCTO_DOCS_DEV_URL;#how-to-submit-a-change'>Submitting a Change to the Yocto Project</ulink>"
355 section of the Yocto Project Development Tasks Manual.
356 </note>
357 </para>
358
359 <para>
360 The Yocto Project <filename>poky</filename> Git repository also has an
361 upstream contribution Git repository named
362 <filename>poky-contrib</filename>.
363 You can see all the branches in this repository using the web interface
364 of the
365 <ulink url='&YOCTO_GIT_URL;'>Source Repositories</ulink> organized
366 within the "Poky Support" area.
367 These branches hold changes (commits) to the project that have been
368 submitted or committed by the Yocto Project development team and by
369 community members who contribute to the project.
370 The maintainer determines if the changes are qualified to be moved
371 from the "contrib" branches into the "master" branch of the Git
372 repository.
373 </para>
374
375 <para>
376 Developers (including contributing community members) create and
377 maintain cloned repositories of upstream branches.
378 The cloned repositories are local to their development platforms and
379 are used to develop changes.
380 When a developer is satisfied with a particular feature or change,
381 they "push" the change to the appropriate "contrib" repository.
382 </para>
383
384 <para>
385 Developers are responsible for keeping their local repository
386 up-to-date with whatever upstream branch they are working against.
387 They are also responsible for straightening out any conflicts that
388 might arise within files that are being worked on simultaneously by
389 more than one person.
390 All this work is done locally on the development host before
391 anything is pushed to a "contrib" area and examined at the maintainer’s
392 level.
393 </para>
394
395 <para>
396 A somewhat formal method exists by which developers commit changes
397 and push them into the "contrib" area and subsequently request that
398 the maintainer include them into an upstream branch.
399 This process is called “submitting a patch” or "submitting a change."
400 For information on submitting patches and changes, see the
401 "<ulink url='&YOCTO_DOCS_DEV_URL;#how-to-submit-a-change'>Submitting a Change to the Yocto Project</ulink>"
402 section in the Yocto Project Development Tasks Manual.
403 </para>
404
405 <para>
406 In summary, a single point of entry
407 exists for changes into a "master" or development branch of the
408 Git repository, which is controlled by the project’s maintainer.
409 And, a set of developers exist who independently develop, test, and
410 submit changes to "contrib" areas for the maintainer to examine.
411 The maintainer then chooses which changes are going to become a
412 permanent part of the project.
413 </para>
414
415 <para>
416 <imagedata fileref="figures/git-workflow.png" width="6in" depth="3in" align="left" scalefit="1" />
417 </para>
418
419 <para>
420 While each development environment is unique, there are some best
421 practices or methods that help development run smoothly.
422 The following list describes some of these practices.
423 For more information about Git workflows, see the workflow topics in
424 the
425 <ulink url='http://book.git-scm.com'>Git Community Book</ulink>.
426 <itemizedlist>
427 <listitem><para>
428 <emphasis>Make Small Changes:</emphasis>
429 It is best to keep the changes you commit small as compared to
430 bundling many disparate changes into a single commit.
431 This practice not only keeps things manageable but also allows
432 the maintainer to more easily include or refuse changes.
433 </para></listitem>
434 <listitem><para>
435 <emphasis>Make Complete Changes:</emphasis>
436 It is also good practice to leave the repository in a
437 state that allows you to still successfully build your project.
438 In other words, do not commit half of a feature,
439 then add the other half as a separate, later commit.
440 Each commit should take you from one buildable project state
441 to another buildable state.
442 </para></listitem>
443 <listitem><para>
444 <emphasis>Use Branches Liberally:</emphasis>
445 It is very easy to create, use, and delete local branches in
446 your working Git repository on the development host.
447 You can name these branches anything you like.
448 It is helpful to give them names associated with the particular
449 feature or change on which you are working.
450 Once you are done with a feature or change and have merged it
451 into your local master branch, simply discard the temporary
452 branch.
453 </para></listitem>
454 <listitem><para>
455 <emphasis>Merge Changes:</emphasis>
456 The <filename>git merge</filename> command allows you to take
457 the changes from one branch and fold them into another branch.
458 This process is especially helpful when more than a single
459 developer might be working on different parts of the same
460 feature.
461 Merging changes also automatically identifies any collisions
462 or "conflicts" that might happen as a result of the same lines
463 of code being altered by two different developers.
464 </para></listitem>
465 <listitem><para>
466 <emphasis>Manage Branches:</emphasis>
467 Because branches are easy to use, you should use a system
468 where branches indicate varying levels of code readiness.
469 For example, you can have a "work" branch to develop in, a
470 "test" branch where the code or change is tested, a "stage"
471 branch where changes are ready to be committed, and so forth.
472 As your project develops, you can merge code across the
473 branches to reflect ever-increasing stable states of the
474 development.
475 </para></listitem>
476 <listitem><para>
477 <emphasis>Use Push and Pull:</emphasis>
478 The push-pull workflow is based on the concept of developers
479 "pushing" local commits to a remote repository, which is
480 usually a contribution repository.
481 This workflow is also based on developers "pulling" known
482 states of the project down into their local development
483 repositories.
484 The workflow easily allows you to pull changes submitted by
485 other developers from the upstream repository into your
486 work area ensuring that you have the most recent software
487 on which to develop.
488 The Yocto Project has two scripts named
489 <filename>create-pull-request</filename> and
490 <filename>send-pull-request</filename> that ship with the
491 release to facilitate this workflow.
492 You can find these scripts in the <filename>scripts</filename>
493 folder of the
494 <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>.
495 For information on how to use these scripts, see the
496 "<ulink url='&YOCTO_DOCS_DEV_URL;#pushing-a-change-upstream'>Using Scripts to Push a Change Upstream and Request a Pull</ulink>"
497 section in the Yocto Project Development Tasks Manual.
498 </para></listitem>
499 <listitem><para>
500 <emphasis>Patch Workflow:</emphasis>
501 This workflow allows you to notify the maintainer through an
502 email that you have a change (or patch) you would like
503 considered for the "master" branch of the Git repository.
504 To send this type of change, you format the patch and then
505 send the email using the Git commands
506 <filename>git format-patch</filename> and
507 <filename>git send-email</filename>.
508 For information on how to use these scripts, see the
509 "<ulink url='&YOCTO_DOCS_DEV_URL;#how-to-submit-a-change'>Submitting a Change to the Yocto Project</ulink>"
510 section in the Yocto Project Development Tasks Manual.
511 </para></listitem>
512 </itemizedlist>
513 </para>
514</section>
515
516<section id='git'>
517 <title>Git</title>
518
519 <para>
520 The Yocto Project makes extensive use of Git, which is a
521 free, open source distributed version control system.
522 Git supports distributed development, non-linear development,
523 and can handle large projects.
524 It is best that you have some fundamental understanding
525 of how Git tracks projects and how to work with Git if
526 you are going to use the Yocto Project for development.
527 This section provides a quick overview of how Git works and
528 provides you with a summary of some essential Git commands.
529 <note><title>Notes</title>
530 <itemizedlist>
531 <listitem><para>
532 For more information on Git, see
533 <ulink url='http://git-scm.com/documentation'></ulink>.
534 </para></listitem>
535 <listitem><para>
536 If you need to download Git, it is recommended that you add
537 Git to your system through your distribution's "software
538 store" (e.g. for Ubuntu, use the Ubuntu Software feature).
539 For the Git download page, see
540 <ulink url='http://git-scm.com/download'></ulink>.
541 </para></listitem>
542 <listitem><para>
543 For information beyond the introductory nature in this
544 section, see the
545 "<ulink url='&YOCTO_DOCS_DEV_URL;#locating-yocto-project-source-files'>Locating Yocto Project Source Files</ulink>"
546 section in the Yocto Project Development Tasks Manual.
547 </para></listitem>
548 </itemizedlist>
549 </note>
550 </para>
551
552 <section id='repositories-tags-and-branches'>
553 <title>Repositories, Tags, and Branches</title>
554
555 <para>
556 As mentioned briefly in the previous section and also in the
557 "<link linkend='gs-git-workflows-and-the-yocto-project'>Git Workflows and the Yocto Project</link>"
558 section, the Yocto Project maintains source repositories at
559 <ulink url='&YOCTO_GIT_URL;'></ulink>.
560 If you look at this web-interface of the repositories, each item
561 is a separate Git repository.
562 </para>
563
564 <para>
565 Git repositories use branching techniques that track content
566 change (not files) within a project (e.g. a new feature or updated
567 documentation).
568 Creating a tree-like structure based on project divergence allows
569 for excellent historical information over the life of a project.
570 This methodology also allows for an environment from which you can
571 do lots of local experimentation on projects as you develop
572 changes or new features.
573 </para>
574
575 <para>
576 A Git repository represents all development efforts for a given
577 project.
578 For example, the Git repository <filename>poky</filename> contains
579 all changes and developments for that repository over the course
580 of its entire life.
581 That means that all changes that make up all releases are captured.
582 The repository maintains a complete history of changes.
583 </para>
584
585 <para>
586 You can create a local copy of any repository by "cloning" it
587 with the <filename>git clone</filename> command.
588 When you clone a Git repository, you end up with an identical
589 copy of the repository on your development system.
590 Once you have a local copy of a repository, you can take steps to
591 develop locally.
592 For examples on how to clone Git repositories, see the
593 "<ulink url='&YOCTO_DOCS_DEV_URL;#locating-yocto-project-source-files'>Locating Yocto Project Source Files</ulink>"
594 section in the Yocto Project Development Tasks Manual.
595 </para>
596
597 <para>
598 It is important to understand that Git tracks content change and
599 not files.
600 Git uses "branches" to organize different development efforts.
601 For example, the <filename>poky</filename> repository has
602 several branches that include the current "&DISTRO_NAME_NO_CAP;"
603 branch, the "master" branch, and many branches for past
604 Yocto Project releases.
605 You can see all the branches by going to
606 <ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/'></ulink> and
607 clicking on the
608 <filename><ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/refs/heads'>[...]</ulink></filename>
609 link beneath the "Branch" heading.
610 </para>
611
612 <para>
613 Each of these branches represents a specific area of development.
614 The "master" branch represents the current or most recent
615 development.
616 All other branches represent offshoots of the "master" branch.
617 </para>
618
619 <para>
620 When you create a local copy of a Git repository, the copy has
621 the same set of branches as the original.
622 This means you can use Git to create a local working area
623 (also called a branch) that tracks a specific development branch
624 from the upstream source Git repository.
625 in other words, you can define your local Git environment to
626 work on any development branch in the repository.
627 To help illustrate, consider the following example Git commands:
628 <literallayout class='monospaced'>
629 $ cd ~
630 $ git clone git://git.yoctoproject.org/poky
631 $ cd poky
632 $ git checkout -b &DISTRO_NAME_NO_CAP; origin/&DISTRO_NAME_NO_CAP;
633 </literallayout>
634 In the previous example after moving to the home directory, the
635 <filename>git clone</filename> command creates a
636 local copy of the upstream <filename>poky</filename> Git repository.
637 By default, Git checks out the "master" branch for your work.
638 After changing the working directory to the new local repository
639 (i.e. <filename>poky</filename>), the
640 <filename>git checkout</filename> command creates
641 and checks out a local branch named "&DISTRO_NAME_NO_CAP;", which
642 tracks the upstream "origin/&DISTRO_NAME_NO_CAP;" branch.
643 Changes you make while in this branch would ultimately affect
644 the upstream "&DISTRO_NAME_NO_CAP;" branch of the
645 <filename>poky</filename> repository.
646 </para>
647
648 <para>
649 It is important to understand that when you create and checkout a
650 local working branch based on a branch name,
651 your local environment matches the "tip" of that particular
652 development branch at the time you created your local branch,
653 which could be different from the files in the "master" branch
654 of the upstream repository.
655 In other words, creating and checking out a local branch based on
656 the "&DISTRO_NAME_NO_CAP;" branch name is not the same as
657 checking out the "master" branch in the repository.
658 Keep reading to see how you create a local snapshot of a Yocto
659 Project Release.
660 </para>
661
662 <para>
663 Git uses "tags" to mark specific changes in a repository branch
664 structure.
665 Typically, a tag is used to mark a special point such as the final
666 change (or commit) before a project is released.
667 You can see the tags used with the <filename>poky</filename> Git
668 repository by going to
669 <ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/'></ulink> and
670 clicking on the
671 <filename><ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/refs/tags'>[...]</ulink></filename>
672 link beneath the "Tag" heading.
673 </para>
674
675 <para>
676 Some key tags for the <filename>poky</filename> repository are
677 <filename>jethro-14.0.3</filename>,
678 <filename>morty-16.0.1</filename>,
679 <filename>pyro-17.0.0</filename>, and
680 <filename>&DISTRO_NAME_NO_CAP;-&POKYVERSION;</filename>.
681 These tags represent Yocto Project releases.
682 </para>
683
684 <para>
685 When you create a local copy of the Git repository, you also
686 have access to all the tags in the upstream repository.
687 Similar to branches, you can create and checkout a local working
688 Git branch based on a tag name.
689 When you do this, you get a snapshot of the Git repository that
690 reflects the state of the files when the change was made associated
691 with that tag.
692 The most common use is to checkout a working branch that matches
693 a specific Yocto Project release.
694 Here is an example:
695 <literallayout class='monospaced'>
696 $ cd ~
697 $ git clone git://git.yoctoproject.org/poky
698 $ cd poky
699 $ git fetch --tags
700 $ git checkout tags/rocko-18.0.0 -b my_rocko-18.0.0
701 </literallayout>
702 In this example, the name of the top-level directory of your
703 local Yocto Project repository is <filename>poky</filename>.
704 After moving to the <filename>poky</filename> directory, the
705 <filename>git fetch</filename> command makes all the upstream
706 tags available locally in your repository.
707 Finally, the <filename>git checkout</filename> command
708 creates and checks out a branch named "my-rocko-18.0.0" that is
709 based on the upstream branch whose "HEAD" matches the
710 commit in the repository associated with the "rocko-18.0.0" tag.
711 The files in your repository now exactly match that particular
712 Yocto Project release as it is tagged in the upstream Git
713 repository.
714 It is important to understand that when you create and
715 checkout a local working branch based on a tag, your environment
716 matches a specific point in time and not the entire development
717 branch (i.e. from the "tip" of the branch backwards).
718 </para>
719 </section>
720
721 <section id='basic-commands'>
722 <title>Basic Commands</title>
723
724 <para>
725 Git has an extensive set of commands that lets you manage changes
726 and perform collaboration over the life of a project.
727 Conveniently though, you can manage with a small set of basic
728 operations and workflows once you understand the basic
729 philosophy behind Git.
730 You do not have to be an expert in Git to be functional.
731 A good place to look for instruction on a minimal set of Git
732 commands is
733 <ulink url='http://git-scm.com/documentation'>here</ulink>.
734 </para>
735
736 <para>
737 The following list of Git commands briefly describes some basic
738 Git operations as a way to get started.
739 As with any set of commands, this list (in most cases) simply shows
740 the base command and omits the many arguments it supports.
741 See the Git documentation for complete descriptions and strategies
742 on how to use these commands:
743 <itemizedlist>
744 <listitem><para>
745 <emphasis><filename>git init</filename>:</emphasis>
746 Initializes an empty Git repository.
747 You cannot use Git commands unless you have a
748 <filename>.git</filename> repository.
749 </para></listitem>
750 <listitem><para id='git-commands-clone'>
751 <emphasis><filename>git clone</filename>:</emphasis>
752 Creates a local clone of a Git repository that is on
753 equal footing with a fellow developer’s Git repository
754 or an upstream repository.
755 </para></listitem>
756 <listitem><para>
757 <emphasis><filename>git add</filename>:</emphasis>
758 Locally stages updated file contents to the index that
759 Git uses to track changes.
760 You must stage all files that have changed before you
761 can commit them.
762 </para></listitem>
763 <listitem><para>
764 <emphasis><filename>git commit</filename>:</emphasis>
765 Creates a local "commit" that documents the changes you
766 made.
767 Only changes that have been staged can be committed.
768 Commits are used for historical purposes, for determining
769 if a maintainer of a project will allow the change,
770 and for ultimately pushing the change from your local
771 Git repository into the project’s upstream repository.
772 </para></listitem>
773 <listitem><para>
774 <emphasis><filename>git status</filename>:</emphasis>
775 Reports any modified files that possibly need to be
776 staged and gives you a status of where you stand regarding
777 local commits as compared to the upstream repository.
778 </para></listitem>
779 <listitem><para>
780 <emphasis><filename>git checkout</filename> <replaceable>branch-name</replaceable>:</emphasis>
781 Changes your local working branch and in this form
782 assumes the local branch already exists.
783 This command is analogous to "cd".
784 </para></listitem>
785 <listitem><para>
786 <emphasis><filename>git checkout –b</filename> <replaceable>working-branch</replaceable> <replaceable>upstream-branch</replaceable>:</emphasis>
787 Creates and checks out a working branch on your local
788 machine.
789 The local branch tracks the upstream branch.
790 You can use your local branch to isolate your work.
791 It is a good idea to use local branches when adding
792 specific features or changes.
793 Using isolated branches facilitates easy removal of
794 changes if they do not work out.
795 </para></listitem>
796 <listitem><para><emphasis><filename>git branch</filename>:</emphasis>
797 Displays the existing local branches associated with your
798 local repository.
799 The branch that you have currently checked out is noted
800 with an asterisk character.
801 </para></listitem>
802 <listitem><para>
803 <emphasis><filename>git branch -D</filename> <replaceable>branch-name</replaceable>:</emphasis>
804 Deletes an existing local branch.
805 You need to be in a local branch other than the one you
806 are deleting in order to delete
807 <replaceable>branch-name</replaceable>.
808 </para></listitem>
809 <listitem><para>
810 <emphasis><filename>git pull --rebase</filename>:</emphasis>
811 Retrieves information from an upstream Git repository
812 and places it in your local Git repository.
813 You use this command to make sure you are synchronized with
814 the repository from which you are basing changes
815 (.e.g. the "master" branch).
816 The "--rebase" option ensures that any local commits you
817 have in your branch are preserved at the top of your
818 local branch.
819 </para></listitem>
820 <listitem><para>
821 <emphasis><filename>git push</filename> <replaceable>repo-name</replaceable> <replaceable>local-branch</replaceable><filename>:</filename><replaceable>upstream-branch</replaceable>:</emphasis>
822 Sends all your committed local changes to the upstream Git
823 repository that your local repository is tracking
824 (e.g. a contribution repository).
825 The maintainer of the project draws from these repositories
826 to merge changes (commits) into the appropriate branch
827 of project's upstream repository.
828 </para></listitem>
829 <listitem><para>
830 <emphasis><filename>git merge</filename>:</emphasis>
831 Combines or adds changes from one
832 local branch of your repository with another branch.
833 When you create a local Git repository, the default branch
834 is named "master".
835 A typical workflow is to create a temporary branch that is
836 based off "master" that you would use for isolated work.
837 You would make your changes in that isolated branch,
838 stage and commit them locally, switch to the "master"
839 branch, and then use the <filename>git merge</filename>
840 command to apply the changes from your isolated branch
841 into the currently checked out branch (e.g. "master").
842 After the merge is complete and if you are done with
843 working in that isolated branch, you can safely delete
844 the isolated branch.
845 </para></listitem>
846 <listitem><para>
847 <emphasis><filename>git cherry-pick</filename> <replaceable>commits</replaceable>:</emphasis>
848 Choose and apply specific commits from one branch
849 into another branch.
850 There are times when you might not be able to merge
851 all the changes in one branch with
852 another but need to pick out certain ones.
853 </para></listitem>
854 <listitem><para>
855 <emphasis><filename>gitk</filename>:</emphasis>
856 Provides a GUI view of the branches and changes in your
857 local Git repository.
858 This command is a good way to graphically see where things
859 have diverged in your local repository.
860 <note>
861 You need to install the <filename>gitk</filename>
862 package on your development system to use this
863 command.
864 </note>
865 </para></listitem>
866 <listitem><para>
867 <emphasis><filename>git log</filename>:</emphasis>
868 Reports a history of your commits to the repository.
869 This report lists all commits regardless of whether you
870 have pushed them upstream or not.
871 </para></listitem>
872 <listitem><para>
873 <emphasis><filename>git diff</filename>:</emphasis>
874 Displays line-by-line differences between a local
875 working file and the same file as understood by Git.
876 This command is useful to see what you have changed
877 in any given file.
878 </para></listitem>
879 </itemizedlist>
880 </para>
881 </section>
882</section>
883
884<section id='licensing'>
885 <title>Licensing</title>
886
887 <para>
888 Because open source projects are open to the public, they have
889 different licensing structures in place.
890 License evolution for both Open Source and Free Software has an
891 interesting history.
892 If you are interested in this history, you can find basic information
893 here:
894 <itemizedlist>
895 <listitem><para>
896 <ulink url='http://en.wikipedia.org/wiki/Open-source_license'>Open source license history</ulink>
897 </para></listitem>
898 <listitem><para>
899 <ulink url='http://en.wikipedia.org/wiki/Free_software_license'>Free software license history</ulink>
900 </para></listitem>
901 </itemizedlist>
902 </para>
903
904 <para>
905 In general, the Yocto Project is broadly licensed under the
906 Massachusetts Institute of Technology (MIT) License.
907 MIT licensing permits the reuse of software within proprietary
908 software as long as the license is distributed with that software.
909 MIT is also compatible with the GNU General Public License (GPL).
910 Patches to the Yocto Project follow the upstream licensing scheme.
911 You can find information on the MIT license
912 <ulink url='http://www.opensource.org/licenses/mit-license.php'>here</ulink>.
913 You can find information on the GNU GPL
914 <ulink url='http://www.opensource.org/licenses/LGPL-3.0'>here</ulink>.
915 </para>
916
917 <para>
918 When you build an image using the Yocto Project, the build process
919 uses a known list of licenses to ensure compliance.
920 You can find this list in the
921 <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
922 at <filename>meta/files/common-licenses</filename>.
923 Once the build completes, the list of all licenses found and used
924 during that build are kept in the
925 <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>
926 at <filename>tmp/deploy/licenses</filename>.
927 </para>
928
929 <para>
930 If a module requires a license that is not in the base list, the
931 build process generates a warning during the build.
932 These tools make it easier for a developer to be certain of the
933 licenses with which their shipped products must comply.
934 However, even with these tools it is still up to the developer to
935 resolve potential licensing issues.
936 </para>
937
938 <para>
939 The base list of licenses used by the build process is a combination
940 of the Software Package Data Exchange (SPDX) list and the Open
941 Source Initiative (OSI) projects.
942 <ulink url='http://spdx.org'>SPDX Group</ulink> is a working group of
943 the Linux Foundation that maintains a specification for a standard
944 format for communicating the components, licenses, and copyrights
945 associated with a software package.
946 <ulink url='http://opensource.org'>OSI</ulink> is a corporation
947 dedicated to the Open Source Definition and the effort for reviewing
948 and approving licenses that conform to the Open Source Definition
949 (OSD).
950 </para>
951
952 <para>
953 You can find a list of the combined SPDX and OSI licenses that the
954 Yocto Project uses in the
955 <filename>meta/files/common-licenses</filename> directory in your
956 <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>.
957 </para>
958
959 <para>
960 For information that can help you maintain compliance with various
961 open source licensing during the lifecycle of a product created using
962 the Yocto Project, see the
963 "<ulink url='&YOCTO_DOCS_DEV_URL;#maintaining-open-source-license-compliance-during-your-products-lifecycle'>Maintaining Open Source License Compliance During Your Product's Lifecycle</ulink>"
964 section in the Yocto Project Development Tasks Manual.
965 </para>
966</section>
967</chapter>
968<!--
969vim: expandtab tw=80 ts=4
970-->