summaryrefslogtreecommitdiffstats
path: root/doc/started/buildc.t
blob: 60e1f4b3a9cdcc7d2627bac0706392d3af96dd08 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
@c
@c  COPYRIGHT (c) 1988-2010.
@c  On-Line Applications Research Corporation (OAR).
@c  All rights reserved.

@chapter Building the GNU Cross Compiler Toolset

@b{NOTE}:  This chapter describes the steps required to build cross-compilation
toolset on Linux (and possibly Windows using Cygwin) systems.  This chapter
does @b{NOT} apply if you installed prebuilt toolset executables for BINUTILS,
GCC, NEWLIB, and GDB.  If you installed prebuilt executables for all of those,
proceed to @ref{Building RTEMS}.  If you require a GDB with a special
configuration to connect to your target board, then proceed to
@ref{Installing GDB Without RPM} for some advice.

This chapter describes the steps required to acquire the source code for
a GNU cross compiler toolset, apply any required RTEMS specific patches,
compile that toolset and install it.

It is recommended that when toolset binaries are available for your
particular host, that they be used.  Prebuilt binaries are much easier
to install.  They are also much easier for the RTEMS Project to support.

@c
@c  Preparation
@c
@section Preparation

Before you can build an RTEMS toolset from source, there are some
preparatory steps which must be performed.  You will need to determine
the various tool versions and patches required and download them  You
will also have to unarchive the source and apply any patches.

@c
@c  Determining Tool Version and Patch Revision
@c
@subsection Determining Tool Version and Patch Revision

The tool versions and patch revisions change on a fairly frequent basis.
In addition, these may vary based upon the target architecture.  In some
cases, the RTEMS Project may have to stick with a particular version
of a tool to provide a working version for a specific architecture.
Because of this, it is impossible to provide this information in a
complete and accurate manner in this manual.  You will need to refer
to the configuration files used by the RTEMS RPM specification files to
determine the current versions and, if a patch is required, what version.
This section describes how to locate the appropriate tool versions and
patches for a particular target architecture.

