summaryrefslogtreecommitdiffstats
path: root/documentation/dev-manual/dev-manual-newbie.xml
blob: c2147b39e7927c1924cca10518755119f45dc375 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] >

<chapter id='dev-manual-newbie'>

<title>The Yocto Project Open Source Development Environment</title>

<section id="usingpoky-changes-collaborate">
    <title>Using the Yocto Project in a Team Environment</title>

    <para>
        It might not be immediately clear how you can use the Yocto
        Project in a team environment, or scale it for a large team of
        developers.
        One of the strengths of the Yocto Project is that it is extremely
        flexible.
        Thus, you can adapt it to many different use cases and scenarios.
        However, these characteristics can cause a struggle if you are trying
        to create a working setup that scales across a large team.
    </para>

    <para>
        To help with these types of situations, this section presents
        some of the project's most successful experiences,
        practices, solutions, and available technologies that work well.
        Keep in mind, the information here is a starting point.
        You can build off it and customize it to fit any
        particular working environment and set of practices.
    </para>

    <section id='best-practices-system-configurations'>
        <title>System Configurations</title>

        <para>
            Systems across a large team should meet the needs of
            two types of developers: those working on the contents of the
            operating system image itself and those developing applications.
            Regardless of the type of developer, their workstations must
            be both reasonably powerful and run Linux.
        </para>

        <section id='best-practices-application-development'>
            <title>Application Development</title>

            <para>
                For developers who mainly do application level work
                on top of an existing software stack,
                the following list shows practices that work best.
                For information on using a Software Development Kit (SDK), see
                the
                <ulink url='&YOCTO_DOCS_SDK_URL;#sdk-intro'>Yocto Project Software Development Kit (SDK) Developer's Guide</ulink>:
                <itemizedlist>
                    <listitem><para>Use a pre-built toolchain that
                        contains the software stack itself.
                        Then, develop the application code on top of the
                        stack.
                        This method works well for small numbers of relatively
                        isolated applications.</para></listitem>
                    <listitem><para>When possible, use the Yocto Project
                        plug-in for the <trademark class='trade'>Eclipse</trademark> IDE
                        and SDK development practices.
                        For more information, see the
                        "<ulink url='&YOCTO_DOCS_SDK_URL;'>Yocto Project Software Development Kit (SDK) Developer's Guide</ulink>".
                        </para></listitem>
                    <listitem><para>Keep your cross-development toolchains
                        updated.
                        You can do this through provisioning either as new
                        toolchain downloads or as updates through a package
                        update mechanism using <filename>opkg</filename>
                        to provide updates to an existing toolchain.
                        The exact mechanics of how and when to do this are a
                        question for local policy.</para></listitem>
                    <listitem><para>Use multiple toolchains installed locally
                        into different locations to allow development across
                        versions.</para></listitem>
                </itemizedlist>
            </para>
        </section>

        <section id='best-practices-core-system-development'>
            <title>Core System Development</title>

            <para>
                For core system development, it is often best to have the
                build system itself available on the developer workstations
                so developers can run their own builds and directly
                rebuild the software stack.
                You should keep the core system unchanged as much as
                possible and do your work in layers on top of the core system.
                Doing so gives you a greater level of portability when
                upgrading to new versions of the core system or Board
                Support Packages (BSPs).
                You can share layers amongst the developers of a particular
                project and contain the policy configuration that defines
                the project.
            </para>

            <para>
                Aside from the previous best practices, there exists a number
                of tips and tricks that can help speed up core development
                projects:
                <itemizedlist>
                    <listitem><para>Use a
                        <ulink url='&YOCTO_DOCS_REF_URL;#shared-state-cache'>Shared State Cache</ulink>
                        (sstate) among groups of developers who are on a
                        fast network.
                        The best way to share sstate is through a
                        Network File System (NFS) share.
                        The first user to build a given component for the
                        first time contributes that object to the sstate,
                        while subsequent builds from other developers then
                        reuse the object rather than rebuild it themselves.
                        </para>
                        <para>Although it is possible to use other protocols for the
                        sstate such as HTTP and FTP, you should avoid these.
                        Using HTTP limits the sstate to read-only and
                        FTP provides poor performance.
                        </para></listitem>
                    <listitem><para>Have autobuilders contribute to the sstate
                        pool similarly to how the developer workstations
                        contribute.
                        For information, see the
                        "<link linkend='best-practices-autobuilders'>Autobuilders</link>"
                        section.</para></listitem>
                    <listitem><para>Build stand-alone tarballs that contain
                        "missing" system requirements if for some reason
                        developer workstations do not meet minimum system
                        requirements such as latest Python versions,
                        <filename>chrpath</filename>, or other tools.
                        You can install and relocate the tarball exactly as you
                        would the usual cross-development toolchain so that
                        all developers can meet minimum version requirements
                        on most distributions.</para></listitem>
                    <listitem><para>Use a small number of shared,
                        high performance systems for testing purposes
                        (e.g. dual, six-core Xeons with 24 Gbytes of RAM
                        and plenty of disk space).
                        Developers can use these systems for wider, more
                        extensive testing while they continue to develop
                        locally using their primary development system.
                        </para></listitem>
                    <listitem><para>Enable the PR Service when package feeds
                        need to be incremental with continually increasing
                        <ulink url='&YOCTO_DOCS_REF_URL;#var-PR'>PR</ulink>
                        values.
                        Typically, this situation occurs when you use or
                        publish package feeds and use a shared state.
                        You should enable the PR Service for all users who
                        use the shared state pool.
                        For more information on the PR Service, see the
                        "<link linkend='working-with-a-pr-service'>Working With a PR Service</link>".
                        </para></listitem>
                </itemizedlist>
            </para>
        </section>
    </section>

    <section id='best-practices-source-control-management'>
        <title>Source Control Management (SCM)</title>

        <para>
            Keeping your
            <ulink url='&YOCTO_DOCS_REF_URL;#metadata'>Metadata</ulink>
            and any software you are developing under the
            control of an SCM system that is compatible
            with the OpenEmbedded build system is advisable.
            Of the SCMs BitBake supports, the
            Yocto Project team strongly recommends using
            <link linkend='git'>Git</link>.
            Git is a distributed system that is easy to backup,
            allows you to work remotely, and then connects back to the
            infrastructure.
            <note>
                For information about BitBake, see the
                <ulink url='&YOCTO_DOCS_BB_URL;'>BitBake User Manual</ulink>.
            </note>
        </para>

        <para>
            It is relatively easy to set up Git services and create
            infrastructure like
            <ulink url='&YOCTO_GIT_URL;'>http://git.yoctoproject.org</ulink>,
            which is based on server software called
            <filename>gitolite</filename> with <filename>cgit</filename>
            being used to generate the web interface that lets you view the
            repositories.
            The <filename>gitolite</filename> software identifies users
            using SSH keys and allows branch-based
            access controls to repositories that you can control as little
            or as much as necessary.
        </para>

        <note>
            The setup of these services is beyond the scope of this manual.
            However, sites such as these exist that describe how to perform
            setup:
            <itemizedlist>
                <listitem><para><ulink url='http://git-scm.com/book/ch4-8.html'>Git documentation</ulink>:
                    Describes how to install <filename>gitolite</filename>
                    on the server.</para></listitem>
                <listitem><para><ulink url='http://sitaramc.github.com/gitolite/master-toc.html'>The <filename>gitolite</filename> master index</ulink>:
                    All topics for <filename>gitolite</filename>.
                    </para></listitem>
                <listitem><para><ulink url='https://git.wiki.kernel.org/index.php/Interfaces,_frontends,_and_tools'>Interfaces, frontends, and tools</ulink>:
                    Documentation on how to create interfaces and frontends
                    for Git.</para></listitem>
            </itemizedlist>
        </note>
    </section>

    <section id='best-practices-autobuilders'>
        <title>Autobuilders</title>

        <para>
            Autobuilders are often the core of a development project.
            It is here that changes from individual developers are brought
            together and centrally tested and subsequent decisions about
            releases can be made.
            Autobuilders also allow for "continuous integration" style
            testing of software components and regression identification
            and tracking.
        </para>

        <para>
            See "<ulink url='http://autobuilder.yoctoproject.org'>Yocto Project Autobuilder</ulink>"
            for more information and links to buildbot.
            The Yocto Project team has found this implementation
            works well in this role.
            A public example of this is the Yocto Project
            Autobuilders, which we use to test the overall health of the
            project.
        </para>

        <para>
            The features of this system are:
            <itemizedlist>
                <listitem><para>Highlights when commits break the build.
                    </para></listitem>
                <listitem><para>Populates an sstate cache from which
                    developers can pull rather than requiring local
                    builds.</para></listitem>
                <listitem><para>Allows commit hook triggers,
                    which trigger builds when commits are made.
                    </para></listitem>
                <listitem><para>Allows triggering of automated image booting
                    and testing under the QuickEMUlator (QEMU).
                    </para></listitem>
                <listitem><para>Supports incremental build testing and
                    from-scratch builds.</para></listitem>
                <listitem><para>Shares output that allows developer
                    testing and historical regression investigation.
                    </para></listitem>
                <listitem><para>Creates output that can be used for releases.
                    </para></listitem>
                <listitem><para>Allows scheduling of builds so that resources
                    can be used efficiently.</para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='best-practices-policies-and-change-flow'>
        <title>Policies and Change Flow</title>

        <para>
            The Yocto Project itself uses a hierarchical structure and a
            pull model.
            Scripts exist to create and send pull requests
            (i.e. <filename>create-pull-request</filename> and
            <filename>send-pull-request</filename>).
            This model is in line with other open source projects where
            maintainers are responsible for specific areas of the project
            and a single maintainer handles the final "top-of-tree" merges.
        </para>

        <note>
            You can also use a more collective push model.
            The <filename>gitolite</filename> software supports both the
            push and pull models quite easily.
        </note>

        <para>
            As with any development environment, it is important
            to document the policy used as well as any main project
            guidelines so they are understood by everyone.
            It is also a good idea to have well structured
            commit messages, which are usually a part of a project's
            guidelines.
            Good commit messages are essential when looking back in time and
            trying to understand why changes were made.
        </para>

        <para>
            If you discover that changes are needed to the core layer of the
            project, it is worth sharing those with the community as soon
            as possible.
            Chances are if you have discovered the need for changes, someone
            else in the community needs them also.
        </para>
    </section>

    <section id='best-practices-summary'>
        <title>Summary</title>

        <para>
            This section summarizes the key recommendations described in the
            previous sections:
            <itemizedlist>
                <listitem><para>Use <link linkend='git'>Git</link>
                    as the source control system.</para></listitem>
                <listitem><para>Maintain your Metadata in layers that make sense
                    for your situation.
                    See the "<link linkend='understanding-and-creating-layers'>Understanding
                    and Creating Layers</link>" section for more information on
                    layers.</para></listitem>
                <listitem><para>
                    Separate the project's Metadata and code by using
                    separate Git repositories.
                    See the
                    "<ulink url='&YOCTO_DOCS_REF_URL;#yocto-project-repositories'>Yocto Project Source Repositories</ulink>"
                    section for information on these repositories.
                    See the
                    "<link linkend='getting-setup'>Getting Set Up</link>"
                    section for information on how to set up local Git
                    repositories for related upstream Yocto Project
                    Git repositories.
                    </para></listitem>
                <listitem><para>Set up the directory for the shared state cache
                    (<ulink url='&YOCTO_DOCS_REF_URL;#var-SSTATE_DIR'><filename>SSTATE_DIR</filename></ulink>)
                    where it makes sense.
                    For example, set up the sstate cache on a system used
                    by developers in the same organization and share the
                    same source directories on their machines.
                    </para></listitem>
                <listitem><para>Set up an Autobuilder and have it populate the
                    sstate cache and source directories.</para></listitem>
                <listitem><para>The Yocto Project community encourages you
                    to send patches to the project to fix bugs or add features.
                    If you do submit patches, follow the project commit
                    guidelines for writing good commit messages.
                    See the "<link linkend='how-to-submit-a-change'>How to Submit a Change</link>"
                    section.</para></listitem>
                <listitem><para>Send changes to the core sooner than later
                    as others are likely to run into the same issues.
                    For some guidance on mailing lists to use, see the list in the
                    "<link linkend='how-to-submit-a-change'>How to Submit a Change</link>"
                    section.
                    For a description of the available mailing lists, see the
                    "<ulink url='&YOCTO_DOCS_REF_URL;#resources-mailinglist'>Mailing Lists</ulink>"
                    section in the Yocto Project Reference Manual.
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>
</section>

