GNAT-14.2.0

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]

Note

This may take a while to build. Feel free to do something else while this is building.

Installation of GNAT

[Important]

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]

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.