All patches and RPM specification files are kept in CVS.  They are
not included in release tarballs.  You will have to access the
CVS branch for RTEMS @value{RTEMSAPI}.  For details on this,
visit @uref{http://www.rtems.org/wiki/index.php/RTEMS_CVS_Repository, http://www.rtems.org/wiki/index.php/RTEMS_CVS_Repository} and look for
instructions on accessing the RTEMS Source Code Repository in read-only mode.
You can either do a complete checkout of the source tree or use a web
interface.  A typical checkout command would look like this:
@c TODO: pointing the user to the wiki entry might be enough.
@example
cvs -d :pserver:anoncvs@@www.rtems.com:/usr1/CVS -z 9 co -P rtems
@end example

In the checked out source code, you will need to look in the subdirectory
@code{contrib/crossrpms/autotools} to determine the versions of AUTOCONF
and AUTOMAKE as well as any patches required.  In this directory are
a few files you will need to look at.  The first is @code{Makefile.am}
which defines the versions of AUTOCONF and AUTOMAKE required for this
RTEMS Release Series.  Make a note of the version numbers required for
AUTOCONF and AUTOMAKE (AUTOCONF_VERS and AUTOMAKE_VERS respectively).  Then
examine the following files to determine the master location for the source
tarballs and to determine if a patch is required for each tool version cited in
the @code{Makefile.am}.

@example
autoconf-sources.add
automake-sources.add
@end example

If any patches are required, they will be in the
@code{contrib/crossrpms/patches} subdirectory of your checked out RTEMS
source tree.

If no patches are required, you can use a package manager provided by your
Linux distribution to install AUTOMAKE and AUTOCONF to avoid building them from
source.

In the checked out source code, you will need to look in the subdirectory
@code{contrib/crossrpms/rtems@value{RTEMSAPI}} to determine the target
specific tool versions and patches required. In this directory, you
will find a number of subdirectories with many named after target
architectures supported by RTEMS.  Descend into the directory for the
architecture you plan to build tools for.  Again, the @code{Makefile.am}
defines the tool versions for this architecture and RTEMS Release Series.
Make a note of the version numbers required for BINUTILS, GCC, NEWLIB,
and GDB.  Then examine the following files to determine the master
location for the source tarballs and to determine if a patch is required
for each tool version cited in the @code{Makefile.am}.

@itemize
binutils-sources.add
gcc-sources.add
gdb-sources.add
@end itemize

If any patches are required, they will be in the
@code{contrib/crossrpms/patches} subdirectory of your checked out RTEMS
source tree.

This is the entire set of source tarballs and patches required for a
toolset targeting the selected architecture.  In many cases, this will be
the same versions required by other targets on this RTEMS Release Series.

@c
@c  Obtain Source and Patches
@c
@subsection Obtain Source and Patches

You will need to download the sources for the various packages from
their master locations as identified in the previous section.

Any patches needed should be in the @code{contrib/crossrpms/patches}
directory of your RTEMS source.

@c
@c  Installing the Tools Without RPM
@c
@section Installing the Tools Without RPM

This section describes the procedure for building and installing an RTEMS
cross toolset from source code without using the RPM build infrastructure.

Direct invocation of @code{configure} and @code{make} provides more control
and easier recovery from problems when building.

@c
@c Archive and Build Directory Format
@c
@subsection Archive and Build Directory Format

When no packaging format requirements are present, the root directory for
the storage of source archives and patches as well as for building the
tools is up to the user.  The only concern is that there be enough
disk space to complete the build.  In this document, the following
organization will be used.

Make an @code{archive} directory to contain the downloaded source code
and pataches.  Additionally, a @code{tools} directory to be used as a
build directory.  The command sequence to do this is shown below:

@example
mkdir archive
mkdir tools
@end example

This will result in an initial directory structure similar to the
one shown in the following figure:

@example
@group
/whatever/prefix/you/choose/
        archive/
        tools/

@end group
@end example

The RTEMS Project tries to submit all of our patches upstream to the
parent projects.  In the event there are patches, the master copy of them
is located in the appropriate branch of the RTEMS source module in CVS.
Patches are in the @code{contrib/crossrpms/patches}.

@c
@c  Unarchiving the Tools
@c
@subsection Unarchiving the Tools

@b{NOTE}:  This step is required if building any of the tools without using RPM.
It is @b{NOT} required if using the procedure described in @ref{Using RPM
to Build Tools}.  This section describes the process of unarchiving the
tools that comprise an RTEMS toolset.

GNU source distributions are archived using @code{tar} and
compressed using either @code{gzip} or @code{bzip}.
If compressed with @code{gzip}, the extension @code{.gz} is used.
If compressed with @code{bzip}, the extension @code{.bz2} is used.

While in the @code{tools} directory, unpack the compressed tar files
using the appropriate command based upon the compression program used.

@example
cd tools
tar xzf ../archive/TOOLNAME.tar.gz  # for gzip'ed tools
tar xjf ../archive/TOOLNAME.tar.bz2 # for bzip'ed tools
@end example

Assuming you are building a complete toolset, after all of the the
compressed tar files have been unpacked using the appropriate commands,
the following directories will have been created under @code{tools}.

@itemize @bullet
@item autoconf-<VERSION>
@item automake-<VERSION>
@item binutils-<VERSION>
@item gcc-<VERSION>
@item newlib-<VERSION>
@item gdb-<VERSION>
@end itemize

The tree should look something like the following figure:

@example
@group
/whatever/prefix/you/choose/
        archive/
          variable tarballs
          variable patches
        tools/
          various tool source trees
@end group
@end example

@c
@c Applying RTEMS Project Tool Patches
@c

@subsection Applying RTEMS Project Tool Patches

@b{NOTE}:  This step is required if building any of the tools IF they have a
patch currently required and you are building the tools without using RPM.
is @b{NOT} required if using the procedure described in @ref{Using RPM
to Build Tools}.  This section describes the process of applying the
RTEMS patches to any of the tools.

If a patch is required for a particular tool source tree, it is placed in the
@code{contrib/crossrpms/patches} directory in the CVS tree.  Make sure the
patch version is the same as of the tool you are building.  You will perform a
command similar to the following to apply the patch.  In this example, <TOOL>
should be replaced by the appropriate tool directory and <TOOL_PATCH> with the
appropriate patch file.

@example
cd tools/<TOOL>
cat ../../archive/<TOOL_PATCH> | patch -p1
@end example

@b{NOTE}: If you add the @code{--dry-run} option to the @code{patch} command
in the above commands, it will attempt to apply the patch and report
any issues without actually modifying any files.

If the patch was compressed with the @code{gzip} program, it will
have a suffix of @code{.gz} and you should use @code{zcat} instead
of @code{cat} as shown above.  If the patch was compressed with
the @code{gzip} program, it will have a suffix of @code{.bz2} and
you should use @code{bzcat} instead of @code{cat} as shown above.

Check to see if any of these patches have been rejected using the following
sequence:

@example
cd tools/<TOOL>
find . -name "*.rej" -print
@end example

If any files are found with the .rej extension, a patch has been rejected.
This should not happen with a good patch file which is properly applied.

@c
@c  Installing AUTOCONF From Source
@c

@subsection Installing AUTOCONF From Source

The following example illustrates the invocation of @code{configure}
and @code{make} to build and install autoconf-<version>.  This tool is
installed as a native utility and is independent of any RTEMS target.

@b{NOTE}: If no patch is required for Autoconf and Automake, you can use the
standard package manager provided by your Linux distribution to install them.
Of course, the versions provided by your package manager should be the same
that specified in Makefile.am or better.

@example
mkdir b-autoconf
cd b-autoconf
../autoconf-<VERSION>/configure --prefix=@value{RTEMSPREFIX}
make
make install
@end example

After autoconf-<VERSION> is built and installed the build directory
@code{b-autoconf} may be removed.

For more information on the invocation of @code{configure}, please
refer to the documentation for autoconf-<VERSION> or invoke the
autoconf-VERSION> @code{configure} command with the @code{--help} option.

@c
@c  Installing AUTOMAKE From Source
@c

@subsection Installing AUTOMAKE From Source

The following example illustrates the invocation of @code{configure}
and @code{make} to build and install automake-<version>.  This tool is
installed as a native utility and is independent of any RTEMS target.

@example
mkdir b-automake
cd b-automake
../automake-<VERSION>/configure --prefix=@value{RTEMSPREFIX}
make all
make info
make install
@end example

After automake-<VERSION> is built and installed the build directory
@code{b-automake} may be removed.

For more information on the invocation of @code{configure}, please
refer to the documentation for automake-<VERSION> or invoke the
automake-VERSION> @code{configure} command with the @code{--help} option.

@c
@c  Installing BINUTILS From Source
@c
@subsection Installing BINUTILS From Source

The following example illustrates the invocation of @code{configure}
and @code{make} to build and install binutils-<version>
sparc-rtems@value{RTEMSAPI} target:

@example
mkdir b-binutils
cd b-binutils
../binutils-<VERSION>/configure --target=sparc-rtems@value{RTEMSAPI} \
  --prefix=@value{RTEMSPREFIX}
make all
make info
make install
@end example

After binutils-<VERSION> is built and installed the build directory
@code{b-binutils} may be removed.

For more information on the invocation of @code{configure}, please
refer to the documentation for binutils-<VERSION> or invoke the
binutils-VERSION> @code{configure} command with the @code{--help} option.

NOTE: The shell PATH variable needs to be updated to include the path
the binutils user executables have  been installed in.  The directory
containing the executables is the prefix used above with
@file{bin} post-fixed.

@example
export PATH=@value{RTEMSPREFIX}/bin:$@{PATH@}
@end example

As you will need to frequently run various commands in the
@value{RTEMSPREFIX}/bin, you can update your @code{~/.bashrc} to include this
line. After doing that, don't forget to run
@example
source ~/.bashrc
@end example
for the changes to take place.

Failure to have the binutils in the path will cause the GCC and NEWLIB
build to fail with an error message similar to:

@example
sparc-rtems@value{RTEMSAPI}-ar: command not found
@end example

@c
@c  Installing GCC and NEWLIB Without RPM
@c
@subsection Installing GCC and NEWLIB Without RPM

Before building gcc-<VERSION> and newlib-<VERSION>,
binutils-<VERSION> must be installed and the directory
containing those executables must be in your PATH.

The C Library is built as a subordinate component of
gcc-<VERSION>.  Because of this, the newlib-<VERSION>
directory source must be available inside the gcc-<VERSION>
source tree.  This is normally accomplished using a symbolic
link as shown in this example:

@example
cd gcc-<VERSION>
ln -s ../newlib-<VERSION>/newlib .
@end example

The following example illustrates the invocation of
@code{configure} and @code{make}
to build and install gcc-<VERSION> with only
C and C++ support for the sparc-rtems@value{RTEMSAPI} target:

@example
mkdir b-gcc
cd b-gcc
../gcc-<VERSION>/configure --target=sparc-rtems@value{RTEMSAPI} \
   --with-gnu-as --with-gnu-ld --with-newlib --verbose \
   --enable-threads --enable-languages="c,c++" \
   --prefix=@value{RTEMSPREFIX}
make all
make info
make install
@end example

After gcc-<VERSION> is built and installed the
build directory @code{b-gcc} may be removed.

For more information on the invocation of @code{configure}, please
refer to the documentation for gcc-<VERSION> or
invoke the gcc-<VERSION> @code{configure} command with the
@code{--help} option.

@c
@c Building GCC with Ada Support
@c
@subsection Building GCC with Ada Support

If you want a GCC toolset that includes support for Ada
(e.g. GNAT), there are some additional requirements on
the host environment and additional build steps to perform.
It is critical that you use the same version of GCC/GNAT as
the native compiler.  GNAT must be compiled with an Ada compiler
and when building a GNAT cross-compiler, it should be
the same version of GNAT itself.

It is also important to verify whether there is an RTEMS specific
Ada patch required for GCC.  These can be found in
@uref{http://www.rtems.org/ftp/pub/rtems/people/joel/ada,
http://www.rtems.org/ftp/pub/rtems/people/joel/ada}.  The patch is
often a minor version or two behind GCC but will usually apply cleanly.
This patch must be applied.

After this, it is critical to perform these steps in the correct order.
GNAT requires that the C Library and RTEMS itself be installed before
the language run-time can be built.

@itemize @bullet
@item install native GCC with GNAT
@item place new native GNAT at head of PATH
@item install BINUTILS
@item place RTEMS prefix at head of PATH
@item install C toolset (C++ is optional)
@item install RTEMS built multilib
@item install RTEMS built for your BSP
@end itemize

The build procedure is the same until the Ada configure step.  A GCC
toolset with GNAT enabled requires that @code{ada} be included in the set
of enabled languages.  The following example illustrates the invocation of
@code{configure} and @code{make} to build and install gcc-<VERSION> with
only C, C++, and Ada support for the sparc-rtems@value{RTEMSAPI} target:

@example
mkdir b-gcc
cd b-gcc
../gcc-<VERSION>/configure --target=sparc-rtems@value{RTEMSAPI} \
   --with-gnu-as --with-gnu-ld --with-newlib --verbose \
   --enable-threads --enable-languages="c,c++,ada" \
   --prefix=@value{RTEMSPREFIX}
make all
make info
make install
@end example

After gcc-<VERSION> is built and installed the build directory
@code{b-gcc} may be removed.

@c
@c Installing GDB Without RPM
@c
@subsection Installing GDB Without RPM

@b{NOTE}:  This step is NOT required if prebuilt executables for the
GDB were installed and they meet your target interface
requirements.

GDB supports many configurations but requires some means of communicating
between the host computer and target board.  This communication can be via
a serial port, Ethernet, BDM, or ROM emulator.  The communication protocol
can be the GDB remote protocol or GDB can talk directly to a ROM monitor.
This setup is target board specific.  Some of the configurations that have
been successfully used with RTEMS applications are:

@itemize @bullet
@item BDM with ColdFire, 683xx, MPC860 CPUs
@item Motorola Mxxxbug found on M68xxx VME boards
@item Motorola PPCbug found on PowerPC VME, CompactPCI, and MTX boards
@item ARM based Cogent EDB7312
@item PC's using various Intel and AMD CPUs including i386,
i486, Pentium and above, and Athlon
@item PowerPC Instruction Simulator in GDB (PSIM)
@item MIPS Instruction Simulator in GDB (JMR3904)
@item Sparc Instruction Simulator in GDB (SIS)
@item Sparc Instruction Simulator (TSIM)
@end itemize

GDB is currently RTEMS thread/task aware only if you are using the
remote debugging support via Ethernet.  These are configured
using gdb targets of the form CPU-RTEMS.  Note the capital RTEMS.

It is recommended that when toolset binaries are available for
your particular host, that they be used.  Prebuilt binaries
are much easier to install but in the case of gdb may or may
not include support for your particular target board.

The following example illustrates the invocation of @code{configure}
and @code{make} to build and install gdb-<VERSION> for the
m68k-rtems@value{RTEMSAPI} target:

@example
mkdir b-gdb
cd b-gdb
../gdb-<VERSION>/configure --target=m68k-rtems@value{RTEMSAPI} \
  --prefix=@value{RTEMSPREFIX}
make all
make info
make install
@end example

For some configurations, it is necessary to specify extra options
to @code{configure} to enable and configure option components
such as a processor simulator.  The following is a list of
configurations for which there are extra options:

@table @b
@item powerpc-rtems@value{RTEMSAPI}
@code{--enable-sim --enable-sim-powerpc --enable-sim-timebase --enable-sim-hardware}

@item sparc-rtems@value{RTEMSAPI}
@code{--enable-sim}

@end table

After gdb-<VERSION> is built and installed the
build directory @code{b-gdb} may be removed.

For more information on the invocation of @code{configure}, please
refer to the documentation for gdb-<VERSION> or
invoke the gdb-<VERSION> @code{configure} command with the
@code{--help} option.


@c
@c  Using RPM to Build Tools
@c

@section Using RPM to Build Tools

RPM is a packaging format which can be used to distribute binary files as
well as to capture the procedure and source code used to produce those
binary files.  For RPM, it is assumed that the following subdirectories
are under a root directory such as @code{/usr/src/redhat} or
@code{/usr/local/src/redhat}) on your machine.

@example
BUILD
RPMS
SOURCES
SPECS
SRPMS
@end example

For the purposes of this document, the RPM @code{SOURCES} directory is the
directory into which all tool source and patches are assumed to reside.
The @code{BUILD} directory is where the actual build is performed when
building binaries from a source RPM.

RPM automatically unarchives the source and applies any needed patches
so you do @b{NOT} have to manually perform the procedures described
@ref{Unarchiving the Tools} and @ref{Applying RTEMS Project Tool Patches}.
But you are responsible for placing all source tarballs
and patches in the @code{SOURCES} directory per the instructions in
@ref{Obtain Source and Patches}

This procedure starts by installing the source (e.g. @code{.src.rpm}
extension) RPMs.  The RTEMS tool source RPMS are called "nosrc" to
indicate that one or more source files required to produce the RPMs
are not present.  The RTEMS source RPMs typically include all required
patches, but do not include the large @code{.tar.gz} or @code{.tgz} files
for each component such as BINUTILS, GCC, or NEWLIB.  These are shared
by all RTEMS RPMs regardless of target CPU and there was no reason to
duplicate them.  You will have to get the required source archive files
by hand and place them in the @code{SOURCES} directory before attempting
to build.  If you forget to do this, RPM is smart -- it will tell you
what is missing. You can fetch any missing files and try again.

@c
@c  Building AUTOCONF using RPM
@c
@subsection Building AUTOCONF using RPM

This section illustrates the invocation of RPM to build a new, locally
compiled, AUTOCONF binary RPM that matches the installed source RPM.
This example assumes that all of the required source is installed.

@example
rpm -U @value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-autoconf-<VERSION>-<RPM_RELEASE>.src.rpm
@end example

@example
cd <RPM_ROOT_DIRECTORY>/SPECS
rpm -bb i386-rtems@value{RTEMSAPI}-autoconf-<VERSION>.spec
@end example

If the build completes successfully, RPMS like the following will be
generated in a build-host architecture specific subdirectory of the RPMs
directory under the RPM root directory.

@example
@value{RTEMSRPMPREFIX}rtems@value{RTEMSAPI}-autoconf-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@end example

@b{NOTE}:  It may be necessary to remove the build tree in the @code{BUILD}
directory under the RPM root directory.

@c
@c  Building AUTOMAKE using RPM
@c
@subsection Building AUTOMAKE using RPM

This section illustrates the invocation of RPM to build a new, locally
compiled, AUTOMAKE binary RPM that matches the installed source RPM.
This example assumes that all of the required source is installed.

@example
rpm -U @value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-automake-<VERSION>-<RPM_RELEASE>.src.rpm
@end example

@example
cd <RPM_ROOT_DIRECTORY>/SPECS
rpm -bb i386-rtems@value{RTEMSAPI}-automake-<VERSION>.spec
@end example

If the build completes successfully, RPMS like the following will be
generated in a build-host architecture specific subdirectory of the RPMs
directory under the RPM root directory.

@example
@value{RTEMSRPMPREFIX}rtems@value{RTEMSAPI}-automake-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@end example

@b{NOTE}:  It may be necessary to remove the build tree in the @code{BUILD}
directory under the RPM root directory.


@c
@c  Building BINUTILS using RPM
@c
@subsection Building BINUTILS using RPM

This section illustrates the invocation of RPM to build a new, locally
compiled, binutils binary RPM that matches the installed source RPM.
This example assumes that all of the required source is installed.

@example
rpm -U @value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-binutils-<VERSION>-<RPM_RELEASE>.src.rpm
@end example

@example
cd <RPM_ROOT_DIRECTORY>/SPECS
rpm -bb i386-rtems@value{RTEMSAPI}-binutils-<VERSION>.spec
@end example

If the build completes successfully, RPMS like the following will be
generated in a build-host architecture specific subdirectory of the RPMS
directory under the RPM root directory.

@example
@value{RTEMSRPMPREFIX}binutils-common-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-binutils-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@end example

NOTE: It may be necessary to remove the build tree in the @code{BUILD}
directory under the RPM root directory.

@c
@c  Building GCC and NEWLIB using RPM
@c
@subsection Building GCC and NEWLIB using RPM

This section illustrates the invocation of RPM to build a new,
locally compiled, set of GCC and NEWLIB binary RPMs that match the
installed source RPM.  It is also necessary to install the BINUTILS
RPMs and place them in your PATH.  This example assumes that all of
the required source is installed.

@example
cd <RPM_ROOT_DIRECTORY>/SPECS
rpm -bb i386-rtems@value{RTEMSAPI}-gcc-<VERSION>.spec
@end example

If the build completes successfully, a set of RPMS like the following will
be generated in a build-host architecture specific subdirectory
of the RPMS directory under the RPM root directory.

@example
@value{RTEMSRPMPREFIX}gcc-common-<VERSION>-<RPM>.<DIST>.noarch.rpm \
@value{RTEMSRPMPREFIX}newlib-common-<VERSION>-<RPM>.<DIST>.noarch.rpm \
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-gcc-<VERSION>-<RPM>.<ARCH>.rpm \
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-newlib-<VERSION>-<RPM>.<ARCH>.rpm \
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-libgcc-<VERSION>-<RPM>.<ARCH>.rpm \
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-gcc-c++-<VERSION>-<RPM>.<ARCH>.rpm \
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-libstd++-<VERSION>-<RPM>.<ARCH>.rpm
@end example

@b{NOTE}: Some targets do not support building all languages.

@b{NOTE}: It may be necessary to remove the build tree in the
@code{BUILD} directory under the RPM root directory.

@c
@c Building the GDB using RPM
@c
@subsection Building the GDB using RPM

The following example illustrates the invocation of RPM to build a new,
locally compiled, binutils binary RPM that matches the installed source
RPM.  This example assumes that all of the required source is installed.


@example
rpm -U @value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-gdb-<VERSION>-<RPM_RELEASE>.src.rpm
@end example

@example
cd <RPM_ROOT_DIRECTORY>/SPECS
rpm -bb i386-rtems@value{RTEMSAPI}-gdb-<VERSION>.spec
@end example

If the build completes successfully, RPMS like the following will
be generated in a build-host architecture specific subdirectory
of the RPMS directory under the RPM root directory.

@example
@value{RTEMSRPMPREFIX}gdb-common-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@value{RTEMSRPMPREFIX}i386-rtems@value{RTEMSAPI}-gdb-<VERSION>-<RPM_RELEASE>.<ARCH>.rpm
@end example

@b{NOTE}: It may be necessary to remove the build tree in the
@code{BUILD} directory under the RPM root directory.

@c
@c Common Problems
@c

@section Common Problems

@subsection Error Message Indicates Invalid Option to Assembler

If a message like this is printed then the new cross compiler
is most likely using the native assembler instead of the cross
assembler or vice-versa (native compiler using new cross assembler).
This can occur for one of the following reasons:

@itemize @bullet

@item Binutils Patch Improperly Applied
@item Binutils Not Built
@item Current Directory is in Your PATH

@end itemize

If you are using binutils 2.9.1 or newer with certain older versions of
gcc, they do not agree on what the name of the newly
generated cross assembler is.  Older binutils called it @code{as.new}
which became @code{as.new.exe} under Windows.  This is not a valid
file name, so @code{as.new} is now called @code{as-new}.  By using the latest
released tool versions and RTEMS patches, this problem will be avoided.

If binutils did not successfully build the cross assembler, then
the new cross gcc (@code{xgcc}) used to build the libraries can not
find it.  Make sure the build of the binutils succeeded.

If you include the current directory in your PATH, then there
is a chance that the native compiler will accidentally use
the new cross assembler instead of the native one.  This usually
indicates that "." is before the standard system directories
in your PATH.  As a general rule, including "." in your PATH
is a security risk and should be avoided.  Remove "." from
your PATH.

@b{NOTE}:  In some environments, it may be difficult to remove "."
completely from your PATH.  In this case, make sure that "."
is after the system directories containing "as" and "ld".

@subsection Error Messages Indicating Configuration Problems

If you see error messages like the following,

@itemize @bullet

@item cannot configure libiberty
@item coff-emulation not found
@item etc.

@end itemize

Then it is likely that one or more of your gnu tools is
already configured locally in its source tree.  You can check
for this by searching for the @code{config.status} file
in the various tool source trees.  The following command
does this for the binutils source:

@example
find binutils-<VERSION> -name config.status -print
@end example

The solution for this is to execute the command
@code{make distclean} in each of the GNU tools
root source directory.  This should remove all
generated files including Makefiles.

This situation usually occurs when you have previously
built the tool source for some non-RTEMS target.  The
generated configuration specific files are still in
the source tree and the include path specified during
the RTEMS build accidentally picks up the previous
configuration.  The include path used is something like
this:

@example
-I../../binutils-<VERSION>/gcc -I/binutils-<VERSION>/gcc/include -I.
@end example

Note that the tool source directory is searched before the
build directory.

This situation can be avoided entirely by never using
the source tree as the build directory.