Introduction to GNAT
GNAT is a part of GCC. It is often called GCC-Ada because of
this. Not many packages depend on GNAT besides Wine-9.21, although some packages optionally
depend on it.
GNAT Dependencies
Required
Binary
GNAT
Optional
GDB,
Graphviz
(some tests use it if installed; note that if it's installed but
not built with libpng-1.6.44 these tests will fail), and
Valgrind (for tests)
Note
This may take a while to build. Feel free to do something else
while this is building.
Installation of GNAT
Important
Even if you specify only languages other than Ada, C, and C++ to
the ./configure command below, the installation process will
overwrite your existing GCC C and C++ compilers and libraries.
Running the full suite of tests is recommended.
Do not continue with the make
install command until you are confident the build
was successful. You can compare your test results with those
found at https://gcc.gnu.org/ml/gcc-testresults/.
You may also want to refer to the information found in the GCC
section of Chapter 8 in the LFS book (https://www.linuxfromscratch.org/lfs/view/development/chapter08/gcc.html).
Normal Installation of GNAT
Warning
If you are doing multilib, under no circumstance should you
follow the instructions immediately below or else you will lose
multilib support in GCC. Skip
to the Multilib GNAT section.
The instructions below are intentionally performing a “bootstrap”
process. Bootstrapping is needed for robustness and is highly
recommended when upgrading the compilers version. To disable
bootstrap anyway, add --disable-bootstrap
to the
./configure options
below.
Install GNAT by running the
following commands:
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac &&
mkdir build &&
cd build &&
../configure \
--prefix=/usr \
--disable-multilib \
--with-system-zlib \
--enable-default-pie \
--enable-default-ssp \
--disable-fixincludes \
--enable-languages=ada,c,c++ &&
make
If running tests, as in LFS, remove/fix several known test
failures:
sed -e '/cpython/d' -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp &&
sed -e 's/no-pic /&-no-pie /' -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c &&
sed -e 's/300000/(1|300000)/' -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c &&
sed -e 's/{ target nonpic } //' \
-e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c
If you have installed additional packages such as valgrind and gdb , the gcc part of the test suite will run more
tests than in LFS. Some of those will report FAIL and others
XPASS (pass when expected to FAIL). As of gcc-14.2.0, about 74
FAIL occur in the “guality” suite, as well as miscellaneous
failures throughout the rest of the test suite. If all the
compilers above are built, there will be a little over 110
unexpected failures out of over 617,000 tests. To run the tests,
issue:
ulimit -s 32768 &&
make -k check
The tests are very long, and the results may be hard to find in
the logs, specially if you use parallel jobs with make. You can
get a summary of the tests with:
../contrib/test_summary
Now, as the root
user:
make install &&
mkdir -pv /usr/share/gdb/auto-load/usr/lib &&
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib &&
chown -v -R root:root \
/usr/lib/gcc/*linux-gnu/14.2.0/include{,-fixed} \
/usr/lib/gcc/*linux-gnu/14.2.0/ada{lib,include} &&
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/14.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
Multilib Installation of GNAT
The instructions below are intentionally performing a “bootstrap”
process. Bootstrapping is needed for robustness and is highly
recommended when upgrading the compilers version. To disable
bootstrap anyway, add --disable-bootstrap
to the
./configure options
below.
Make -mstackrealign
a default for
32-bit objects:
sed '/STACK_REALIGN_DEFAULT/s/0/(!TARGET_64BIT \&\& TARGET_SSE)/' \
-i gcc/config/i386/i386.h
Install Multilib GNAT by running
the following commands:
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac &&
mkdir build &&
cd build &&
../configure \
--prefix=/usr \
--enable-multilib \
--with-multilib-list=m64,m32 \
--with-system-zlib \
--enable-default-pie \
--enable-default-ssp \
--disable-fixincludes \
--enable-languages=ada,c,c++ &&
make
If running tests, as in LFS, remove/fix several known test
failures:
sed -e '/cpython/d' -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp &&
sed -e 's/no-pic /&-no-pie /' -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c &&
sed -e 's/300000/(1|300000)/' -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c &&
sed -e 's/{ target nonpic } //' \
-e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c
If you have installed additional packages such as valgrind and gdb , the gcc part of the test suite will run more
tests than in LFS. Some of those will report FAIL and others
XPASS (pass when expected to FAIL). As of gcc-14.2.0, about 74
FAIL occur in the “guality” suite, as well as miscellaneous
failures throughout the rest of the test suite. If all the
compilers above are built, there will be a little over 110
unexpected failures out of over 617,000 tests. To run the tests,
issue:
ulimit -s 32768 &&
make -k check
The tests are very long, and the results may be hard to find in
the logs, specially if you use parallel jobs with make. You can
get a summary of the tests with:
../contrib/test_summary
Now, as the root
user:
make install &&
mkdir -pv /usr/share/gdb/auto-load/usr/lib &&
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib &&
chown -v -R root:root \
/usr/lib/gcc/*linux-gnu/14.2.0/include{,-fixed} \
/usr/lib/gcc/*linux-gnu/14.2.0/ada{lib,include} &&
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/14.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
Cleaning Up and Testing
Now that GNAT has been installed,
it is time to clean up and test your installation to make sure
everything is working as expected.
Remove the binary installation that was installed earlier as the
root
user:
rm -rf /opt/gnat*
Now as the regular user, restore the PATH
variable to what it was beforehand:
export PATH=$PATH_HOLD &&
unset PATH_HOLD
Now it's time to test the installation. First confirm that the C
and C++ compilers are working correctly:
echo "int main(){}" >> main.c &&
cp -v main.c main.cpp &&
gcc main.c &&
./a.out &&
rm -v a.out &&
g++ main.cpp &&
./a.out &&
rm -v a.out main.{c,cpp}
If you're doing multilib:
echo "int main(){}" >> main.c &&
cp -v main.c main.cpp &&
gcc -m32 main.c &&
./a.out &&
rm -v a.out &&
g++ -m32 main.cpp &&
./a.out &&
rm -v a.out main.{c,cpp}
And finally, test the GNAT compiler:
cat >> testgnat.adb << "EOF" &&
with Ada.Text_IO; use Ada.Text_IO;
procedure Testgnat is
begin
Put_Line("Success!");
end Testgnat;
EOF
gnatmake testgnat.adb &&
./testgnat &&
rm -v testgnat*
The commands above should have no errors, otherwise something went
wrong with the installation.
Command Explanations
mkdir build; cd
build: The GCC
documentation recommends building the package in a dedicated build
directory.
--disable-multilib
: This
parameter ensures that files are created for the specific
architecture of your computer.
--enable-multilib
: This
parameter ensures that files are created for both 32-bit and 64-bit
despite computer architecture.
--with-system-zlib
: Uses
the system zlib instead of the
bundled one. zlib is used for
compressing and decompressing GCC's intermediate language in LTO (Link Time
Optimization) object files.
--enable-default-pie
: Makes
the -fpie
option the default when
compiling programs. Together with the ASLR feature enabled in the kernel, this
defeats some kind of attacks based on known memory layouts.
--enable-default-ssp
: Makes
the -fstack-protector-strong
option the
default when compiling programs. SSP is a technique preventing alteration of
the program flow by corrupting the parameter stack.
--enable-languages=ada,c,c++
: This
command builds support for ADA, C, and C++. Refer to https://www.linuxfromscratch.org/blfs/view/svn/general/gcc.html
to find what other languages are supported. Make sure to add
ada
to the option if you
recompile GCC.
ulimit -s 32768: This
command prevents several tests from running out of stack space.
make -k check: This
command runs the test suite without stopping if any errors are
encountered.
../contrib/test_summary: This
command will produce a summary of the test suite results. You can
append | grep -A7
Summ to the command to produce an even more
condensed version of the summary. You may also wish to redirect the
output to a file for review and comparison later on.
mv -v /usr/lib/*gdb.py
...: The installation stage puts some files used by
gdb under the /usr/lib
directory. This generates spurious error
messages when performing ldconfig. This command moves the
files to another location.
chown -v -R root:root
/usr/lib/gcc/*linux-gnu/...: If the package is
built by a user other than root, the ownership of the installed
include
directory (and its content)
will be incorrect. This command changes the ownership to the
root
user and group.
--enable-host-shared
--enable-languages=jit
: Build libgccjit
, a library for embedding GCC inside
programs and libraries for generating machine code. Despite
“JIT”
(just-in-time) in the name, the library can be used for AOT
(ahead-of-time) compilation as well. --enable-host-shared
is needed for building
libgccjit
, but it significantly
slows down GCC. So libgccjit
should
be built and installed separately, not as a part of the
“main” GCC
installation. If you need this library, configure GCC with these
two options and install the library by running make -C gcc jit.install-common
jit.install-info as the root
user. This library is not used by any BLFS
package, nor tested by the BLFS developers.
Contents
Installed Programs:
gnat, gnatbind, gnatchop, gnatclean,
gnatfind, gnatkr, gnatlink, gnatls, gnatmake, gnatname,
gnatprep, gnatxref
Installed Libraries:
libgnarl.{so,a}, libgnat.{so,a} in
/usr/lib/gcc/<arch-triplet>/14.2.0/adalib
Installed Directories:
/usr/lib/gcc/<arch-triplet>/14.2.0/ada{include,lib}
and
/usr/lib/gcc/<arch-triplet>/14.2.0/plugin/include/ada
Only the Ada specific files are listed here. Others can be found at
https://www.linuxfromscratch.org/lfs/view/stable/chapter08/gcc.html#contents-gcc
as they were initially installed during the building of LFS.
Short Descriptions
gnat
|
is a wrapper that accepts a number of commands and calls
the corresponding tool from the list below.
|
gnatbind
|
is used to bind compiled objects.
|
gnatchop
|
is useful for renaming files to meet the standard
Ada default file naming
conventions.
|
gnatclean
|
is used to remove files associated with a GNAT project.
|
gnatfind
|
is intended for locating definition and/or references to
specified entities in a GNAT project.
|
gnatkr
|
is used to determine the crunched name for a given file,
when crunched to a specified maximum length.
|
gnatlink
|
is used to link programs and build an executable file.
|
gnatls
|
is the compiled unit browser.
|
gnatmake
|
is the Ada compiler,
which performs compilation, binding and linking.
|
gnatname
|
will list the files associated with a GNAT project.
|
gnatprep
|
is the GNAT external
preprocessor.
|
gnatxref
|
is similar to gnatfind, but generates
a full report of all cross-references.
|