blob: a9aafd3c21031ef056899c9e1b12f75f579447ac [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001<!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='kernel-dev-common'>
6
7<title>Common Tasks</title>
8
9<para>
10 This chapter presents several common tasks you perform when you
11 work with the Yocto Project Linux kernel.
12 These tasks include preparing a layer, modifying an existing recipe,
13 iterative development, working with your own sources, and incorporating
14 out-of-tree modules.
15 <note>
16 The examples presented in this chapter work with the Yocto Project
17 1.2.2 Release and forward.
18 </note>
19</para>
20
21 <section id='creating-and-preparing-a-layer'>
22 <title>Creating and Preparing a Layer</title>
23
24 <para>
25 If you are going to be modifying kernel recipes, it is recommended
26 that you create and prepare your own layer in which to do your
27 work.
28 Your layer contains its own
29 <ulink url='&YOCTO_DOCS_DEV_URL;#bitbake-term'>BitBake</ulink>
30 append files
31 (<filename>.bbappend</filename>) and provides a convenient
32 mechanism to create your own recipe files
33 (<filename>.bb</filename>).
34 For details on how to create and work with layers, see the following
35 sections in the Yocto Project Development Manual:
36 <itemizedlist>
37 <listitem><para>"<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>" for
38 general information on layers and how to create layers.</para></listitem>
39 <listitem><para>"<ulink url='&YOCTO_DOCS_DEV_URL;#set-up-your-layer-for-the-build'>Set Up Your Layer for the Build</ulink>" for
40 specific instructions on setting up a layer for kernel
41 development.</para></listitem>
42 </itemizedlist>
43 </para>
44 </section>
45
46 <section id='modifying-an-existing-recipe'>
47 <title>Modifying an Existing Recipe</title>
48
49 <para>
50 In many cases, you can customize an existing linux-yocto recipe to
51 meet the needs of your project.
52 Each release of the Yocto Project provides a few Linux
53 kernel recipes from which you can choose.
54 These are located in the
55 <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
56 in <filename>meta/recipes-kernel/linux</filename>.
57 </para>
58
59 <para>
60 Modifying an existing recipe can consist of the following:
61 <itemizedlist>
62 <listitem><para>Creating the append file</para></listitem>
63 <listitem><para>Applying patches</para></listitem>
64 <listitem><para>Changing the configuration</para></listitem>
65 </itemizedlist>
66 </para>
67
68 <para>
69 Before modifying an existing recipe, be sure that you have created
70 a minimal, custom layer from which you can work.
71 See the "<link linkend='creating-and-preparing-a-layer'>Creating and Preparing a Layer</link>"
72 section for some general resources.
73 You can also see the
74 "<ulink url='&YOCTO_DOCS_DEV_URL;#set-up-your-layer-for-the-build'>Set Up Your Layer for the Build</ulink>" section
75 of the Yocto Project Development Manual for a detailed
76 example.
77 </para>
78
79 <section id='creating-the-append-file'>
80 <title>Creating the Append File</title>
81
82 <para>
83 You create this file in your custom layer.
84 You also name it accordingly based on the linux-yocto recipe
85 you are using.
86 For example, if you are modifying the
87 <filename>meta/recipes-kernel/linux/linux-yocto_3.19.bb</filename>
88 recipe, the append file will typically be located as follows
89 within your custom layer:
90 <literallayout class='monospaced'>
91 <replaceable>your-layer</replaceable>/recipes-kernel/linux/linux-yocto_3.19.bbappend
92 </literallayout>
93 The append file should initially extend the
94 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink>
95 search path by prepending the directory that contains your
96 files to the
97 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink>
98 variable as follows:
99 <literallayout class='monospaced'>
100 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
101 </literallayout>
102 The path <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-THISDIR'><filename>THISDIR</filename></ulink><filename>}/${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink><filename>}</filename>
103 expands to "linux-yocto" in the current directory for this
104 example.
105 If you add any new files that modify the kernel recipe and you
106 have extended <filename>FILESPATH</filename> as
107 described above, you must place the files in your layer in the
108 following area:
109 <literallayout class='monospaced'>
110 <replaceable>your-layer</replaceable>/recipes-kernel/linux/linux-yocto/
111 </literallayout>
112 <note>If you are working on a new machine Board Support Package
113 (BSP), be sure to refer to the
114 <ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Package (BSP) Developer's Guide</ulink>.
115 </note>
116 </para>
117 </section>
118
119 <section id='applying-patches'>
120 <title>Applying Patches</title>
121
122 <para>
123 If you have a single patch or a small series of patches
124 that you want to apply to the Linux kernel source, you
125 can do so just as you would with any other recipe.
126 You first copy the patches to the path added to
127 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink>
128 in your <filename>.bbappend</filename> file as described in
129 the previous section, and then reference them in
130 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
131 statements.
132 </para>
133
134 <para>
135 For example, you can apply a three-patch series by adding the
136 following lines to your linux-yocto
137 <filename>.bbappend</filename> file in your layer:
138 <literallayout class='monospaced'>
139 SRC_URI += "file://0001-first-change.patch"
140 SRC_URI += "file://0002-second-change.patch"
141 SRC_URI += "file://0003-third-change.patch"
142 </literallayout>
143 The next time you run BitBake to build the Linux kernel,
144 BitBake detects the change in the recipe and fetches and
145 applies the patches before building the kernel.
146 </para>
147
148 <para>
149 For a detailed example showing how to patch the kernel, see the
150 "<ulink url='&YOCTO_DOCS_DEV_URL;#patching-the-kernel'>Patching the Kernel</ulink>"
151 section in the Yocto Project Development Manual.
152 </para>
153 </section>
154
155 <section id='changing-the-configuration'>
156 <title>Changing the Configuration</title>
157
158 <para>
159 You can make wholesale or incremental changes to the final
160 <filename>.config</filename> file used for the eventual
161 Linux kernel configuration by including a
162 <filename>defconfig</filename> file and by specifying
163 configuration fragments in the
164 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
165 to be applied to that file.
166 </para>
167
168 <para>
169 If you have a complete, working Linux kernel
170 <filename>.config</filename>
171 file you want to use for the configuration, as before, copy
172 that file to the appropriate <filename>${PN}</filename>
173 directory in your layer's
174 <filename>recipes-kernel/linux</filename> directory,
175 and rename the copied file to "defconfig".
176 Then, add the following lines to the linux-yocto
177 <filename>.bbappend</filename> file in your layer:
178 <literallayout class='monospaced'>
179 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
180 SRC_URI += "file://defconfig"
181 </literallayout>
182 The <filename>SRC_URI</filename> tells the build system how to
183 search for the file, while the
184 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink>
185 extends the
186 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink>
187 variable (search directories) to include the
188 <filename>${PN}</filename> directory you created to hold the
189 configuration changes.
190 </para>
191
192 <note>
193 The build system applies the configurations from the
194 <filename>defconfig</filename> file before applying any
195 subsequent configuration fragments.
196 The final kernel configuration is a combination of the
197 configurations in the <filename>defconfig</filename> file and
198 any configuration fragments you provide.
199 You need to realize that if you have any configuration
200 fragments, the build system applies these on top of and
201 after applying the existing <filename>defconfig</filename>
202 file configurations.
203 </note>
204
205 <para>
206 Generally speaking, the preferred approach is to determine the
207 incremental change you want to make and add that as a
208 configuration fragment.
209 For example, if you want to add support for a basic serial
210 console, create a file named <filename>8250.cfg</filename> in
211 the <filename>${PN}</filename> directory with the following
212 content (without indentation):
213 <literallayout class='monospaced'>
214 CONFIG_SERIAL_8250=y
215 CONFIG_SERIAL_8250_CONSOLE=y
216 CONFIG_SERIAL_8250_PCI=y
217 CONFIG_SERIAL_8250_NR_UARTS=4
218 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
219 CONFIG_SERIAL_CORE=y
220 CONFIG_SERIAL_CORE_CONSOLE=y
221 </literallayout>
222 Next, include this configuration fragment and extend the
223 <filename>FILESPATH</filename> variable in your
224 <filename>.bbappend</filename> file:
225 <literallayout class='monospaced'>
226 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
227 SRC_URI += "file://8250.cfg"
228 </literallayout>
229 The next time you run BitBake to build the Linux kernel, BitBake
230 detects the change in the recipe and fetches and applies the
231 new configuration before building the kernel.
232 </para>
233
234 <para>
235 For a detailed example showing how to configure the kernel,
236 see the
237 "<ulink url='&YOCTO_DOCS_DEV_URL;#configuring-the-kernel'>Configuring the Kernel</ulink>"
238 section in the Yocto Project Development Manual.
239 </para>
240 </section>
241
242 <section id='using-an-in-tree-defconfig-file'>
243 <title>Using an "In-Tree"&nbsp;&nbsp;<filename>defconfig</filename> File</title>
244
245 <para>
246 It might be desirable to have kernel configuration fragment
247 support through a <filename>defconfig</filename> file that
248 is pulled from the kernel source tree for the configured
249 machine.
250 By default, the OpenEmbedded build system looks for
251 <filename>defconfig</filename> files in the layer used for
252 Metadata, which is "out-of-tree", and then configures them
253 using the following:
254 <literallayout class='monospaced'>
255 SRC_URI += "file://defconfig"
256 </literallayout>
257 If you do not want to maintain copies of
258 <filename>defconfig</filename> files in your layer but would
259 rather allow users to use the default configuration from the
260 kernel tree and still be able to add configuration fragments
261 to the
262 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
263 through, for example, append files, you can direct the
264 OpenEmbedded build system to use a
265 <filename>defconfig</filename> file that is "in-tree".
266 </para>
267
268 <para>
269 To specify an "in-tree" <filename>defconfig</filename> file,
270 edit the recipe that builds your kernel so that it has the
271 following command form:
272 <literallayout class='monospaced'>
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500273 KBUILD_DEFCONFIG_KMACHINE ?= <replaceable>defconfig_file</replaceable>
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500274 </literallayout>
275 You need to append the variable with
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500276 <ulink url='&YOCTO_DOCS_REF_URL;#var-KMACHINE'><filename>KMACHINE</filename></ulink>
277 and then supply the path to your "in-tree"
278 <filename>defconfig</filename> file.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500279 </para>
280
281 <para>
282 Aside from modifying your kernel recipe and providing your own
283 <filename>defconfig</filename> file, you need to be sure no
284 files or statements set <filename>SRC_URI</filename> to use a
285 <filename>defconfig</filename> other than your "in-tree"
286 file (e.g. a kernel's <filename>linux-</filename><replaceable>machine</replaceable><filename>.inc</filename>
287 file).
288 In other words, if the build system detects a statement
289 that identifies an "out-of-tree"
290 <filename>defconfig</filename> file, that statement
291 will override your
292 <filename>KBUILD_DEFCONFIG</filename> variable.
293 </para>
294
295 <para>
296 See the
297 <ulink url='&YOCTO_DOCS_REF_URL;#var-KBUILD_DEFCONFIG'><filename>KBUILD_DEFCONFIG</filename></ulink>
298 variable description for more information.
299 </para>
300 </section>
301 </section>
302
303 <section id='using-an-iterative-development-process'>
304 <title>Using an Iterative Development Process</title>
305
306 <para>
307 If you do not have existing patches or configuration files,
308 you can iteratively generate them from within the BitBake build
309 environment as described within this section.
310 During an iterative workflow, running a previously completed BitBake
311 task causes BitBake to invalidate the tasks that follow the
312 completed task in the build sequence.
313 Invalidated tasks rebuild the next time you run the build using
314 BitBake.
315 </para>
316
317 <para>
318 As you read this section, be sure to substitute the name
319 of your Linux kernel recipe for the term
320 "linux-yocto".
321 </para>
322
323 <section id='tip-dirty-string'>
324 <title>"-dirty" String</title>
325
326<!--
327 <para>
328 <emphasis>AR - Darren Hart:</emphasis> This section
329 originated from the old Yocto Project Kernel Architecture
330 and Use Manual.
331 It was decided we need to put it in this section here.
332 Darren needs to figure out where we want it and what part
333 of it we want (all, revision???)
334 </para>
335-->
336
337 <para>
338 If kernel images are being built with "-dirty" on the
339 end of the version string, this simply means that
340 modifications in the source directory have not been committed.
341 <literallayout class='monospaced'>
342 $ git status
343 </literallayout>
344 </para>
345
346 <para>
347 You can use the above Git command to report modified,
348 removed, or added files.
349 You should commit those changes to the tree regardless of
350 whether they will be saved, exported, or used.
351 Once you commit the changes, you need to rebuild the kernel.
352 </para>
353
354 <para>
355 To force a pickup and commit of all such pending changes,
356 enter the following:
357 <literallayout class='monospaced'>
358 $ git add .
359 $ git commit -s -a -m "getting rid of -dirty"
360 </literallayout>
361 </para>
362
363 <para>
364 Next, rebuild the kernel.
365 </para>
366 </section>
367
368 <section id='generating-configuration-files'>
369 <title>Generating Configuration Files</title>
370
371 <para>
372 You can manipulate the <filename>.config</filename> file
373 used to build a linux-yocto recipe with the
374 <filename>menuconfig</filename> command as follows:
375 <literallayout class='monospaced'>
376 $ bitbake linux-yocto -c menuconfig
377 </literallayout>
378 This command starts the Linux kernel configuration tool,
379 which allows you to prepare a new
380 <filename>.config</filename> file for the build.
381 When you exit the tool, be sure to save your changes
382 at the prompt.
383 </para>
384
385 <para>
386 The resulting <filename>.config</filename> file is
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600387 located in the build directory,
388 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}</filename>,
389 which expands to
390 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename><filename>/linux-</filename><filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_ARCH'><filename>PACKAGE_ARCH</filename></ulink><filename>}-${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_KERNEL_TYPE'><filename>LINUX_KERNEL_TYPE</filename></ulink><filename>}-build</filename>.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500391 You can use the entire <filename>.config</filename> file as the
392 <filename>defconfig</filename> file as described in the
393 "<link linkend='changing-the-configuration'>Changing the Configuration</link>" section.
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500394 For more information on the <filename>.config</filename> file,
395 see the
396 "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>"
397 section in the Yocto Project Development Manual.
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600398 <note>
399 You can determine what a variable expands to by looking
400 at the output of the <filename>bitbake -e</filename>
401 command:
402 <literallayout class='monospaced'>
403 $ bitbake -e virtual/kernel
404 </literallayout>
405 Search the output for the variable in which you are
406 interested to see exactly how it is expanded and used.
407 </note>
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500408 </para>
409
410 <para>
411 A better method is to create a configuration fragment using the
412 differences between two configuration files: one previously
413 created and saved, and one freshly created using the
414 <filename>menuconfig</filename> tool.
415 </para>
416
417 <para>
418 To create a configuration fragment using this method, follow
419 these steps:
420 <orderedlist>
421 <listitem><para>Complete a build at least through the kernel
422 configuration task as follows:
423 <literallayout class='monospaced'>
424 $ bitbake linux-yocto -c kernel_configme -f
425 </literallayout>
426 This step ensures that you will be creating a
427 <filename>.config</filename> file from a known state.
428 Because situations exist where your build state might
429 become unknown, it is best to run the previous
430 command prior to starting up
431 <filename>menuconfig</filename>.
432 </para></listitem>
433 <listitem><para>Run the <filename>menuconfig</filename>
434 command:
435 <literallayout class='monospaced'>
436 $ bitbake linux-yocto -c menuconfig
437 </literallayout></para></listitem>
438 <listitem><para>Run the <filename>diffconfig</filename>
439 command to prepare a configuration fragment.
440 The resulting file <filename>fragment.cfg</filename>
441 will be placed in the
442 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename> directory:
443 <literallayout class='monospaced'>
444 $ bitbake linux-yocto -c diffconfig
445 </literallayout></para></listitem>
446 </orderedlist>
447 </para>
448
449 <para>
450 The <filename>diffconfig</filename> command creates a file that is a
451 list of Linux kernel <filename>CONFIG_</filename> assignments.
452 See the "<link linkend='changing-the-configuration'>Changing the Configuration</link>"
453 section for information on how to use the output as a
454 configuration fragment.
455 <note>
456 You can also use this method to create configuration
457 fragments for a BSP.
458 See the "<link linkend='bsp-descriptions'>BSP Descriptions</link>"
459 section for more information.
460 </note>
461 </para>
462
463 <para>
464 The kernel tools also provide configuration validation.
465 You can use these tools to produce warnings for when a
466 requested configuration does not appear in the final
467 <filename>.config</filename> file or when you override a
468 policy configuration in a hardware configuration fragment.
469 Here is an example with some sample output of the command
470 that runs these tools:
471 <literallayout class='monospaced'>
472 $ bitbake linux-yocto -c kernel_configcheck -f
473
474 ...
475
476 NOTE: validating kernel configuration
477 This BSP sets 3 invalid/obsolete kernel options.
478 These config options are not offered anywhere within this kernel.
479 The full list can be found in your kernel src dir at:
480 meta/cfg/standard/mybsp/invalid.cfg
481
482 This BSP sets 21 kernel options that are possibly non-hardware related.
483 The full list can be found in your kernel src dir at:
484 meta/cfg/standard/mybsp/specified_non_hdw.cfg
485
486 WARNING: There were 2 hardware options requested that do not
487 have a corresponding value present in the final ".config" file.
488 This probably means you are not getting the config you wanted.
489 The full list can be found in your kernel src dir at:
490 meta/cfg/standard/mybsp/mismatch.cfg
491 </literallayout>
492 </para>
493
494 <para>
495 The output describes the various problems that you can
496 encounter along with where to find the offending configuration
497 items.
498 You can use the information in the logs to adjust your
499 configuration files and then repeat the
500 <filename>kernel_configme</filename> and
501 <filename>kernel_configcheck</filename> commands until
502 they produce no warnings.
503 </para>
504
505 <para>
506 For more information on how to use the
507 <filename>menuconfig</filename> tool, see the
508 "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>"
509 section in the Yocto Project Development Manual.
510 </para>
511 </section>
512
513 <section id='modifying-source-code'>
514 <title>Modifying Source Code</title>
515
516 <para>
517 You can experiment with source code changes and create a
518 simple patch without leaving the BitBake environment.
519 To get started, be sure to complete a build at
520 least through the kernel configuration task:
521 <literallayout class='monospaced'>
522 $ bitbake linux-yocto -c kernel_configme -f
523 </literallayout>
524 Taking this step ensures you have the sources prepared
525 and the configuration completed.
Patrick Williamsc0f7c042017-02-23 20:41:17 -0600526 You can find the sources in the build directory within the
527 <filename>source/</filename> directory, which is a symlink
528 (i.e. <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}/source</filename>).
529 The <filename>source/</filename> directory expands to
530 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename><filename>/linux-</filename><filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_ARCH'><filename>PACKAGE_ARCH</filename></ulink><filename>}-${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_KERNEL_TYPE'><filename>LINUX_KERNEL_TYPE</filename></ulink><filename>}-build/source</filename>.
531 The directory pointed to by the
532 <filename>source/</filename> symlink is also known as
533 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-STAGING_KERNEL_DIR'><filename>STAGING_KERNEL_DIR</filename></ulink><filename>}</filename>.
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500534 </para>
535
536 <para>
537 You can edit the sources as you would any other Linux source
538 tree.
539 However, keep in mind that you will lose changes if you
540 trigger the
541 <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-fetch'><filename>do_fetch</filename></ulink>
542 task for the recipe.
543 You can avoid triggering this task by not using BitBake to
544 run the
545 <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleanall'><filename>cleanall</filename></ulink>,
546 <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleansstate'><filename>cleansstate</filename></ulink>,
547 or forced
548 <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-fetch'><filename>fetch</filename></ulink>
549 commands.
550 Also, do not modify the recipe itself while working
551 with temporary changes or BitBake might run the
552 <filename>fetch</filename> command depending on the
553 changes to the recipe.
554 </para>
555
556 <para>
557 To test your temporary changes, instruct BitBake to run the
558 <filename>compile</filename> again.
559 The <filename>-f</filename> option forces the command to run
560 even though BitBake might think it has already done so:
561 <literallayout class='monospaced'>
562 $ bitbake linux-yocto -c compile -f
563 </literallayout>
564 If the compile fails, you can update the sources and repeat
565 the <filename>compile</filename>.
566 Once compilation is successful, you can inspect and test
567 the resulting build (i.e. kernel, modules, and so forth) from
568 the following build directory:
569 <literallayout class='monospaced'>
570 ${WORKDIR}/linux-${PACKAGE_ARCH}-${LINUX_KERNEL_TYPE}-build
571 </literallayout>
572 Alternatively, you can run the <filename>deploy</filename>
573 command to place the kernel image in the
574 <filename>tmp/deploy/images</filename> directory:
575 <literallayout class='monospaced'>
576 $ bitbake linux-yocto -c deploy
577 </literallayout>
578 And, of course, you can perform the remaining installation and
579 packaging steps by issuing:
580 <literallayout class='monospaced'>
581 $ bitbake linux-yocto
582 </literallayout>
583 </para>
584
585 <para>
586 For rapid iterative development, the edit-compile-repeat loop
587 described in this section is preferable to rebuilding the
588 entire recipe because the installation and packaging tasks
589 are very time consuming.
590 </para>
591
592 <para>
593 Once you are satisfied with your source code modifications,
594 you can make them permanent by generating patches and
595 applying them to the
596 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
597 statement as described in the
598 "<link linkend='applying-patches'>Applying Patches</link>"
599 section.
600 If you are not familiar with generating patches, refer to the
601 "<ulink url='&YOCTO_DOCS_DEV_URL;#creating-the-patch'>Creating the Patch</ulink>"
602 section in the Yocto Project Development Manual.
603 </para>
604 </section>
605 </section>
606
607 <section id='working-with-your-own-sources'>
608 <title>Working With Your Own Sources</title>
609
610 <para>
611 If you cannot work with one of the Linux kernel
612 versions supported by existing linux-yocto recipes, you can
613 still make use of the Yocto Project Linux kernel tooling by
614 working with your own sources.
615 When you use your own sources, you will not be able to
616 leverage the existing kernel
617 <ulink url='&YOCTO_DOCS_DEV_URL;#metadata'>Metadata</ulink> and
618 stabilization work of the linux-yocto sources.
619 However, you will be able to manage your own Metadata in the same
620 format as the linux-yocto sources.
621 Maintaining format compatibility facilitates converging with
622 linux-yocto on a future, mutually-supported kernel version.
623 </para>
624
625 <para>
626 To help you use your own sources, the Yocto Project provides a
627 linux-yocto custom recipe
628 (<filename>linux-yocto-custom.bb</filename>) that uses
629 <filename>kernel.org</filename> sources
630 and the Yocto Project Linux kernel tools for managing
631 kernel Metadata.
632 You can find this recipe in the
633 <filename>poky</filename> Git repository of the
634 Yocto Project <ulink url='&YOCTO_GIT_URL;'>Source Repository</ulink>
635 at:
636 <literallayout class="monospaced">
637 poky/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
638 </literallayout>
639 </para>
640
641 <para>
642 Here are some basic steps you can use to work with your own sources:
643 <orderedlist>
644 <listitem><para>Copy the <filename>linux-yocto-custom.bb</filename>
645 recipe to your layer and give it a meaningful name.
646 The name should include the version of the Linux kernel you
647 are using (e.g.
648 <filename>linux-yocto-myproject_3.19.bb</filename>,
649 where "3.19" is the base version of the Linux kernel
650 with which you would be working).</para></listitem>
651 <listitem><para>In the same directory inside your layer,
652 create a matching directory
653 to store your patches and configuration files (e.g.
654 <filename>linux-yocto-myproject</filename>).
655 </para></listitem>
656 <listitem><para>Make sure you have either a
657 <filename>defconfig</filename> file or configuration
658 fragment files.
659 When you use the <filename>linux-yocto-custom.bb</filename>
660 recipe, you must specify a configuration.
661 If you do not have a <filename>defconfig</filename> file,
662 you can run the following:
663 <literallayout class='monospaced'>
664 $ make defconfig
665 </literallayout>
666 After running the command, copy the resulting
667 <filename>.config</filename> to the
668 <filename>files</filename> directory as "defconfig" and
669 then add it to the
670 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
671 variable in the recipe.</para>
672 <para>Running the <filename>make defconfig</filename>
673 command results in the default configuration for your
674 architecture as defined by your kernel.
675 However, no guarantee exists that this configuration is
676 valid for your use case, or that your board will even boot.
677 This is particularly true for non-x86 architectures.
678 To use non-x86 <filename>defconfig</filename> files, you
679 need to be more specific and find one that matches your
680 board (i.e. for arm, you look in
681 <filename>arch/arm/configs</filename> and use the one that
682 is the best starting point for your board).
683 </para></listitem>
684 <listitem><para>Edit the following variables in your recipe
685 as appropriate for your project:
686 <itemizedlist>
687 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>:
688 The <filename>SRC_URI</filename> should specify
689 a Git repository that uses one of the supported Git
690 fetcher protocols (i.e. <filename>file</filename>,
691 <filename>git</filename>, <filename>http</filename>,
692 and so forth).
693 The <filename>SRC_URI</filename> variable should
694 also specify either a <filename>defconfig</filename>
695 file or some configuration fragment files.
696 The skeleton recipe provides an example
697 <filename>SRC_URI</filename> as a syntax reference.
698 </para></listitem>
699 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_VERSION'><filename>LINUX_VERSION</filename></ulink>:
700 The Linux kernel version you are using (e.g.
701 "3.19").</para></listitem>
702 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_VERSION_EXTENSION'><filename>LINUX_VERSION_EXTENSION</filename></ulink>:
703 The Linux kernel <filename>CONFIG_LOCALVERSION</filename>
704 that is compiled into the resulting kernel and visible
705 through the <filename>uname</filename> command.
706 </para></listitem>
707 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-SRCREV'><filename>SRCREV</filename></ulink>:
708 The commit ID from which you want to build.
709 </para></listitem>
710 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink>:
711 Treat this variable the same as you would in any other
712 recipe.
713 Increment the variable to indicate to the OpenEmbedded
714 build system that the recipe has changed.
715 </para></listitem>
716 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>:
717 The default <filename>PV</filename> assignment is
718 typically adequate.
719 It combines the <filename>LINUX_VERSION</filename>
720 with the Source Control Manager (SCM) revision
721 as derived from the
722 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRCPV'><filename>SRCPV</filename></ulink>
723 variable.
724 The combined results are a string with
725 the following form:
726 <literallayout class='monospaced'>
727 3.19.11+git1+68a635bf8dfb64b02263c1ac80c948647cc76d5f_1+218bd8d2022b9852c60d32f0d770931e3cf343e2
728 </literallayout>
729 While lengthy, the extra verbosity in <filename>PV</filename>
730 helps ensure you are using the exact
731 sources from which you intend to build.
732 </para></listitem>
733 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink>:
734 A list of the machines supported by your new recipe.
735 This variable in the example recipe is set
736 by default to a regular expression that matches
737 only the empty string, "(^$)".
738 This default setting triggers an explicit build
739 failure.
740 You must change it to match a list of the machines
741 that your new recipe supports.
742 For example, to support the <filename>qemux86</filename>
743 and <filename>qemux86-64</filename> machines, use
744 the following form:
745 <literallayout class='monospaced'>
746 COMPATIBLE_MACHINE = "qemux86|qemux86-64"
747 </literallayout></para></listitem>
748 </itemizedlist></para></listitem>
749 <listitem><para>Provide further customizations to your recipe
750 as needed just as you would customize an existing
751 linux-yocto recipe.
752 See the "<link linkend='modifying-an-existing-recipe'>Modifying
753 an Existing Recipe</link>" section for information.
754 </para></listitem>
755 </orderedlist>
756 </para>
757 </section>
758
759 <section id='working-with-out-of-tree-modules'>
760 <title>Working with Out-of-Tree Modules</title>
761
762 <para>
763 This section describes steps to build out-of-tree modules on
764 your target and describes how to incorporate out-of-tree modules
765 in the build.
766 </para>
767
768 <section id='building-out-of-tree-modules-on-the-target'>
769 <title>Building Out-of-Tree Modules on the Target</title>
770
771 <para>
772 While the traditional Yocto Project development model would be
773 to include kernel modules as part of the normal build
774 process, you might find it useful to build modules on the
775 target.
776 This could be the case if your target system is capable
777 and powerful enough to handle the necessary compilation.
778 Before deciding to build on your target, however, you should
779 consider the benefits of using a proper cross-development
780 environment from your build host.
781 </para>
782
783 <para>
784 If you want to be able to build out-of-tree modules on
785 the target, there are some steps you need to take
786 on the target that is running your SDK image.
787 Briefly, the <filename>kernel-dev</filename> package
788 is installed by default on all
789 <filename>*.sdk</filename> images and the
790 <filename>kernel-devsrc</filename> package is installed
791 on many of the <filename>*.sdk</filename> images.
792 However, you need to create some scripts prior to
793 attempting to build the out-of-tree modules on the target
794 that is running that image.
795 </para>
796
797 <para>
798 Prior to attempting to build the out-of-tree modules,
799 you need to be on the target as root and you need to
800 change to the <filename>/usr/src/kernel</filename> directory.
801 Next, <filename>make</filename> the scripts:
802 <literallayout class='monospaced'>
803 # cd /usr/src/kernel
804 # make scripts
805 </literallayout>
806 Because all SDK image recipes include
807 <filename>dev-pkgs</filename>, the
808 <filename>kernel-dev</filename> packages will be installed
809 as part of the SDK image and the
810 <filename>kernel-devsrc</filename> packages will be installed
811 as part of applicable SDK images.
812 The SDK uses the scripts when building out-of-tree
813 modules.
814 Once you have switched to that directory and created the
815 scripts, you should be able to build your out-of-tree modules
816 on the target.
817 </para>
818 </section>
819
820 <section id='incorporating-out-of-tree-modules'>
821 <title>Incorporating Out-of-Tree Modules</title>
822
823 <para>
824 While it is always preferable to work with sources integrated
825 into the Linux kernel sources, if you need an external kernel
826 module, the <filename>hello-mod.bb</filename> recipe is
827 available as a template from which you can create your
828 own out-of-tree Linux kernel module recipe.
829 </para>
830
831 <para>
832 This template recipe is located in the
833 <filename>poky</filename> Git repository of the
834 Yocto Project <ulink url='&YOCTO_GIT_URL;'>Source Repository</ulink>
835 at:
836 <literallayout class="monospaced">
837 poky/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb
838 </literallayout>
839 </para>
840
841 <para>
842 To get started, copy this recipe to your layer and give it a
843 meaningful name (e.g. <filename>mymodule_1.0.bb</filename>).
844 In the same directory, create a new directory named
845 <filename>files</filename> where you can store any source files,
846 patches, or other files necessary for building
847 the module that do not come with the sources.
848 Finally, update the recipe as needed for the module.
849 Typically, you will need to set the following variables:
850 <itemizedlist>
851 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-DESCRIPTION'><filename>DESCRIPTION</filename></ulink>
852 </para></listitem>
853 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-LICENSE'><filename>LICENSE*</filename></ulink>
854 </para></listitem>
855 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
856 </para></listitem>
857 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>
858 </para></listitem>
859 </itemizedlist>
860 </para>
861
862 <para>
863 Depending on the build system used by the module sources,
864 you might need to make some adjustments.
865 For example, a typical module <filename>Makefile</filename>
866 looks much like the one provided with the
867 <filename>hello-mod</filename> template:
868 <literallayout class='monospaced'>
869 obj-m := hello.o
870
871 SRC := $(shell pwd)
872
873 all:
874 $(MAKE) -C $(KERNEL_SRC) M=$(SRC)
875
876 modules_install:
877 $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
878 ...
879 </literallayout>
880 </para>
881
882 <para>
883 The important point to note here is the
884 <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_SRC'><filename>KERNEL_SRC</filename></ulink>
885 variable.
886 The
887 <ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-module'><filename>module</filename></ulink>
888 class sets this variable and the
889 <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_PATH'><filename>KERNEL_PATH</filename></ulink>
890 variable to
891 <filename>${<ulink url='&YOCTO_DOCS_REF_URL;#var-STAGING_KERNEL_DIR'><filename>STAGING_KERNEL_DIR</filename></ulink>}</filename>
892 with the necessary Linux kernel build information to build
893 modules.
894 If your module <filename>Makefile</filename> uses a different
895 variable, you might want to override the
896 <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-compile'><filename>do_compile()</filename></ulink>
897 step, or create a patch to
898 the <filename>Makefile</filename> to work with the more typical
899 <filename>KERNEL_SRC</filename> or
900 <filename>KERNEL_PATH</filename> variables.
901 </para>
902
903 <para>
904 After you have prepared your recipe, you will likely want to
905 include the module in your images.
906 To do this, see the documentation for the following variables in
907 the Yocto Project Reference Manual and set one of them
908 appropriately for your machine configuration file:
909 <itemizedlist>
910 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RDEPENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RDEPENDS</filename></ulink>
911 </para></listitem>
912 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS</filename></ulink>
913 </para></listitem>
914 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_EXTRA_RDEPENDS'><filename>MACHINE_EXTRA_RDEPENDS</filename></ulink>
915 </para></listitem>
916 <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_EXTRA_RRECOMMENDS'><filename>MACHINE_EXTRA_RRECOMMENDS</filename></ulink>
917 </para></listitem>
918 </itemizedlist>
919 </para>
920
921 <para>
922 Modules are often not required for boot and can be excluded from
923 certain build configurations.
924 The following allows for the most flexibility:
925 <literallayout class='monospaced'>
926 MACHINE_EXTRA_RRECOMMENDS += "kernel-module-mymodule"
927 </literallayout>
928 The value is derived by appending the module filename without
929 the <filename>.ko</filename> extension to the string
930 "kernel-module-".
931 </para>
932
933 <para>
934 Because the variable is
935 <ulink url='&YOCTO_DOCS_REF_URL;#var-RRECOMMENDS'><filename>RRECOMMENDS</filename></ulink>
936 and not a
937 <ulink url='&YOCTO_DOCS_REF_URL;#var-RDEPENDS'><filename>RDEPENDS</filename></ulink>
938 variable, the build will not fail if this module is not
939 available to include in the image.
940 </para>
941 </section>
942 </section>
943
944
945 <section id='inspecting-changes-and-commits'>
946 <title>Inspecting Changes and Commits</title>
947
948 <para>
949 A common question when working with a kernel is:
950 "What changes have been applied to this tree?"
951 Rather than using "grep" across directories to see what has
952 changed, you can use Git to inspect or search the kernel tree.
953 Using Git is an efficient way to see what has changed in the tree.
954 </para>
955
956 <section id='what-changed-in-a-kernel'>
957 <title>What Changed in a Kernel?</title>
958
959 <para>
960 Following are a few examples that show how to use Git
961 commands to examine changes.
962 These examples are by no means the only way to see changes.
963 <note>
964 In the following examples, unless you provide a commit
965 range, <filename>kernel.org</filename> history is blended
966 with Yocto Project kernel changes.
967 You can form ranges by using branch names from the
968 kernel tree as the upper and lower commit markers with
969 the Git commands.
970 You can see the branch names through the web interface
971 to the Yocto Project source repositories at
972 <ulink url='http://git.yoctoproject.org/cgit.cgi'></ulink>.
973 </note>
974 To see a full range of the changes, use the
975 <filename>git whatchanged</filename> command and specify a
976 commit range for the branch
977 (<replaceable>commit</replaceable><filename>..</filename><replaceable>commit</replaceable>).
978 </para>
979
980 <para>
981 Here is an example that looks at what has changed in the
982 <filename>emenlow</filename> branch of the
983 <filename>linux-yocto-3.19</filename> kernel.
984 The lower commit range is the commit associated with the
985 <filename>standard/base</filename> branch, while
986 the upper commit range is the commit associated with the
987 <filename>standard/emenlow</filename> branch.
988 <literallayout class='monospaced'>
989 $ git whatchanged origin/standard/base..origin/standard/emenlow
990 </literallayout>
991 </para>
992
993 <para>
994 To see short, one line summaries of changes use the
995 <filename>git log</filename> command:
996 <literallayout class='monospaced'>
997 $ git log --oneline origin/standard/base..origin/standard/emenlow
998 </literallayout>
999 </para>
1000
1001 <para>
1002 Use this command to see code differences for the changes:
1003 <literallayout class='monospaced'>
1004 $ git diff origin/standard/base..origin/standard/emenlow
1005 </literallayout>
1006 </para>
1007
1008 <para>
1009 Use this command to see the commit log messages and the
1010 text differences:
1011 <literallayout class='monospaced'>
1012 $ git show origin/standard/base..origin/standard/emenlow
1013 </literallayout>
1014 </para>
1015
1016 <para>
1017 Use this command to create individual patches for
1018 each change.
1019 Here is an example that that creates patch files for each
1020 commit and places them in your <filename>Documents</filename>
1021 directory:
1022 <literallayout class='monospaced'>
1023 $ git format-patch -o $HOME/Documents origin/standard/base..origin/standard/emenlow
1024 </literallayout>
1025 </para>
1026 </section>
1027
1028 <section id='showing-a-particular-feature-or-branch-change'>
1029 <title>Showing a Particular Feature or Branch Change</title>
1030
1031 <para>
1032 Tags in the Yocto Project kernel tree divide changes for
1033 significant features or branches.
1034 The <filename>git show</filename>&nbsp;<replaceable>tag</replaceable>
1035 command shows changes based on a tag.
1036 Here is an example that shows <filename>systemtap</filename>
1037 changes:
1038 <literallayout class='monospaced'>
1039 $ git show systemtap
1040 </literallayout>
1041 You can use the
1042 <filename>git branch --contains</filename>&nbsp;<replaceable>tag</replaceable>
1043 command to show the branches that contain a particular feature.
1044 This command shows the branches that contain the
1045 <filename>systemtap</filename> feature:
1046 <literallayout class='monospaced'>
1047 $ git branch --contains systemtap
1048 </literallayout>
1049 </para>
1050 </section>
1051 </section>
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05001052
1053 <section id='adding-recipe-space-kernel-features'>
1054 <title>Adding Recipe-Space Kernel Features</title>
1055
1056 <para>
1057 You can add kernel features in the
1058 <link linkend='recipe-space-metadata'>recipe-space</link> by
1059 using the
1060 <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_FEATURES'><filename>KERNEL_FEATURES</filename></ulink>
1061 variable and by specifying the feature's <filename>.scc</filename>
1062 file path in the
1063 <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
1064 statement.
1065 When you add features using this method, the OpenEmbedded build
1066 system checks to be sure the features are present.
1067 If the features are not present, the build stops.
1068 Kernel features are the last elements processed for configuring
1069 and patching the kernel.
1070 Therefore, adding features in this manner is a way
1071 to enforce specific features are present and enabled
1072 without needing to do a full audit of any other layer's additions
1073 to the <filename>SRC_URI</filename> statement.
1074 </para>
1075
1076 <para>
1077 You add a kernel feature by providing the feature as part of the
1078 <filename>KERNEL_FEATURES</filename> variable and by providing the
1079 path to the feature's <filename>.scc</filename> file, which is
1080 relative to the root of the kernel Metadata.
1081 The OpenEmbedded build system searches all forms of kernel
1082 Metadata on the <filename>SRC_URI</filename> statement regardless
1083 of whether the Metadata is in the "kernel-cache", system kernel
1084 Metadata, or a recipe-space Metadata.
1085 See the
1086 "<link linkend='kernel-metadata-location'>Kernel Metadata Location</link>"
1087 section for additional information.
1088 </para>
1089
1090 <para>
1091 When you specify the feature's <filename>.scc</filename> file
1092 on the <filename>SRC_URI</filename> statement, the OpenEmbedded
1093 build system adds the directory of that
1094 <filename>.scc</filename> file along with all its subdirectories
1095 to the kernel feature search path.
1096 Because subdirectories are searched, you can reference a single
1097 <filename>.scc</filename> file in the
1098 <filename>SRC_URI</filename> statement to reference multiple kernel
1099 features.
1100 </para>
1101
1102 <para>
1103 Consider the following example that adds the "test.scc" feature
1104 to the build.
1105 <orderedlist>
1106 <listitem><para>
1107 Create a <filename>.scc</filename> file and locate it
1108 just as you would any other patch file,
1109 <filename>.cfg</filename> file, or fetcher item
1110 you specify in the <filename>SRC_URI</filename>
1111 statement.
1112 <note><title>Notes</title>
1113 <itemizedlist>
1114 <listitem><para>
1115 You must add the directory of the
1116 <filename>.scc</filename> file to the fetcher's
1117 search path in the same manner as you would
1118 add a <filename>.patch</filename> file.
1119 </para></listitem>
1120 <listitem><para>
1121 You can create additional
1122 <filename>.scc</filename> files beneath the
1123 directory that contains the file you are
1124 adding.
1125 All subdirectories are searched during the
1126 build as potential feature directories.
1127 </para></listitem>
1128 </itemizedlist>
1129 </note>
1130 Continuing with the example, suppose the "test.scc"
1131 feature you are adding has a
1132 <filename>test.scc</filename> file in the following
1133 directory:
1134 <literallayout class='monospaced'>
1135 <replaceable>my_recipe</replaceable>
1136 |
1137 +-linux-yocto
1138 |
1139 +-test.cfg
1140 +-test.scc
1141 </literallayout>
1142 In this example, the <filename>linux-yocto</filename>
1143 directory has both the feature
1144 <filename>test.scc</filename> file and a similarly
1145 named configuration fragment file
1146 <filename>test.cfg</filename>.
1147 </para></listitem>
1148 <listitem><para>
1149 Add the <filename>.scc</filename> file to the
1150 recipe's <filename>SRC_URI</filename> statement:
1151 <literallayout class='monospaced'>
1152 SRC_URI_append = " file://test.scc"
1153 </literallayout>
1154 The leading space before the path is important as the
1155 path is appended to the existing path.
1156 </para></listitem>
1157 <listitem><para>
1158 Specify the feature as a kernel feature:
1159 <literallayout class='monospaced'>
1160 KERNEL_FEATURES_append = " test.scc"
1161 </literallayout>
1162 The OpenEmbedded build system processes the kernel feature
1163 when it builds the kernel.
1164 <note>
1165 If other features are contained below "test.scc",
1166 then their directories are relative to the directory
1167 containing the <filename>test.scc</filename> file.
1168 </note>
1169 </para></listitem>
1170 </orderedlist>
1171 </para>
1172 </section>
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001173</chapter>
1174<!--
1175vim: expandtab tw=80 ts=4
1176-->