three party cross now called a Canadian cross
[deliverable/binutils-gdb.git] / cfg-paper.texi
1 \input texinfo @c -*-para-*-
2 @c %**start of header
3 @setfilename cfg-paper.info
4 @settitle On Configuring Development Tools
5 @c %**end of header
6 @setchapternewpage off
7
8 @titlepage
9 @sp 10
10 @title{On Configuring Development Tools}
11 @author{K. Richard Pixley}
12 @author{Cygnus Support}
13 @vskip 0pt plus 1filll
14 Copyright @copyright{} 1991 Cygnus Support
15 @end titlepage
16
17 @ifinfo
18 This document attempts to describe the general concepts behind
19 configuration of the Cygnus Support release of the @sc{gnu} Development
20 Tools. It also discusses common usage..
21
22 Copyright @copyright{} 1991 Cygnus Support
23 @end ifinfo
24
25 @ifinfo
26 @format
27 START-INFO-DIR-ENTRY
28 * configuration: (cfg-paper.info). Some theory on configuring source.
29 END-INFO-DIR-ENTRY
30 @end format
31 @end ifinfo
32
33 @node top, Some Basic Terms, (dir), (dir)
34
35 @ifinfo
36 This document attempts to describe the general concepts behind
37 configuration of the Cygnus Support release of the @sc{gnu} Development
38 Tools. It also discusses common usage.
39 @end ifinfo
40
41 @menu
42 * Some Basic Terms:: Some Basic Terms
43 * Specifics.:: Specifics
44 * Building Development Environments:: Building Development Environments
45 * A Walk Through:: A Walk Through
46 * Final Notes:: Final Notes
47 * Index:: Index
48
49 --- The Detailed Node Listing ---
50
51 Some Basic Terms
52
53 * Host Environments:: Host Environments
54 * Configuration Time Options:: Configuration Time Options
55
56 A Walk Through
57
58 * Native Development Environments:: Native Development Environments
59 * Emulation Environments:: Emulation Environments
60 * Simple Cross Environments:: Simple Cross Environments
61 * Crossing Into Targets:: Crossing Into Targets
62 * Canadian Cross:: Canadian Cross
63
64 Final Notes
65
66 * Hacking Configurations:: Hacking Configurations
67 @end menu
68
69 @node Some Basic Terms, Specifics., top, top
70 @chapter Some Basic Terms
71
72 There are a lot of terms that are frequently used when discussing
73 development tools. Most of the common terms have been used for many
74 different concepts such that their meanings have become ambiguous to the
75 point of being confusing. Typically, we only guess at their meanings
76 from context and we frequently guess wrong.
77
78 This document uses very few terms by comparison. The intent is to make
79 the concepts as clear as possible in order to convey the usage and
80 intent of these tools.
81
82 @emph{Programs} run on @emph{machines}. Programs are very nearly always
83 written in @emph{source}. Programs are @emph{built} from source.
84 @emph{Compilation} is a process that is frequently, but not always, used
85 when building programs.
86 @cindex Programs
87 @cindex Machines
88 @cindex Source
89 @cindex Building
90 @cindex Compilation
91
92 @menu
93 * Host Environments:: Host Environments
94 * Configuration Time Options:: Configuration Time Options
95 @end menu
96
97 @node Host Environments, Configuration Time Options, Some Basic Terms, Some Basic Terms
98 @section Host Environments
99
100 @cindex host
101 In this document, the word @emph{host} refers to the environment in
102 which the source in question will be compiled. @emph{host} and
103 @emph{host name} have nothing to do with the proper name of your host,
104 like @emph{ucbvax}, @emph{prep.ai.mit.edu} or @emph{att.com}. Instead
105 they refer to things like @emph{sun4} and @emph{dec3100}.
106
107 Forget for a moment that this particular directory of source is the
108 source for a development environment. Instead, pretend that it is the
109 source for a simpler, more mundane, application, say, a desk calculator.
110
111 Source that can be compiled in more than one environment, generally
112 needs to be set up for each environment explicitly. Here we refer to
113 that process as configuration. That is, we configure the source for a
114 host.
115
116 For example, if we wanted to configure our mythical desk calculator to
117 compile on a SparcStation, we might configure for host sun4. With our
118 configuration system:
119
120 @example
121 cd desk-calculator ; ./configure sun4
122 @end example
123
124 @noindent
125 does the trick. @code{configure} is a shell script that sets up Makefiles,
126 subdirectories, and symbolic links appropriate for compiling the source
127 on a sun4.
128
129 The @emph{host} environment does not necessarily refer to the machine on
130 which the tools are built. It is possible to provide a sun3 development
131 environment on a sun4. If we wanted to use a cross compiler on the sun4
132 to build a program intended to be run on a sun3, we would configure the
133 source for sun3.
134
135 @example
136 cd desk-calculator ; ./configure sun3
137 @end example
138
139 @noindent
140 The fact that we are actually building the program on a sun4 makes no
141 difference if the sun3 cross compiler presents an environment that looks
142 like a sun3 from the point of view of the desk calculator source code.
143 Specifically, the environment is a sun3 environment if the header files,
144 predefined symbols, and libraries appear as they do on a sun3.
145
146 Nor does the host environment refer to the the machine on which the
147 program to be built will run. It is possible to provide a sun3
148 emulation environment on a sun4 such that programs built in a sun3
149 development environment actually run on the sun4. This technique is
150 often used within individual programs to remedy deficiencies in the host
151 operating system. For example, some operating systems do not provide
152 the @code{bcopy()} function and so it is emulated using the
153 @code{memset()} funtion.
154
155 Host environment simply refers to the environment in which the program
156 will be built from the source.
157
158
159 @node Configuration Time Options, , Host Environments, Some Basic Terms
160 @section Configuration Time Options
161
162 Many programs have compile time options. That is, features of the
163 program that are either compiled into the program or not based on a
164 choice made by the person who builds the program. We refer to these as
165 @emph{configuration options}. For example, our desk calculator might be
166 capable of being compiled into a program that either uses infix notation
167 or postfix as a configuration option. For a sun3, to choose infix you
168 might use:
169
170 @example
171 ./configure sun3 -notation=infix
172 @end example
173
174 @noindent
175 while for a sun4 with postfix you might use:
176
177 @example
178 ./configure sun4 -notation=postfix
179 @end example
180
181 If we wanted to build both at the same time, in the same directory
182 structure, the intermediate pieces used in the build process must be
183 kept separate.
184
185 @example
186 ./configure sun4 -subdirs -notation=postfix
187 ./configure sun3 -subdirs -notation=infix
188 @end example
189
190 @noindent
191 will create subdirectories for the intermediate pieces of the sun4 and
192 sun3 configurations. This is necessary as previous systems were only
193 capable of one configuration at a time. Otherwise, a second
194 configuration would write over the first. We've chosen to retain this
195 behaviour so the @code{-subdirs} configuration option is necessary to
196 get the new behaviour. The order of the arguments doesn't matter.
197 There should be exactly one argument without a leading '@minus{}' sign
198 and that argument will be assumed to be the host name.
199
200 From here on the examples will assume that you want to build the tools
201 @emph{in place} and won't show the @code{-subdirs} option, but remember
202 that it is available.
203
204 In order to actually install the program, the configuration system needs
205 to know where you would like the program installed. The default
206 location is @file{/usr/local}. We refer to this location as
207 @code{$(prefix)}. All user visible programs will be installed in
208 @file{@code{$(prefix)}/bin}. All other programs and files will be
209 installed in a subdirectory of @file{@code{$(prefix)}/lib}.
210
211 NOTE: @code{$(prefix)} was previously known as @code{$(destdir)}.
212
213 You can elect to change @code{$(prefix)} only as a configuration time
214 option.
215
216 @example
217 ./configure sun4 -notation=postfix -prefix=/local
218 @end example
219
220 @noindent
221 Will configure the source such that:
222
223 @example
224 make install
225 @end example
226
227 @noindent
228 will put it's programs in @file{/local/bin} and @file{/local/lib/gcc}.
229 If you change @code{$(prefix)} after building the source, you will need
230 to:
231
232 @example
233 make clean
234 @end example
235
236 @noindent
237 before the change will be propogated properly. This is because some
238 tools need to know the locations of other tools.
239
240 With these concepts in mind, we can drop the desk calculator example and
241 move on to the application that resides in these directories, namely,
242 the source to a development environment.
243
244 @node Specifics., Building Development Environments, Some Basic Terms, top
245 @chapter Specifics
246
247 The @sc{gnu} Development Tools can be built on a wide variety of hosts. So,
248 of course, they must be configured. Like the last example,
249
250 @example
251 ./configure sun4 -prefix=/local
252 ./configure sun3 -prefix=/local
253 @end example
254
255 @noindent
256 will configure the source to be built in subdirectories, in order to
257 keep the intermediate pieces separate, and to be installed in
258 @file{/local}.
259
260 When built with suitable development environments, these will be native
261 tools. We'll explain the term @emph{native} later.
262
263 @node Building Development Environments, A Walk Through, Specifics., top
264 @chapter Building Development Environments
265
266 @cindex Target
267
268 The Cygnus Support @sc{gnu} development tools can not only be built in a
269 number of host development environments, they can also be configured to
270 create a number of different development environments on each of those
271 hosts. We refer to a specific development environment created as a
272 @emph{target}. That is, the word @emph{target} refers to the development
273 environment produced by compiling this source and installing the
274 resulting programs.
275
276 For the Cygnus Support @sc{gnu} development tools, the default target is the
277 same as the host. That is, the development environment produced is
278 intended to be compatible with the environment used to build the tools.
279
280 In the example above, we created two configurations, one for sun4 and
281 one for sun3. The first configuration is expecting to be built in a
282 sun4 development environment, to create a sun4 development environment.
283 It doesn't necessarily need to be built on a sun4 if a sun4 development
284 environment is available elsewhere. Likewise, if the available sun4
285 development environment produces executables intended for something
286 other than sun4, then the development environment built from this sun4
287 configuration will run on something other than a sun4. From the point
288 of view of the configuration system and the @sc{gnu} development tools
289 source, this doesn't matter. What matters is that they will be built in
290 a sun4 environment.
291
292 Similarly, the second configuration given above is expecting to be built
293 in a sun3 development environment, to create a sun3 development
294 environment.
295
296 The development environment produced, is a configuration time option,
297 just like @code{$(prefix)}.
298
299 @example
300 ./configure sun4 -prefix=/local -target=sun3
301 ./configure sun3 -prefix=/local -target=sun4
302 @end example
303
304 In this example, like before, we create two configurations. The first
305 is intended to be built in a sun4 environment, in subdirectories, to be
306 installed in @file{/local}. The second is intended to be built in a
307 sun3 environment, in subdirectories, to be installed in @file{/local}.
308
309 Unlike the previous example, the first configuration will produce a sun3
310 development environment, perhaps even suitable for building the second
311 configuration. Likewise, the second configuration will produce a sun4
312 development environment, perhaps even suitable for building the first
313 configuration.
314
315 The development environment used to build these configurations will
316 determine the machines on which the resulting development environments
317 can be used.
318
319
320 @node A Walk Through, Final Notes, Building Development Environments, top
321 @chapter A Walk Through
322
323
324 @menu
325 * Native Development Environments:: Native Development Environments
326 * Emulation Environments:: Emulation Environments
327 * Simple Cross Environments:: Simple Cross Environments
328 * Crossing Into Targets:: Crossing Into Targets
329 * Canadian Cross:: Canadian Cross
330 @end menu
331
332 @node Native Development Environments, Emulation Environments, A Walk Through, A Walk Through
333 @section Native Development Environments
334
335 Let us assume for a moment that you have a sun4 and that with your sun4
336 you received a development environment. This development environment is
337 intended to be run on your sun4 to build programs that can be run on
338 your sun4. You could, for instance, run this development environment on
339 your sun4 to build our example desk calculator program. You could then
340 run the desk calculator program on your sun4.
341
342 @cindex Native
343 @cindex Foreign
344 The resulting desk calculator program is referred to as a @emph{native}
345 program. The development environment itself is composed of native
346 programs that, when run, build other native programs. Any other program
347 is referred to as @emph{foreign}. Programs intended for other machines are
348 foreign programs.
349
350 This type of development environment, which is by far the most common,
351 is refered to as @emph{native}. That is, a native development environment
352 runs on some machine to build programs for that same machine. The
353 process of using a native development environment to build native
354 programs is called a @emph{native} build.
355
356 @example
357 ./configure sun4
358 @end example
359
360 @noindent
361 will configure this source such that when built in a sun4 development
362 environment, with a development environment that builds programs
363 intended to be run on sun4 machines, the programs built will be native
364 programs and the resulting development environment will be a native
365 development environment.
366
367 The development system that came with your sun4 is one such environment.
368 Using it to build the @sc{gnu} Development Tools is a very common activity
369 and the resulting development environment is quite popular.
370
371 @example
372 make all
373 @end example
374
375 @noindent
376 will build the tools as configured and will assume that you want to use
377 the native development environment that came with your machine.
378
379 @cindex Bootstrapping
380 @cindex Stage1
381 Using a development environment to build a development environment is
382 called @emph{bootstrapping}. The Cygnus Support release of the @sc{gnu}
383 Development Tools is capable of bootstrapping itself. This is a very
384 powerful feature that we'll return to later. For now, let's pretend
385 that you used the native development environment that came with your
386 sun4 to bootstrap the Cygnus Support release and let's call the new
387 development environment @emph{stage1}.
388
389 Why bother? Well, most people find that the Cygnus Support release
390 builds programs that run faster and take up less space than the native
391 development environments that came with their machines. Some people
392 didn't get development environments with their machines and some people
393 just like using the @sc{gnu} tools better than using other tools.
394
395 @cindex Stage2
396 While you're at it, if the @sc{gnu} tools produce better programs, maybe you
397 should use them to build the @sc{gnu} tools. It's a good idea, so let's
398 pretend that you do. Let's call the new development environment
399 @emph{stage2}.
400
401 @cindex Stage3
402 So far you've built a development environment, stage1, and you've used
403 stage1 to build a new, faster and smaller development environment,
404 stage2, but you haven't run any of the programs that the @sc{gnu} tools have
405 built. You really don't yet know if these tools work. Do you have any
406 programs built with the @sc{gnu} tools? Yes, you do. stage2. What does
407 that program do? It builds programs. Ok, do you have any source handy
408 to build into a program? Yes, you do. The @sc{gnu} tools themselves. In
409 fact, if you use stage2 to build the @sc{gnu} tools again the resulting
410 programs should be identical to stage2. Let's pretend that you do and
411 call the new development environment @emph{stage3}.
412
413 @cindex Three stage boot
414 You've just completed what's called a @emph{three stage boot}. You now have
415 a small, fast, somewhat tested, development environment.
416
417 @example
418 make bootstrap
419 @end example
420
421 @noindent
422 will do a three stage boot across all tools and will compare stage2 to
423 stage3 and complain if they are not identical.
424
425 Once built,
426
427 @example
428 make install
429 @end example
430
431 @noindent
432 will install the development environment in the default location or in
433 @code{$(prefix)} if you specified an alternate when you configured.
434
435 @cindex Cross
436 Any development environment that is not a native development environment
437 is refered to as a @emph{cross} development environment. There are many
438 different types of cross development environments but most fall into one
439 of three basic categories.
440
441
442 @node Emulation Environments, Simple Cross Environments, Native Development Environments, A Walk Through
443 @section Emulation Environments
444
445 @cindex Emulation
446 The first category of cross development environment is called
447 @emph{emulation}. There are two primary types of emulation, but both
448 types result in programs that run on the native host.
449
450 @cindex Software emulation
451 @cindex Software emulator
452 The first type is @emph{software emulation}. This form of cross
453 development environment involves a native program that when run on the
454 native host, is capable of interpreting, and in most aspects running, a
455 program intended for some other machine. This technique is typically
456 used when the other machine is either too expensive, too slow, too fast,
457 or not available, perhaps because it hasn't yet been built. The native,
458 interpreting program is called a @emph{software emulator}.
459
460 The @sc{gnu} Development Tools do not currently include any software
461 emulators. Some do exist and the @sc{gnu} Development Tools can be
462 configured to create simple cross development environments for with
463 these emulators. More on this later.
464
465 The second type of emulation is when source intended for some other
466 development environment is built into a program intended for the native
467 host. The concepts of operating system universes and hosted operating
468 systems are two such development environments.
469
470 The Cygnus Support Release of the @sc{gnu} Development Tools can be
471 configured for one such emulation at this time.
472
473 @example
474 ./configure sun4 -ansi
475 @end example
476
477 @cindex ANSI
478 @cindex X3J11
479 @noindent
480 will configure the source such that when built in a sun4 development
481 environment the resulting development environment is capable of building
482 sun4 programs from strictly conforming @sc{ANSI X3J11 C} source.
483 Remember that the environment used to build the tools determines the
484 machine on which this tools will run, so the resulting programs aren't
485 necessarily intended to run on a sun4, although they usually are. Also
486 note that the source for the @sc{gnu} tools is not strictly conforming
487 @sc{ansi} source so this configuration cannot be used to bootstrap the
488 @sc{gnu} tools.
489
490
491 @node Simple Cross Environments, Crossing Into Targets, Emulation Environments, A Walk Through
492 @section Simple Cross Environments
493
494 @example
495 ./configure sun4 -target=a29k
496 @end example
497
498 @noindent
499 will configure the tools such that when compiled in a sun4 development
500 environment the resulting development environment can be used to create
501 programs intended for an a29k. Again, this does not necessarily mean
502 that the new development environment can be run on a sun4. That would
503 depend on the development environment used to build these tools.
504
505 Earlier you saw how to configure the tools to build a native development
506 environment, that is, a development environment that runs on your sun4
507 and builds programs for your sun4. Let's pretend that you use stage3 to
508 build this simple cross configuration and let's call the new development
509 environment gcc-a29k. Remember that this is a native build. Gcc-a29k
510 is a collection of native programs intended to run on your sun4. That's
511 what stage3 builds, programs for your sun4. Gcc-a29k represents an a29k
512 development environment that builds programs intended to run on an a29k.
513 But, remember, gcc-a29k runs on your sun4. Programs built with gcc-a29k
514 will run on your sun4 only with the help of an appropriate software
515 emulator.
516
517 @cindex Simple cross
518 @cindex Crossing to
519 Building gcc-a29k is also a bootstrap but of a slightly different sort.
520 We call gcc-a29k a @emph{simple cross} environment and using gcc-a29k to
521 build a program intended for a29k is called @emph{crossing to} a29k.
522 Simple cross environments are the second category of cross development
523 environments.
524
525
526 @node Crossing Into Targets, Canadian Cross, Simple Cross Environments, A Walk Through
527 @section Crossing Into Targets
528
529 @example
530 ./configure a29k -target=a29k
531 @end example
532
533 @noindent
534 will configure the tools such that when compiled in an a29k development
535 environment, the resulting development environment can be used to create
536 programs intended for an a29k. Again, this does not necessarily mean
537 that the new development environment can be run on an a29k. That would
538 depend on the development environment used to build these tools.
539
540 If you've been following along this walk through, then you've already
541 built an a29k environment, namely gcc-a29k. Let's pretend you use
542 gcc-a29k to build the current configuration.
543
544 Gcc-a29k builds programs intended for the a29k so the new development
545 environment will be intended for use on an a29k. That is, this new gcc
546 consists of programs that are foreign to your sun4. They cannot be run
547 on your sun4.
548
549 @cindex Crossing into
550 The process of building this configuration is another a bootstrap. This
551 bootstrap is also a cross to a29k. Because this type of build is both a
552 bootstrap and a cross to a29k, it is sometimes referred to as a
553 @emph{cross into} a29k. This new development environment isn't really a
554 cross development environment at all. It is intended to run on an a29k
555 to produce programs for an a29k. You'll remember that this makes it, by
556 definition, an a29k native compiler. @emph{Crossing into} has been
557 introduced here not because it is a type of cross development
558 environment, but because it is frequently mistaken as one. The process
559 is @emph{a cross} but the resulting development environment is a native
560 development environment.
561
562 You could not have built this configuration with stage3, because stage3
563 doesn't provide an a29k environment. Instead it provides a sun4
564 environment.
565
566 If you happen to have an a29k lying around, you could now use this fresh
567 development environment on the a29k to three-stage these tools all over
568 again. This process would look just like it did when we built the
569 native sun4 development environment because we would be building another
570 native development environment, this one on a29k.
571
572
573 @node Canadian Cross, , Crossing Into Targets, A Walk Through
574 @section Canadian Cross
575
576 So far you've seen that our development environment source must be
577 configured for a specific host and for a specific target. You've also
578 seen that the resulting development environment depends on the
579 development environment used in the build process.
580
581 When all four match identically, that is, the configured host, the
582 configured target, the environment presented by the development
583 environment used in the build, and the machine on which the resulting
584 development environment is intended to run, then the new development
585 environment will be a native development environment.
586
587 When all four match except the configured host, then we can assume that
588 the development environment used in the build is some form of library
589 emulation.
590
591 When all four match except for the configured target, then the resulting
592 development environment will be a simple cross development environment.
593
594 When all four match except for the host on which the development
595 environment used in the build runs, the build process is a @emph{cross into}
596 and the resulting development environment will be native to some other
597 machine.
598
599 Most of the other permutations do exist in some form, but only one more
600 is interesting to the current discussion.
601
602 @example
603 ./configure a29k -target=sun3
604 @end example
605
606 @noindent
607 will configure the tools such that when compiled in an a29k development
608 environment, the resulting development environment can be used to create
609 programs intended for a sun3. Again, this does not necessarily mean
610 that the new development environment can be run on an a29k. That would
611 depend on the development environment used to build these tools.
612
613 If you are still following along, then you have two a29k development
614 environments, the native development environment that runs on a29k, and
615 the simple cross that runs on your sun4. If you use the a29k native
616 development environment on the a29k, you will be doing the same thing we
617 did a while back, namely building a simple cross from a29k to sun3.
618 Let's pretend that instead, you use gcc-a29k, the simple cross
619 development environment that runs on sun4 but produces programs for
620 a29k.
621
622 The resulting development environment will run on a29k because that's
623 what gcc-a29k builds, a29k programs. This development environment will
624 produce programs for a sun3 because that is how it was configured. This
625 means that the resulting development environment is a simple cross.
626
627 @cindex Canadian Cross
628 @cindex Three party cross
629 There really isn't a common name for this process because very few
630 development environments are capable of being configured this
631 extensively. For the sake of discussion, let's call this process a
632 @emph{Canadian cross}. It's a three party cross, Canada has a three
633 party system, hence Canadian Cross.
634
635 @node Final Notes, Index, A Walk Through, top
636 @chapter Final Notes
637
638 By @emph{configures}, I mean that links, Makefile, .gdbinit, and
639 config.status are built. Configuration is always done from the source
640 directory.
641
642 @table @code
643
644 @item ./configure @var{name}
645 configures this directory, perhaps recursively, for a single host+target
646 pair where the host and target are both @var{name}. If a previous
647 configuration existed, it will be overwritten.
648
649 @item ./configure @var{hostname} -target=@var{targetname}
650 configures this directory, perhaps recursively, for a single host+target
651 pair where the host is @var{hostname} and target is @var{targetname}.
652 If a previous configuration existed, it will be overwritten.
653
654 @item ./configure -subdirs @var{hostname} -target=@var{targetname}
655 creates a subdirectories @file{H-@var{hostname}} if @var{hostname} is @var{targetname} or
656 @file{X-@var{hostname}-@var{targetname}} if it is not and configures the new directory.
657
658 @end table
659
660 @menu
661 * Hacking Configurations:: Hacking Configurations
662 @end menu
663
664 @node Hacking Configurations, , Final Notes, Final Notes
665 @section Hacking Configurations
666
667 The configure scripts essentially do three things, create subdirectories
668 if appropriate, build a @file{Makefile}, and create links to files, all
669 based on and tailored to, a specific host+target pair. The scripts also
670 create a @file{.gdbinit} if appropriate but this is not tailored.
671
672 The Makefile is created by prepending some variable definitions to a
673 Makefile template called @file{Makefile.in} and then inserting host and
674 target specific Makefile fragments. The variables are set based on the
675 chosen host+target pair and build style, that is, if you use
676 subdirectories or not. The host and target specific Makefile may or may
677 not exist.
678
679 @itemize @bullet
680
681 @item
682 Makefiles can be edited directly, but those changes will eventually be
683 lost. Changes intended to be permanent for a specific host should be
684 made to the host specific Makefile fragment. This should be in
685 @file{./config/mh-@var{host}} if it exists. Changes intended to be
686 permanent for a specific target should be made to the target specific
687 Makefile fragment. This should be in @file{./config/mt-@var{target}} if
688 it exists. Changes intended to be permanent for the directory should be
689 made in @file{Makefile.in}. To propogate changes to any of these,
690 either use @code{make Makefile} or @code{./config.status} or
691 re-configure.
692
693 @end itemize
694
695 @page
696 @node Index, , Final Notes, top
697 @appendix Index
698
699 @printindex cp
700
701 @contents
702 @bye
703
704 @c Local Variables:
705 @c fill-column: 72
706 @c End:
This page took 0.044335 seconds and 5 git commands to generate.