<section id='git'>
    <title>Git</title>

    <para>
        The Yocto Project makes extensive use of Git,
        which is a free, open source distributed version control system.
        Git supports distributed development, non-linear development, and can handle large projects.
        It is best that you have some fundamental understanding of how Git tracks projects and
        how to work with Git if you are going to use the Yocto Project for development.
        This section provides a quick overview of how Git works and provides you with a summary
        of some essential Git commands.
    </para>

    <para>
        For more information on Git, see
        <ulink url='http://git-scm.com/documentation'></ulink>.
        If you need to download Git, go to <ulink url='http://git-scm.com/download'></ulink>.
    </para>

    <section id='repositories-tags-and-branches'>
        <title>Repositories, Tags, and Branches</title>

        <para>
            As mentioned earlier in the section
            "<ulink url='&YOCTO_DOCS_REF_URL;#yocto-project-repositories'>Yocto Project Source Repositories</ulink>",
            the Yocto Project maintains source repositories at
            <ulink url='&YOCTO_GIT_URL;/cgit.cgi'></ulink>.
            If you look at this web-interface of the repositories, each item is a separate
            Git repository.
        </para>

        <para>
            Git repositories use branching techniques that track content change (not files)
            within a project (e.g. a new feature or updated documentation).
            Creating a tree-like structure based on project divergence allows for excellent historical
            information over the life of a project.
            This methodology also allows for an environment from which you can do lots of
            local experimentation on projects as you develop changes or new features.
        </para>

        <para>
            A Git repository represents all development efforts for a given project.
            For example, the Git repository <filename>poky</filename> contains all changes
            and developments for Poky over the course of its entire life.
            That means that all changes that make up all releases are captured.
            The repository maintains a complete history of changes.
        </para>

        <para>
            You can create a local copy of any repository by "cloning" it with the Git
            <filename>clone</filename> command.
            When you clone a Git repository, you end up with an identical copy of the
            repository on your development system.
            Once you have a local copy of a repository, you can take steps to develop locally.
            For examples on how to clone Git repositories, see the
            "<link linkend='getting-setup'>Getting Set Up</link>" section.
        </para>

        <para>
            It is important to understand that Git tracks content change and
            not files.
            Git uses "branches" to organize different development efforts.
            For example, the <filename>poky</filename> repository has
            several branches that include the current
            <filename>&DISTRO_NAME_NO_CAP;</filename> branch, the
            <filename>master</filename> branch, and many branches for past
            Yocto Project releases.
            You can see all the branches by going to
            <ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/'></ulink> and
            clicking on the
            <filename><ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/refs/heads'>[...]</ulink></filename>
            link beneath the "Branch" heading.
        </para>

        <para>
            Each of these branches represents a specific area of development.
            The <filename>master</filename> branch represents the current or most recent
            development.
            All other branches represent offshoots of the <filename>master</filename>
            branch.
        </para>

        <para>
            When you create a local copy of a Git repository, the copy has the same set
            of branches as the original.
            This means you can use Git to create a local working area (also called a branch)
            that tracks a specific development branch from the source Git repository.
            in other words, you can define your local Git environment to work on any development
            branch in the repository.
            To help illustrate, here is a set of commands that creates a local copy of the
            <filename>poky</filename> Git repository and then creates and checks out a local
            Git branch that tracks the Yocto Project &DISTRO; Release (&DISTRO_NAME;) development:
            <literallayout class='monospaced'>
     $ cd ~
     $ git clone git://git.yoctoproject.org/poky
     $ cd poky
     $ git checkout -b &DISTRO_NAME_NO_CAP; origin/&DISTRO_NAME_NO_CAP;
            </literallayout>
            In this example, the name of the top-level directory of your local
            <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
            is "poky" and the name of that local working area (local branch)
            you just created and checked out is "&DISTRO_NAME_NO_CAP;".
            The files in your local repository now reflect the same files that
            are in the "&DISTRO_NAME_NO_CAP;" development branch of the
            Yocto Project's "poky" upstream repository.
            It is important to understand that when you create and checkout a
            local working branch based on a branch name,
            your local environment matches the "tip" of that development branch
            at the time you created your local branch, which could be
            different from the files at the time of a similarly named release.
            In other words, creating and checking out a local branch based on
            the "&DISTRO_NAME_NO_CAP;" branch name is not the same as
            cloning and checking out the "master" branch.
            Keep reading to see how you create a local snapshot of a Yocto
            Project Release.
        </para>

        <para>
            Git uses "tags" to mark specific changes in a repository.
            Typically, a tag is used to mark a special point such as the final
            change before a project is released.
            You can see the tags used with the <filename>poky</filename> Git
            repository by going to
            <ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/'></ulink> and
            clicking on the
            <filename><ulink url='&YOCTO_GIT_URL;/cgit.cgi/poky/refs/tags'>[...]</ulink></filename>
            link beneath the "Tag" heading.
        </para>

        <para>
            Some key tags are
            <filename>dizzy-12.0.0</filename>,
            <filename>fido-13.0.0</filename>,
            <filename>jethro-14.0.0</filename>, and
            <filename>&DISTRO_NAME_NO_CAP;-&POKYVERSION;</filename>.
            These tags represent Yocto Project releases.
        </para>

        <para>
            When you create a local copy of the Git repository, you also have access to all the
            tags.
            Similar to branches, you can create and checkout a local working Git branch based
            on a tag name.
            When you do this, you get a snapshot of the Git repository that reflects
            the state of the files when the change was made associated with that tag.
            The most common use is to checkout a working branch that matches a specific
            Yocto Project release.
            Here is an example:
            <literallayout class='monospaced'>
     $ cd ~
     $ git clone git://git.yoctoproject.org/poky
     $ cd poky
     $ git checkout -b my-&DISTRO_NAME_NO_CAP;-&POKYVERSION; &DISTRO_NAME_NO_CAP;-&POKYVERSION;
            </literallayout>
            In this example, the name of the top-level directory of your local Yocto Project
            Files Git repository is <filename>poky</filename>.
            And, the name of the local branch you have created and checked out is
            <filename>my-&DISTRO_NAME_NO_CAP;-&POKYVERSION;</filename>.
            The files in your repository now exactly match the Yocto Project &DISTRO;
            Release tag (<filename>&DISTRO_NAME_NO_CAP;-&POKYVERSION;</filename>).
            It is important to understand that when you create and checkout a local
            working branch based on a tag, your environment matches a specific point
            in time and not the entire development branch.
        </para>
    </section>

    <section id='basic-commands'>
        <title>Basic Commands</title>

        <para>
            Git has an extensive set of commands that lets you manage changes and perform
            collaboration over the life of a project.
            Conveniently though, you can manage with a small set of basic operations and workflows
            once you understand the basic philosophy behind Git.
            You do not have to be an expert in Git to be functional.
            A good place to look for instruction on a minimal set of Git commands is
            <ulink url='http://git-scm.com/documentation'>here</ulink>.
            If you need to download Git, you can do so
            <ulink url='http://git-scm.com/download'>here</ulink>, although
            any reasonably current Linux distribution should already have an
            installable package for Git.
        </para>

        <para>
            If you do not know much about Git, you should educate
            yourself by visiting the links previously mentioned.
        </para>

        <para>
            The following list briefly describes some basic Git operations as a way to get started.
            As with any set of commands, this list (in most cases) simply shows the base command and
            omits the many arguments they support.
            See the Git documentation for complete descriptions and strategies on how to use these commands:
            <itemizedlist>
                <listitem><para><emphasis><filename>git init</filename>:</emphasis> Initializes an empty Git repository.
                    You cannot use Git commands unless you have a <filename>.git</filename> repository.</para></listitem>
                <listitem><para><emphasis><filename>git clone</filename>:</emphasis>
                    Creates a local clone of a Git repository.
                    During collaboration, this command allows you to create a
                    local Git repository that is on equal footing with a fellow
                    developer’s Git repository.
                    </para></listitem>
                <listitem><para><emphasis><filename>git add</filename>:</emphasis> Stages updated file contents
                    to the index that
                    Git uses to track changes.
                    You must stage all files that have changed before you can commit them.</para></listitem>
                <listitem><para><emphasis><filename>git commit</filename>:</emphasis> Creates a "commit" that documents
                    the changes you made.
                    Commits are used for historical purposes, for determining if a maintainer of a project
                    will allow the change, and for ultimately pushing the change from your local Git repository
                    into the project’s upstream (or master) repository.</para></listitem>
                <listitem><para><emphasis><filename>git status</filename>:</emphasis> Reports any modified files that
                    possibly need to be staged and committed.</para></listitem>
                <listitem><para><emphasis><filename>git checkout</filename> <replaceable>branch-name</replaceable>:</emphasis> Changes
                    your working branch.
                    This command is analogous to "cd".</para></listitem>
                <listitem><para><emphasis><filename>git checkout –b</filename> <replaceable>working-branch</replaceable>:</emphasis> Creates
                    a working branch on your local machine where you can isolate work.
                    It is a good idea to use local branches when adding specific features or changes.
                    This way if you do not like what you have done you can easily get rid of the work.</para></listitem>
                <listitem><para><emphasis><filename>git branch</filename>:</emphasis> Reports
                    existing local branches and
                    tells you the branch in which you are currently working.</para></listitem>
                <listitem><para><emphasis><filename>git branch -D</filename> <replaceable>branch-name</replaceable>:</emphasis>
                    Deletes an existing local branch.
                    You need to be in a local branch other than the one you are deleting
                    in order to delete <replaceable>branch-name</replaceable>.</para></listitem>
                <listitem><para><emphasis><filename>git pull</filename>:</emphasis> Retrieves information
                    from an upstream Git
                    repository and places it in your local Git repository.
                    You use this command to make sure you are synchronized with the repository
                    from which you are basing changes (.e.g. the master branch).</para></listitem>
                <listitem><para><emphasis><filename>git push</filename>:</emphasis>
                    Sends all your committed local changes to an upstream Git
                    repository (e.g. a contribution repository).
                    The maintainer of the project draws from these repositories
                    when adding changes to the project’s master repository or
                    other development branch.
                    </para></listitem>
                <listitem><para><emphasis><filename>git merge</filename>:</emphasis> Combines or adds changes from one
                    local branch of your repository with another branch.
                    When you create a local Git repository, the default branch is named "master".
                    A typical workflow is to create a temporary branch for isolated work, make and commit your
                    changes, switch to your local master branch, merge the changes from the temporary branch into the
                    local master branch, and then delete the temporary branch.</para></listitem>
                <listitem><para><emphasis><filename>git cherry-pick</filename>:</emphasis> Choose and apply specific
                    commits from one branch into another branch.
                    There are times when you might not be able to merge all the changes in one branch with
                    another but need to pick out certain ones.</para></listitem>
                <listitem><para><emphasis><filename>gitk</filename>:</emphasis> Provides a GUI view of the branches
                    and changes in your local Git repository.
                    This command is a good way to graphically see where things have diverged in your
                    local repository.</para></listitem>
                <listitem><para><emphasis><filename>git log</filename>:</emphasis> Reports a history of your changes to the
                    repository.</para></listitem>
                <listitem><para><emphasis><filename>git diff</filename>:</emphasis> Displays line-by-line differences
                    between your local working files and the same files in the upstream Git repository that your
                    branch currently tracks.</para></listitem>
            </itemizedlist>
        </para>
    </section>
