Added configdos.bat
[external/binutils.git] / README.configure
1                    On Configuring Development Tools
2
3                         K. Richard Pixley
4                         Cygnus Support
5
6                  Last Mod Tue Oct 1 21:20:21 PDT 1991, by rich@cygnus.com
7
8 INTRO
9 -----
10
11     This document attempts to describe the general concepts behind
12     configuration of the Cygnus Support release of the GNU Development
13     Tools.  It also discusses common usage.  Eventually, FIXME, there
14     will also be a man page for "configure", an "info" tree, etc.
15
16
17 BASICS
18 ------
19
20 Some Basic Terms:
21
22     There are a lot of terms that are frequently used when discussing
23     development tools.  Most of the common terms have been used for
24     several different concepts such that their meanings have become
25     ambiguous to the point of being confusing.  Typically, we only
26     guess at their meanings from context and we frequently guess
27     wrong.
28
29     This document uses very few terms by comparison.  The intent is to
30     make the concepts as clear as possible in order to convey the
31     usage and intent of these tools.
32
33     "Programs" run on "machines".  Programs are very nearly always
34     written in "source".  Programs are "built" from source.
35     "Compilation" is a process that is frequently, but not always,
36     used when building programs.
37
38
39 Host Environments:
40
41     In this document, the word "host" refers to the environment in
42     which this source will be compiled.  "host" and "host name" have
43     nothing to do with the proper name of your host, like "ucbvax",
44     "prep.ai.mit.edu" or "att.com".  Instead they refer to things like
45     "sun4" and "dec3100".
46
47     Forget for a moment that this particular directory of source is
48     the source for a development environment.  Instead, pretend that
49     it is the source for a simpler, more mundane, application, say, a
50     desk calculator.
51
52     Source that can be compiled in more than one environment,
53     generally needs to be set up for each environment explicitly.
54     Here we refer to that process as configuration.  That is, we
55     configure the source for a host.
56
57     For example, if we wanted to configure our mythical desk
58     calculator to compile on a SparcStation, we might configure for
59     host sun4.  With our configuration system:
60
61         cd desk-calculator ; ./configure sun4
62
63     does the trick.  "configure" is a shell script that sets up
64     Makefiles, subdirectories, and symbolic links appropriate for
65     compiling the source on a sun4.
66
67     The "host" environment does not necessarily refer to the machine
68     on which the tools are built.  It is possible to provide a sun3
69     development environment on a sun4.  If we wanted to use a cross
70     compiler on the sun4 to build a program intended to be run on a
71     sun3, we would configure the source for sun3.
72
73         cd desk-calculator ; ./configure sun3
74
75     The fact that we are actually building the program on a sun4 makes
76     no difference if the sun3 cross compiler presents an environment
77     that looks like a sun3 from the point of view of the desk
78     calculator source code.  Specifically, the environment is a sun3
79     environment if the header files, predefined symbols, and libraries
80     appear as they do on a sun3.
81
82     Nor does the host environment refer to the the machine on which
83     the program to be built will run.  It is possible to provide a
84     sun3 emulation environment on a sun4 such that programs built in a
85     sun3 development environment actually run on the sun4.
86
87     Host environment simply refers to the environment in which the
88     program will be built from the source.
89
90
91 Configuration Time Options:
92
93     Many programs have compile time options.  That is, features of the
94     program that are either compiled into the program or not based on a
95     choice made by the person who builds the program.  We refer to these
96     as "configuration options".  For example, our desk calculator might be
97     capable of being compiled into a program that either uses infix
98     notation or postfix as a configuration option.  For a sun3, chosing
99     infix might be:
100
101         ./configure sun3 +notation=infix
102
103     while a sun4 with postfix might be:
104
105         ./configure sun4 +notation=postfix
106
107     If we wanted to build both at the same time, in the same directory
108     structure, the intermediate pieces used in the build process must
109     be kept separate.
110
111         ./configure sun4 +subdirs +notation=postfix
112         ./configure sun3 +subdirs +notation=infix
113
114     will create subdirectories for the intermediate pieces of the sun4
115     and sun3 configurations.  This is necessary as previous systems
116     were only capable of one configuration at a time.  A second
117     configuration overwrote the first.  We've chosen to retain this
118     behaviour so the "+subdirs" configuration option is necessary
119     to get the new behaviour.  The order of the arguments doesn't
120     matter.  There should be exactly one argument without a leading
121     '+' sign and that argument will be assumed to be the host name.
122
123     From here on the examples will assume that you want to build the
124     tools "in place" and won't show the "+subdirs" option, but
125     remember that it is available.
126
127     In order to actually install the program, the configuration system
128     needs to know where you would like the program installed.  The
129     default location is /usr/local.  We refer to this location as
130     $(destdir).  All user visible programs will be installed in
131     $(destdir)/bin.  All other programs and files will be installed in
132     a subdirectory of $(destdir)/lib.
133
134     You can elect to change $(destdir) only as a configuration time
135     option.
136
137         ./configure sun4 +notation=postfix +destdir=/local
138
139     Will configure the source such that:
140
141         make install
142
143     will put it's programs in /local/bin and /local/lib/gcc.  If you
144     change $(destdir) after building the source, you will need to:
145
146         make clean
147
148     before the change will be propogated properly.  This is because
149     some tools need to know the locations of other tools.
150
151     With these concepts in mind, we can drop the desk calculator and
152     move on to the application that resides in these directories,
153     namely, the source to a development environment.
154
155
156 SPECIFICS
157 ---------
158
159     The GNU Development Tools can be built on a wide variety of hosts.
160     So, of course, they must be configured.  Like the last example,
161
162         ./configure sun4 +destdir=/local
163         ./configure sun3 +destdir=/local
164
165     will configure the source to be built in subdirectories, in order
166     to keep the intermediate pieces separate, and to be installed in
167     /local.
168
169     When built with suitable development environments, these will be
170     native tools.  We'll explain the term "native" later.
171
172
173 BUILDING DEVELOPMENT ENVIRONMENTS
174 ---------------------------------
175
176     The Cygnus Support GNU development tools can not only be built
177     with a number of host development environments, they can also be
178     configured to create a number of different development
179     environments on each of those hosts.  We refer to a specific
180     development environment created as a "target".  That is, the word
181     "target" refers to the development environment produced by
182     compiling this source and installing the resulting programs.
183
184     For the Cygnus Support GNU development tools, the default target
185     is the same as the host.  That is, the development environment
186     produced is intended to be compatible with the environment used to
187     build the tools.
188
189     In the example above, we created two configurations, one for sun4
190     and one for sun3.  The first configuration is expecting to be
191     built in a sun4 development environment, to create a sun4
192     development environment.  It doesn't necessarily need to be built
193     on a sun4 if a sun4 development environment is available
194     elsewhere.  Likewise, if the available sun4 development
195     environment produces executables intended for something other than
196     sun4, then the development environment built from this sun4
197     configuration will run on something other than a sun4.  From the
198     point of view of the configuration system and the GNU development
199     tools source, this doesn't matter.  What matters is that they will
200     be built in a sun4 environment.
201
202     Similarly, the second configuration given above is expecting to be
203     built in a sun3 development environment, to create a sun3
204     development environment.
205
206     The development environment produced, is a configuration time
207     option, just like $(destdir).
208
209         ./configure sun4 +destdir=/local +target=sun3
210         ./configure sun3 +destdir=/local +target=sun4
211
212     In this example, like before, we create two configurations.  The
213     first is intended to be built in a sun4 environment, in
214     subdirectories, to be installed in /local.  The second is intended
215     to be built in a sun3 environment, in subdirectories, to be
216     installed in /local.
217
218     Unlike the previous example, the first configuration will produce
219     a sun3 development environment, perhaps even suitable for building
220     the second configuration.  Likewise, the second configuration will
221     produce a sun4 development environment, perhaps even suitable for
222     building the first configuration.
223
224     The development environment used to build these configurations
225     will determine the machines on which the resulting development
226     environments can be used.
227
228
229 A WALK THROUGH
230 --------------
231
232 Native Development Environments:
233
234     Let us assume for a moment that you have a sun4 and that with your
235     sun4 you received a development environment.  This development
236     environment is intended to be run on your sun4 to build programs
237     that can be run on your sun4.  You could, for instance, run this
238     development environment on your sun4 to build our example desk
239     calculator program.  You could then run the desk calculator
240     program on your sun4.
241
242     The resulting desk calculator program is referred to as a "native"
243     program.  The development environment itself is composed of native
244     programs that, when run, build other native programs.  Any other
245     program is referred to as "foreign".  Programs intended for other
246     machines are foreign programs.
247
248     This type of development environment, which is by far the most
249     common, is refered to as "native".  That is, a native development
250     environment runs on some machine to build programs for that same
251     machine.  The process of using a native development environment to
252     build native programs is called a "native" build.
253
254         ./configure sun4
255
256     Will configure this source such that when built in a sun4
257     development environment, with a development environment that
258     builds programs intended to be run on sun4 machines, the programs
259     built will be native programs and the resulting development
260     environment will be a native development environment.
261
262     The development system that came with your sun4 is one such
263     environment.  Using it to build the GNU Development Tools is a
264     very common activity and the resulting development environment is
265     very popular.
266
267         make all
268
269     will build the tools as configured and will assume that you want
270     to use the native development environment that came with your
271     machine.
272
273     Using a development environment to build a development environment
274     is called "bootstrapping".  The Cygnus Support release of the GNU
275     Development Tools is capable of bootstrapping itself.  This is a
276     very powerful feature that we'll return to later.  For now, let's
277     pretend that you used the native development environment that came
278     with your sun4 to bootstrap the Cygnus Support release and let's
279     call the new development environment stage1.
280
281     Why bother?  Well, most people find that the Cygnus Support
282     release builds programs that run faster and take up less space
283     than the native development environments that came with their
284     machines.  Some people didn't get development environments with
285     their machines and some people just like using the GNU tools
286     better than using other tools.
287
288     While you're at it, if the GNU tools produce better programs, maybe
289     you should use them to build the GNU tools.  It's a good idea, so
290     let's pretend that you do.  Let's call the new development
291     environment stage2.
292
293     So far you've built a development environment, stage1, and you've
294     used stage1 to build a new, faster and smaller development
295     environment, stage2, but you haven't run any of the programs that
296     the GNU tools have built.  You really don't yet know if these
297     tools work.  Do you have any programs built with the GNU tools?
298     Yes, you do.  stage2.  What does that program do?  It builds
299     programs.  Ok, do you have any source handy to build into a
300     program?  Yes, you do.  The GNU tools themselves.  In fact, if you
301     use stage2 to build the GNU tools again the resulting programs
302     should be identical to stage2.  Let's pretend that you do and call
303     the new development environment stage3.
304
305     You've just completed what's called a "three stage boot".  You now
306     have a small, fast, somewhat tested, development environment.
307
308         make bootstrap
309
310     will do a three stage boot across all tools and will compare
311     stage2 to stage3 and complain if they are not identical.
312
313     Once built,
314
315         make install
316
317     will install the development environment in the default location
318     or in $(destdir) if you specified an alternate when you
319     configured.  In fact, you can skip the "make all" part and just
320     "make install" which will make sure that the development
321     environment is built before attempting to install anything.  Even
322     better, for configurations where host is the same as target, like
323     this one, "make install" will make sure that a "make bootstrap" is
324     done before installing anything.
325
326     Any development environment that is not a native development
327     environment is refered to as a "cross" development environment.
328     There are many different types of cross development environments
329     but most fall into one of FIXME basic categories.
330
331
332 Emulation Environments:
333
334     The first category of cross development environment is called
335     "emulation".  There are two primary types of emulation, but both
336     types result in programs that run on the native host.
337
338     The first type is "software emulation".  This form of cross
339     development environment involves a native program that when run on
340     the native host, is capable of interpreting, and in most aspects
341     running, a program intended for some other machine.  This
342     technique is typically used when the other machine is either too
343     expensive, too slow, too fast, or not available, perhaps because
344     it hasn't yet been built.  The native, interpreting program is
345     called a "software emulator".
346
347     The GNU Development Tools do not currently include any software
348     emulators.  Some do exist and the GNU Development Tools can be
349     configured to create simple cross development environments for
350     with these emulators.  More on this later.
351
352     The second type of emulation is when source intended for some
353     other development environment is built into a program intended for
354     the native host.  The concept of universes in operating systems
355     and hosted operating systems are two such development
356     environments.
357
358     The Cygnus Support Release of the GNU Development Tools can be
359     configured for one such emulation at this time.
360
361         ./configure sun4 +ansi
362
363     will configure the source such that when built in a sun4
364     development environment the resulting development environment is
365     capable of building sun4 programs from strictly conforming ANSI
366     X3J11 C source.  Remember that the environment used to build the
367     tools determines the machine on which this tools will run, so the
368     resulting programs aren't necessarily intended to run on a sun4,
369     although they usually are.  Also note that the source for the GNU
370     tools is not strictly conforming ANSI source so this configuration
371     cannot be used to bootstrap the GNU tools.
372
373
374 Simple Cross Environments:
375
376         ./configure sun4 +target=a29k
377
378     will configure the tools such that when compiled in a sun4
379     development environment the resulting development environment can
380     be used to create programs intended for an a29k.  Again, this does
381     not necessarily mean that the new development environment can be
382     run on a sun4.  That would depend on the development environment
383     used to build these tools.
384
385     Earlier you saw how to configure the tools to build a native
386     development environment, that is, a development environment that
387     runs on your sun4 and builds programs for your sun4.  Let's
388     pretend that you use stage3 to build this simple cross
389     configuration and let's call the new development environment
390     gcc-a29k.  Remember that this is a native build.  Gcc-a29k is a
391     collection of native programs intended to run on your sun4.
392     That's what stage3 builds, programs for your sun4.  Gcc-a29k
393     represents an a29k development environment that builds programs
394     intended to run on an a29k.  But, remember, gcc-a29k runs on your
395     sun4.  Programs built with gcc-a29k will run on your sun4 only
396     with the help of an appropriate software emulator.
397
398     Building gcc-a29k is also a bootstrap but of a slightly different
399     sort.  We call gcc-a29k a simple cross environment and using
400     gcc-a29k to build a program intended for a29k is called "crossing
401     to" a29k.  Simple cross environments are the second category of
402     cross development environments.
403
404
405 Crossing Into Targets:
406
407         ./configure a29k +target=a29k
408
409     will configure the tools such that when compiled in an a29k
410     development environment, the resulting development environment can
411     be used to create programs intended for an a29k.  Again, this does
412     not necessarily mean that the new development environment can be
413     run on an a29k.  That would depend on the development environment
414     used to build these tools.
415
416     If you've been following along this walk through, then you've
417     already built an a29k environment, namely gcc-a29k.  Let's pretend
418     you use gcc-a29k to build the current configuration.
419
420     Gcc-a29k builds programs intended for the a29k so the new
421     development environment will be intended for use on an a29k.  That
422     is, this new gcc consists of programs that are foreign to your
423     sun4.  They cannot be run on your sun4.
424
425     The process of building this configuration is another a bootstrap.
426     This bootstrap is also a cross to a29k.  Because this type of
427     build is both a bootstrap and a cross to a29k, it is sometimes
428     referred to as a "cross into" a29k.  This new development
429     environment isn't really a cross development environment at all.
430     It is intended to run on an a29k to produce programs for an a29k.
431     You'll remember that this makes it, by definition, an a29k native
432     compiler.  "Crossing into" has been introduced here not because it
433     is a type of cross development environment, but because it is
434     frequently confused one.  The process is "a cross" but the
435     resulting development environment is a native development
436     environment.
437
438     You could not have built this configuration with stage3, because
439     stage3 doesn't provide an a29k environment.  Instead it provides a
440     sun4 environment.
441
442     If you happen to have an a29k lying around, you could now use
443     this fresh development environment on the a29k to three-stage
444     these tools all over again.  This process would look just like it
445     did when we built the native sun4 development environment because
446     we would be building another native development environment, this
447     one on a29k.
448
449     
450 The Three Party Cross:
451
452     So far you've seen that our development environment source must be
453     configured for a specific host and for a specific target.  You've
454     also seen that the resulting development environment depends on
455     the development environment used in the build process.
456
457     When all four match identically, that is, the configured host, the
458     configured target, the environment presented by the development
459     environment used in the build, and the machine on which the
460     resulting development environment is intended to run, then the new
461     development environment will be a native development environment.
462
463     When all four match except the configured host, then we can assume
464     that the development environment used in the build is some form of
465     library emulation.
466
467     When all four match except for the configured target, then the
468     resulting development environment will be a simple cross
469     development environment.
470
471     When all four match except for the host on which the development
472     environment used in the build runs, the build process is a "cross
473     into" and the resulting development environment will be native to
474     some other machine.
475
476     Most of the other permutations do exist in some form, but only one
477     more is interesting to the current discussion.
478
479         ./configure a29k +target=sun3
480
481     will configure the tools such that when compiled in an a29k
482     development environment, the resulting development environment can
483     be used to create programs intended for a sun3.  Again, this does
484     not necessarily mean that the new development environment can be
485     run on an a29k.  That would depend on the development environment
486     used to build these tools.
487
488     If you are still following along, then you have two a29k
489     development environments, the native development environment that
490     runs on a29k, and the simple cross that runs on your sun4.  If you
491     use the a29k native development environment on the a29k, you will
492     be doing the same thing we did a while back, namely building a
493     simple cross from a29k to sun3.  Let's pretend that instead, you
494     use gcc-a29k, the simple cross development environment that runs
495     on sun4 but produces programs for a29k.
496
497     The resulting development environment will run on a29k because
498     that's what gcc-a29k builds, a29k programs.  This development
499     environment will produce programs for a sun3 because that is how
500     it was configured.  This means that the resulting development
501     environment is a simple cross.
502
503     There really isn't a common name for this process because very few
504     development environments are capable of being configured this
505     extensively.  For the sake of discussion, let's call this process
506     a "three party cross".
507
508
509 FINAL NOTES
510 -----------
511
512 By "configures", I mean that links, Makefile, .gdbinit, and
513 config.status are built.  Configuration is always done from the source
514 directory.
515
516 * "./configure name" configures this directory, perhaps recursively,
517   for a single host+target pair where the host and target are both
518   "name".  If a previous configuration existed, it will be
519   overwritten.
520
521 * "./configure hostname +target=targetname" configures this directory,
522   perhaps recursively, for a single host+target pair where the host is
523   hostname and target is targetname.  If a previous configuration
524   existed, it will be overwritten.
525
526 * "./configure +subdirs hostname +target=targetname" creates a
527   subdirectories H-hostname and H-hostname/T-targetname and
528   configures H-hostname/T-targetname.  For now, makes should
529   be done from H-hostname/T-targetname.  "./configure +sub name"
530   works as expected.  That is, it creates H-name and
531   H-name/T-name and configures the latter.
532
533
534 Hacking configurations:
535
536 The configure scripts essentially do three things, create
537 subdirectories if appropriate, build a Makefile, and create links to
538 files, all based on and tailored to, a specific host+target pair.  The
539 scripts also create a .gdbinit if appropriate but this is not
540 tailored.
541
542 The Makefile is created by prepending some variable definitions to a
543 Makefile template called Makefile.in and then inserting host and
544 target specific Makefile fragments.  The variables are set based on
545 the chosen host+target pair and build style, that is, if you use
546 subdirectories or not.  The host and target specific Makefile may or
547 may not exist.  If fragments
548
549 * Makefiles can be edited directly, but those changes will eventually
550   be lost.  Changes intended to be permanent for a specific host
551   should be made to the host specific Makefile fragment.  This should
552   be in ./config/hmake-host if it exists.  Changes intended to be
553   permanent for a specific target should be made to the target
554   specific Makefile fragment.  This should be in ./config/tmake-target
555   if it exists.  Changes intended to be permanent for the directory
556   should be made in Makefile.in.  To propogate changes to any of
557   these, either use "make Makefile" or re-configure from the source
558   directory.
559
560 * configure can be edited directly, but those changes will eventually
561   be lost.  Changes intended to be permanent for a specific directory
562   should be made to configure.in.  Changes intended to be permanent
563   for all configure scripts should be made to configure.template.
564   Propogating changes to configure.in requires the presence of
565   configure.template which normally resides in the uppermost directory
566   you received.  To propogate changes to either configure.template or
567   a configure.in, use "configure +template=pathtothetemplate".
568   This will configure the configure scripts themselves, recursively if
569   appropriate.
570
571 * "./configure -srcdir=foo" is not supported yet.  At the moment, things
572   will probably be configured correctly only for leaf directories, and
573   even they will not have paths to libraries set properly.