</section>

<section id='submitting-a-defect-against-the-yocto-project'>
    <title>Submitting a Defect Against the Yocto Project</title>

    <para>
        Use the Yocto Project implementation of
        <ulink url='http://www.bugzilla.org/about/'>Bugzilla</ulink>
        to submit a defect (bug) against the Yocto Project.
        For additional information on this implementation of Bugzilla see the
        "<ulink url='&YOCTO_DOCS_REF_URL;#resources-bugtracker'>Yocto Project Bugzilla</ulink>"
        section in the Yocto Project Reference Manual.
        For more detail on any of the following steps, see the Yocto Project
        <ulink url='&YOCTO_WIKI_URL;/wiki/Bugzilla_Configuration_and_Bug_Tracking'>Bugzilla wiki page</ulink>.
    </para>

    <para>
        Use the following general steps to submit a bug"

        <orderedlist>
            <listitem><para>
                Open the Yocto Project implementation of
                <ulink url='&YOCTO_BUGZILLA_URL;'>Bugzilla</ulink>.
                </para></listitem>
            <listitem><para>
                Click "File a Bug" to enter a new bug.
                </para></listitem>
            <listitem><para>
                Choose the appropriate "Classification", "Product", and
                "Component" for which the bug was found.
                Bugs for the Yocto Project fall into one of several
                classifications, which in turn break down into several
                products and components.
                For example, for a bug against the
                <filename>meta-intel</filename> layer, you would choose
                "Build System, Metadata &amp; Runtime", "BSPs", and
                "bsps-meta-intel", respectively.
                </para></listitem>
            <listitem><para>
                Choose the "Version" of the Yocto Project for which you found
                the bug (e.g. &DISTRO;).
                </para></listitem>
            <listitem><para>
                Determine and select the "Severity" of the bug.
                The severity indicates how the bug impacted your work.
                </para></listitem>
            <listitem><para>
                Choose the "Hardware" that the bug impacts.
                </para></listitem>
            <listitem><para>
                Choose the "Architecture" that the bug impacts.
                </para></listitem>
            <listitem><para>
                Choose a "Documentation change" item for the bug.
                Fixing a bug might or might not affect the Yocto Project
                documentation.
                If you are unsure of the impact to the documentation, select
                "Don't Know".
                </para></listitem>
            <listitem><para>
                Provide a brief "Summary" of the bug.
                Try to limit your summary to just a line or two and be sure
                to capture the essence of the bug.
                </para></listitem>
            <listitem><para>
                Provide a detailed "Description" of the bug.
                You should provide as much detail as you can about the context,
                behavior, output, and so forth that surrounds the bug.
                You can even attach supporting files for output from logs by
                using the "Add an attachment" button.
                </para></listitem>
            <listitem><para>
                Click the "Submit Bug" button submit the bug.
                A new Bugzilla number is assigned to the bug and the defect
                is logged in the bug tracking system.
                </para></listitem>
        </orderedlist>
        Once you file a bug, the bug is processed by the Yocto Project Bug
        Triage Team and further details concerning the bug are assigned
        (e.g. priority and owner).
        You are the "Submitter" of the bug and any further categorization,
        progress, or comments on the bug result in Bugzilla sending you an
        automated email concerning the particular change or progress to the
        bug.
    </para>
</section>

<section id='how-to-submit-a-change'>
    <title>How to Submit a Change</title>

    <para>
        Contributions to the Yocto Project and OpenEmbedded are very welcome.
        Because the system is extremely configurable and flexible, we recognize that developers
        will want to extend, configure or optimize it for their specific uses.
        You should send patches to the appropriate mailing list so that they
        can be reviewed and merged by the appropriate maintainer.
    </para>

    <section id='submit-change-overview'>
        <title>Overview</title>

        <para>
            The Yocto Project uses a mailing list and patch-based workflow
            that is similar to the Linux kernel but contains important
            differences.
            In general, a mailing list exists through which you can submit
            patches.
            The specific mailing list you need to use depends on the
            location of the code you are changing.
            Each component (e.g. layer) should have a
            <filename>README</filename> file that indicates where to send
            the changes and which process to follow.
        </para>

        <para>
            You can send the patch to the mailing list using whichever approach
            you feel comfortable with to generate the patch.
            Once sent, the patch is usually reviewed by the community at large.
            If somebody has concerns with the patch, they will usually voice
            their concern over the mailing list.
            If a patch does not receive any negative reviews, the maintainer of
            the affected layer typically takes the patch, tests it, and then
            based on successful testing, merges the patch.
        </para>

        <para>
            Specific to OpenEmbedded-Core, two commonly used testing trees
            exist:
            <itemizedlist>
                <listitem><para>
                    <emphasis>"ross/mut" branch:</emphasis>
                    The "mut" (master-under-test) tree
                    exists in the <filename>poky-contrib</filename> repository
                    in the
                    <ulink url='&YOCTO_GIT_URL;'>Yocto Project source repositories</ulink>.
                    </para></listitem>
                <listitem><para>
                    <emphasis>"master-next" branch:</emphasis>
                    This branch is part of the main
                    "poky" repository in the Yocto Project source repositories.
                    </para></listitem>
            </itemizedlist>
            Maintainers use these branches to test submissions prior to merging
            patches.
            Thus, you can get an idea of the status of a patch based on
            whether the patch has been merged into one of these branches.
        </para>

        <para>
            This system is imperfect and patches can sometimes get lost in the
            flow.
            Asking about the status of a patch is reasonable if the patch
            has been idle for a while with no feedback.
            The Yocto Project does have plans to use
            <ulink url='https://en.wikipedia.org/wiki/Patchwork_(software)'>Patchwork</ulink>
            to track the status of patches and also to automatically preview
            patches.
        </para>

        <para>
            The following sections provide general instructions for both
            pushing changes upstream and for submitting changes as patches.
        </para>
    </section>

    <section id='submit-change-submissions-to-poky'>
        <title>Submissions to Poky</title>

        <para>
            The "poky" repository, which is the Yocto Project's reference build
            environment, is a hybrid repository that contains several
            individual pieces (e.g. BitBake, OpenEmbedded-Core, meta-yocto,
            documentation, and so forth) built using the combo-layer tool.
            The upstream location used for submitting changes varies by
            component:
            <itemizedlist>
                <listitem><para>
                    <emphasis>Core Metadata:</emphasis>
                    Send your patch to the
                    <ulink url='http://lists.openembedded.org/mailman/listinfo/openembedded-core'>openembedded-core</ulink>
                    mailing list.  For example, a change to anything under
                    the <filename>meta</filename> or
                    <filename>scripts</filename> directories should be sent
                    to this mailing list.
                    </para></listitem>
                <listitem><para>
                    <emphasis>BitBake:</emphasis>
                    For changes to BitBake (i.e. anything under the
                    <filename>bitbake</filename> directory), send your patch
                    to the
                    <ulink url='http://lists.openembedded.org/mailman/listinfo/bitbake-devel'>bitbake-devel</ulink>
                    mailing list.
                    </para></listitem>
                <listitem><para>
                    <emphasis>"meta-yocto-bsp" and "meta-poky" trees:</emphasis>
                    These trees are
                    part of the "meta-yocto" repository in the Yocto Project
                    source repositories.
                    Use the
                    <ulink url='https://lists.yoctoproject.org/listinfo/poky'>poky</ulink>
                    mailing list.
                    </para></listitem>
            </itemizedlist>
        </para>
    </section>

    <section id='submit-change-submissions-to-other-layers'>
        <title>Submissions to Other Layers</title>

        <para>
            For changes to other layers hosted in the Yocto Project source
            repositories (i.e. <filename>yoctoproject.org</filename>), tools,
            and the Yocto Project documentation, use the
            <ulink url='https://lists.yoctoproject.org/listinfo/yocto'>Yocto Project</ulink>
            general mailing list.
            <note>
                Sometimes a layer's documentation specifies to use a
                particular mailing list.
                If so, use that list.
            </note>
            For additional recipes that do not fit into the core Metadata, you
            should determine which layer the recipe should go into and submit
            the change in the manner recommended by the documentation (e.g.
            the <filename>README</filename> file) supplied with the layer.
            If in doubt, please ask on the Yocto general mailing list or on
            the openembedded-devel mailing list.
        </para>
    </section>

    <section id='submit-change-patch-submission-details'>
        <title>Patch Submission Details</title>

        <para>
            When submitting any change, you can check who you should be
            notifying.
            Use either of these methods to find out:
            <itemizedlist>
                <listitem><para>
                    <emphasis>Maintenance File:</emphasis>
                    Examine the <filename>maintainers.inc</filename> file, which is
                    located in the
                    <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
                    at <filename>meta-poky/conf/distro/include</filename>, to
                    see who is responsible for code.
                    </para></listitem>
                <listitem><para>
                    <emphasis>Search by File:</emphasis>
                    Using <link linkend='git'>Git</link>, you can enter the
                    following command to bring up a short list of all commits
                    against a specific file:
                    <literallayout class='monospaced'>
     git shortlog -- <replaceable>filename</replaceable>
                    </literallayout>
                    Just provide the name of the file for which you are interested.
                    The information returned is not ordered by history but does
                    include a list of everyone who has committed grouped by
                    name.
                    From the list, you can see who is responsible for the bulk of
                    the changes against the file.
                    </para></listitem>
            </itemizedlist>
        </para>

        <para>
            For a list of the Yocto Project and related mailing lists, see the
            "<ulink url='&YOCTO_DOCS_REF_URL;#resources-mailinglist'>Mailing lists</ulink>"
            section in the Yocto Project Reference Manual.
        </para>

        <para>
            When you send a patch, be sure to include a "Signed-off-by:"
            line in the same style as required by the Linux kernel.
            Adding this line signifies that you, the submitter, have agreed
            to the Developer's Certificate of Origin 1.1 as follows:
            <literallayout class='monospaced'>
     Developer's Certificate of Origin 1.1

     By making a contribution to this project, I certify that:

     (a) The contribution was created in whole or in part by me and I
         have the right to submit it under the open source license
         indicated in the file; or

     (b) The contribution is based upon previous work that, to the best
         of my knowledge, is covered under an appropriate open source
         license and I have the right under that license to submit that
         work with modifications, whether created in whole or in part
         by me, under the same open source license (unless I am
         permitted to submit under a different license), as indicated
         in the file; or

     (c) The contribution was provided directly to me by some other
         person who certified (a), (b) or (c) and I have not modified
         it.

     (d) I understand and agree that this project and the contribution
         are public and that a record of the contribution (including all
         personal information I submit with it, including my sign-off) is
         maintained indefinitely and may be redistributed consistent with
         this project or the open source license(s) involved.
            </literallayout>
        </para>

        <para>
            In a collaborative environment, it is necessary to have some sort
            of standard or method through which you submit changes.
            Otherwise, things could get quite chaotic.
            One general practice to follow is to make small, controlled changes.
            Keeping changes small and isolated aids review, makes
            merging/rebasing easier and keeps the change history clean should
            anyone need to refer to it in future.
        </para>

        <para>
            When you make a commit, you must follow certain standards
            established by the OpenEmbedded and Yocto Project development teams.
            For each commit, you must provide a single-line summary of the
            change and you should almost always provide a more detailed
            description of what you did (i.e. the body of the commit message).
            The only exceptions for not providing a detailed description would
            be if your change is a simple, self-explanatory change that needs
            no further description beyond the summary.
            Here are the guidelines for composing a commit message:
            <itemizedlist>
                <listitem><para>
                    Provide a single-line, short summary of the change.
                    This summary is typically viewable in the "shortlist" of
                    changes.
                    Thus, providing something short and descriptive that
                    gives the reader a summary of the change is useful when
                    viewing a list of many commits.
                    You should prefix this short description with the recipe
                    name (if changing a recipe), or else with the short form
                    path to the file being changed.
                    </para></listitem>
                <listitem><para>
                    For the body of the commit message, provide detailed
                    information that describes what you changed, why you made
                    the change, and the approach you used.
                    It might also be helpful if you mention how you tested
                    the change.
                    Provide as much detail as you can in the body of the
                    commit message.
                    </para></listitem>
                <listitem><para>
                    If the change addresses a specific bug or issue that is
                    associated with a bug-tracking ID, include a reference
                    to that ID in your detailed description.
                    For example, the Yocto Project uses a specific convention
                    for bug references - any commit that addresses a specific
                    bug should use the following form for the detailed
                    description:
                    <literallayout class='monospaced'>
     Fixes [YOCTO #<replaceable>bug-id</replaceable>]

     <replaceable>detailed description of change</replaceable>
                    </literallayout>
                    </para></listitem>
                Where <replaceable>bug-id</replaceable> is replaced with the
                specific bug ID from the Yocto Project Bugzilla instance.
            </itemizedlist>
        </para>

        <para>
            You can find more guidance on creating well-formed commit messages
            at this OpenEmbedded wiki page:
            <ulink url='&OE_HOME_URL;/wiki/Commit_Patch_Message_Guidelines'></ulink>.
        </para>
    </section>

    <section id='pushing-a-change-upstream'>
        <title>Using Scripts to Push a Change Upstream and Request a Pull</title>

        <para>
            The basic flow for pushing a change to an upstream "contrib" Git repository is as follows:
            <itemizedlist>
                <listitem><para>Make your changes in your local Git repository.</para></listitem>
                <listitem><para>Stage your changes by using the <filename>git add</filename>
                    command on each file you changed.</para></listitem>
                <listitem><para>
                    Commit the change by using the
                    <filename>git commit</filename> command.
                    Be sure to provide a commit message that follows the
                    project’s commit message standards as described earlier.
                    </para></listitem>
                <listitem><para>
                    Push the change to the upstream "contrib" repository by
                    using the <filename>git push</filename> command.
                    </para></listitem>
                <listitem><para>Notify the maintainer that you have pushed a change by making a pull
                    request.
                    The Yocto Project provides two scripts that conveniently let you generate and send
                    pull requests to the Yocto Project.
                    These scripts are <filename>create-pull-request</filename> and
                    <filename>send-pull-request</filename>.
                    You can find these scripts in the <filename>scripts</filename> directory
                    within the <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>.</para>
                    <para>Using these scripts correctly formats the requests without introducing any
                    whitespace or HTML formatting.
                    The maintainer that receives your patches needs to be able to save and apply them
                    directly from your emails.
                    Using these scripts is the preferred method for sending patches.</para>
                    <para>For help on using these scripts, simply provide the
                    <filename>-h</filename> argument as follows:
                    <literallayout class='monospaced'>
     $ poky/scripts/create-pull-request -h
     $ poky/scripts/send-pull-request -h
                    </literallayout></para></listitem>
            </itemizedlist>
        </para>

        <para>
            You can find general Git information on how to push a change upstream in the
            <ulink url='http://git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows'>Git Community Book</ulink>.
        </para>
    </section>

    <section id='submitting-a-patch'>
        <title>Using Email to Submit a Patch</title>

        <para>
            You can submit patches without using the <filename>create-pull-request</filename> and
            <filename>send-pull-request</filename> scripts described in the previous section.
            However, keep in mind, the preferred method is to use the scripts.
        </para>

        <para>
            Depending on the components changed, you need to submit the email
            to a specific mailing list.
            For some guidance on which mailing list to use, see the list in the
            "<link linkend='how-to-submit-a-change'>How to Submit a Change</link>"
            section.
            For a description of the available mailing lists, see the
            "<ulink url='&YOCTO_DOCS_REF_URL;#resources-mailinglist'>Mailing Lists</ulink>"
            section in the Yocto Project Reference Manual.
        </para>

        <para>
            Here is the general procedure on how to submit a patch through email without using the
            scripts:
            <orderedlist>
                <listitem><para>
                    Make your changes in your local Git repository.
                    </para></listitem>
                <listitem><para>
                    Stage your changes by using the
                    <filename>git add</filename> command on each file you
                    changed.
                    </para></listitem>
                <listitem><para>
                    Commit the change by using the
                    <filename>git commit --signoff</filename> command.
                    Using the <filename>--signoff</filename> option identifies
                    you as the person making the change and also satisfies
                    the Developer's Certificate of Origin (DCO) shown earlier.
                    </para>
                    <para>When you form a commit, you must follow certain
                    standards established by the Yocto Project development
                    team.
                    See the earlier section
                    "<link linkend='how-to-submit-a-change'>How to Submit a Change</link>"
                    for Yocto Project commit message standards.
                    </para></listitem>
                <listitem><para>Format the commit into an email message.
                    To format commits, use the
                    <filename>git format-patch</filename> command.
                    When you provide the command, you must include a revision
                    list or a number of patches as part of the command.
                    For example, either of these two commands takes your most
                    recent single commit and formats it as an email message in
                    the current directory:
                    <literallayout class='monospaced'>
     $ git format-patch -1
                    </literallayout>
                    or
                    <literallayout class='monospaced'>
     $ git format-patch HEAD~
                    </literallayout></para>
                    <para>After the command is run, the current directory
                    contains a numbered <filename>.patch</filename> file for
                    the commit.</para>
                    <para>If you provide several commits as part of the
                    command, the <filename>git format-patch</filename> command
                    produces a series of numbered files in the current
                    directory – one for each commit.
                    If you have more than one patch, you should also use the
                    <filename>--cover</filename> option with the command,
                    which generates a cover letter as the first "patch" in
                    the series.
                    You can then edit the cover letter to provide a
                    description for the series of patches.
                    For information on the
                    <filename>git format-patch</filename> command,
                    see <filename>GIT_FORMAT_PATCH(1)</filename> displayed
                    using the <filename>man git-format-patch</filename>
                    command.
                    <note>
                        If you are or will be a frequent contributor to the
                        Yocto Project or to OpenEmbedded, you might consider
                        requesting a contrib area and the necessary associated
                        rights.
                    </note>
                    </para></listitem>
                <listitem><para>
                    Import the files into your mail client by using the
                    <filename>git send-email</filename> command.
                    <note>
                        In order to use <filename>git send-email</filename>,
                        you must have the proper Git packages installed on
                        your host.
                        For Ubuntu, Debian, and Fedora the package is
                        <filename>git-email</filename>.
                    </note></para>
                    <para>The <filename>git send-email</filename> command
                    sends email by using a local or remote Mail Transport Agent
                    (MTA) such as <filename>msmtp</filename>,
                    <filename>sendmail</filename>, or through a direct
                    <filename>smtp</filename> configuration in your Git
                    <filename>~/.gitconfig</filename> file.
                    If you are submitting patches through email only, it is
                    very important that you submit them without any whitespace
                    or HTML formatting that either you or your mailer
                    introduces.
                    The maintainer that receives your patches needs to be able
                    to save and apply them directly from your emails.
                    A good way to verify that what you are sending will be
                    applicable by the maintainer is to do a dry run and send
                    them to yourself and then save and apply them as the
                    maintainer would.</para>
                    <para>The <filename>git send-email</filename> command is
                    the preferred method for sending your patches since there
                    is no risk of compromising whitespace in the body of the
                    message, which can occur when you use your own mail client.
                    The command also has several options that let you
                    specify recipients and perform further editing of the
                    email message.
                    For information on how to use the
                    <filename>git send-email</filename> command,
                    see <filename>GIT-SEND-EMAIL(1)</filename> displayed using
                    the <filename>man git-send-email</filename> command.
                    </para></listitem>
            </orderedlist>
        </para>
    </section>
</section>
</chapter>
<!--
vim: expandtab tw=80 ts=4
-->