.. role:: switch(samp)

.. |with| replace:: *with*
.. |withs| replace:: *with*\ s
.. |withed| replace:: *with*\ ed
.. |withing| replace:: *with*\ ing

.. -- Example: A |withing| unit has a |with| clause, it |withs| a |withed| unit


.. _The_GNAT_Compilation_Model:

**************************
The GNAT Compilation Model
**************************

.. index:: ! GNAT compilation model

.. index:: Compilation model

This chapter describes the compilation model used by GNAT. Although
similar to that used by other languages such as C and C++, this model
is substantially different from the traditional Ada compilation models,
which are based on a centralized program library. The chapter covers
the following material:

* Topics related to source file makeup and naming

  * :ref:`Source_Representation`
  * :ref:`Foreign_Language_Representation`
  * :ref:`File_Naming_Topics_and_Utilities`

* :ref:`Configuration_Pragmas`
* :ref:`Generating_Object_Files`
* :ref:`Source_Dependencies`
* :ref:`The_Ada_Library_Information_Files`
* :ref:`Binding_an_Ada_Program`
* :ref:`GNAT_and_Libraries`
* :ref:`Conditional_Compilation`
* :ref:`Mixed_Language_Programming`
* :ref:`GNAT_and_Other_Compilation_Models`
* :ref:`Using_GNAT_Files_with_External_Tools`


.. _Source_Representation:

Source Representation
=====================

.. index:: Latin-1

.. index:: VT, HT, CR, LF, FF

Ada source programs are represented in standard text files, using
Latin-1 coding. Latin-1 is an 8-bit code that includes the familiar
7-bit ASCII set, plus additional characters used for
representing foreign languages (see :ref:`Foreign_Language_Representation`
for support of non-USA character sets). The format effector characters
are represented using their standard ASCII encodings, as follows:

    =========== ======================= ===========
     Character          Effect           Code
    ----------- ----------------------- -----------
    :kbd:`VT`    Vertical tab            ``16#0B#``
    :kbd:`HT`    Horizontal tab          ``16#09#``
    :kbd:`CR`    Carriage return         ``16#0D#``
    :kbd:`LF`    Line feed               ``16#0A#``
    :kbd:`FF`    Form feed               ``16#0C#``
    =========== ======================= ===========

Source files are in standard text file format. In addition, GNAT will
recognize a wide variety of stream formats, in which the end of
physical lines is marked by any of the following sequences:
``LF``, ``CR``, ``CR-LF``, or ``LF-CR``. This is useful
in accommodating files that are imported from other operating systems.

.. index:: pair: End of source file; Source file, end

.. index:: SUB (control character)

The end of a source file is normally represented by the physical end of
file. However, the control character ``16#1A#`` (:kbd:`SUB`) is also
recognized as signalling the end of the source file. Again, this is
provided for compatibility with other operating systems where this
code is used to represent the end of file.

.. index:: spec (definition), compilation (definition)

Each file contains a single Ada compilation unit, including any pragmas
associated with the unit. For example, this means you must place a
package declaration (a package *spec*) and the corresponding body in
separate files. An Ada *compilation* (which is a sequence of
compilation units) is represented using a sequence of files. Similarly,
you will place each subunit or child unit in a separate file.

.. _Foreign_Language_Representation:

Foreign Language Representation
===============================

GNAT supports the standard character sets defined in Ada as well as
several other non-standard character sets for use in localized versions
of the compiler (:ref:`Character_Set_Control`).

.. _Latin-1:

Latin-1
-------

.. index:: Latin-1

The basic character set is Latin-1. This character set is defined by ISO
standard 8859, part 1. The lower half (character codes ``16#00#``
... ``16#7F#)`` is identical to standard ASCII coding, but the upper
half is used to represent additional characters. These include extended letters
used by European languages, such as French accents, the vowels with umlauts
used in German, and the extra letter A-ring used in Swedish.

.. index:: Ada.Characters.Latin_1

For a complete list of Latin-1 codes and their encodings, see the source
file of library unit ``Ada.Characters.Latin_1`` in file
:file:`a-chlat1.ads`.
You may use any of these extended characters freely in character or
string literals. In addition, the extended characters that represent
letters can be used in identifiers.

.. _Other_8-Bit_Codes:

Other 8-Bit Codes
-----------------

GNAT also supports several other 8-bit coding schemes:


.. index:: Latin-2
.. index:: ISO 8859-2

*ISO 8859-2 (Latin-2)*
  Latin-2 letters allowed in identifiers, with uppercase and lowercase
  equivalence.

.. index:: Latin-3
.. index:: ISO 8859-3

*ISO 8859-3 (Latin-3)*
  Latin-3 letters allowed in identifiers, with uppercase and lowercase
  equivalence.


.. index:: Latin-4
.. index:: ISO 8859-4

*ISO 8859-4 (Latin-4)*
  Latin-4 letters allowed in identifiers, with uppercase and lowercase
  equivalence.


.. index:: ISO 8859-5
.. index:: Cyrillic

*ISO 8859-5 (Cyrillic)*
  ISO 8859-5 letters (Cyrillic) allowed in identifiers, with uppercase and
  lowercase equivalence.

.. index:: ISO 8859-15
.. index:: Latin-9

*ISO 8859-15 (Latin-9)*
  ISO 8859-15 (Latin-9) letters allowed in identifiers, with uppercase and
  lowercase equivalence

.. index:: code page 437 (IBM PC)

*IBM PC (code page 437)*
  This code page is the normal default for PCs in the U.S. It corresponds
  to the original IBM PC character set. This set has some, but not all, of
  the extended Latin-1 letters, but these letters do not have the same
  encoding as Latin-1. In this mode, these letters are allowed in
  identifiers with uppercase and lowercase equivalence.

.. index:: code page 850 (IBM PC)

*IBM PC (code page 850)*
  This code page is a modification of 437 extended to include all the
  Latin-1 letters, but still not with the usual Latin-1 encoding. In this
  mode, all these letters are allowed in identifiers with uppercase and
  lowercase equivalence.


*Full Upper 8-bit*
  Any character in the range 80-FF allowed in identifiers, and all are
  considered distinct. In other words, there are no uppercase and lowercase
  equivalences in this range. This is useful in conjunction with
  certain encoding schemes used for some foreign character sets (e.g.,
  the typical method of representing Chinese characters on the PC).


*No Upper-Half*
  No upper-half characters in the range 80-FF are allowed in identifiers.
  This gives Ada 83 compatibility for identifier names.

For precise data on the encodings permitted, and the uppercase and lowercase
equivalences that are recognized, see the file :file:`csets.adb` in
the GNAT compiler sources. You will need to obtain a full source release
of GNAT to obtain this file.

.. _Wide_Character_Encodings:

Wide_Character Encodings
------------------------

GNAT allows wide character codes to appear in character and string
literals, and also optionally in identifiers, by means of the following
possible encoding schemes:

*Hex Coding*
  In this encoding, a wide character is represented by the following five
  character sequence::

    ESC a b c d

  where ``a``, ``b``, ``c``, ``d`` are the four hexadecimal
  characters (using uppercase letters) of the wide character code. For
  example, ESC A345 is used to represent the wide character with code
  ``16#A345#``.
  This scheme is compatible with use of the full Wide_Character set.

*Upper-Half Coding*
  .. index:: Upper-Half Coding

  The wide character with encoding ``16#abcd#`` where the upper bit is on
  (in other words, 'a' is in the range 8-F) is represented as two bytes,
  ``16#ab#`` and ``16#cd#``. The second byte cannot be a format control
  character, but is not required to be in the upper half. This method can
  be also used for shift-JIS or EUC, where the internal coding matches the
  external coding.

*Shift JIS Coding*
  .. index:: Shift JIS Coding

  A wide character is represented by a two-character sequence,
  ``16#ab#`` and
  ``16#cd#``, with the restrictions described for upper-half encoding as
  described above. The internal character code is the corresponding JIS
  character according to the standard algorithm for Shift-JIS
  conversion. Only characters defined in the JIS code set table can be
  used with this encoding method.


*EUC Coding*
  .. index:: EUC Coding

  A wide character is represented by a two-character sequence
  ``16#ab#`` and
  ``16#cd#``, with both characters being in the upper half. The internal
  character code is the corresponding JIS character according to the EUC
  encoding algorithm. Only characters defined in the JIS code set table
  can be used with this encoding method.


*UTF-8 Coding*
  A wide character is represented using
  UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
  10646-1/Am.2. Depending on the character value, the representation
  is a one, two, or three byte sequence::

    16#0000#-16#007f#: 2#0xxxxxxx#
    16#0080#-16#07ff#: 2#110xxxxx# 2#10xxxxxx#
    16#0800#-16#ffff#: 2#1110xxxx# 2#10xxxxxx# 2#10xxxxxx#

  where the ``xxx`` bits correspond to the left-padded bits of the
  16-bit character value. Note that all lower half ASCII characters
  are represented as ASCII bytes and all upper half characters and
  other wide characters are represented as sequences of upper-half
  (The full UTF-8 scheme allows for encoding 31-bit characters as
  6-byte sequences, and in the following section on wide wide
  characters, the use of these sequences is documented).


*Brackets Coding*
  In this encoding, a wide character is represented by the following eight
  character sequence::

    [ " a b c d " ]

  where ``a``, ``b``, ``c``, ``d`` are the four hexadecimal
  characters (using uppercase letters) of the wide character code. For
  example, ['A345'] is used to represent the wide character with code
  ``16#A345#``. It is also possible (though not required) to use the
  Brackets coding for upper half characters. For example, the code
  ``16#A3#`` can be represented as ``['A3']``.

  This scheme is compatible with use of the full Wide_Character set,
  and is also the method used for wide character encoding in some standard
  ACATS (Ada Conformity Assessment Test Suite) test suite distributions.

.. note::

  Some of these coding schemes do not permit the full use of the
  Ada character set. For example, neither Shift JIS nor EUC allow the
  use of the upper half of the Latin-1 set.

.. _Wide_Wide_Character_Encodings:

Wide_Wide_Character Encodings
-----------------------------

GNAT allows wide wide character codes to appear in character and string
literals, and also optionally in identifiers, by means of the following
possible encoding schemes:

*UTF-8 Coding*
  A wide character is represented using
  UCS Transformation Format 8 (UTF-8) as defined in Annex R of ISO
  10646-1/Am.2. Depending on the character value, the representation
  of character codes with values greater than 16#FFFF# is a
  is a four, five, or six byte sequence::

    16#01_0000#-16#10_FFFF#:     11110xxx 10xxxxxx 10xxxxxx
                                 10xxxxxx
    16#0020_0000#-16#03FF_FFFF#: 111110xx 10xxxxxx 10xxxxxx
                                 10xxxxxx 10xxxxxx
    16#0400_0000#-16#7FFF_FFFF#: 1111110x 10xxxxxx 10xxxxxx
                                 10xxxxxx 10xxxxxx 10xxxxxx


  where the ``xxx`` bits correspond to the left-padded bits of the
  32-bit character value.

*Brackets Coding*
  In this encoding, a wide wide character is represented by the following ten or
  twelve byte character sequence::

    [ " a b c d e f " ]
    [ " a b c d e f g h " ]

  where ``a-h`` are the six or eight hexadecimal
  characters (using uppercase letters) of the wide wide character code. For
  example, ["1F4567"] is used to represent the wide wide character with code
  ``16#001F_4567#``.

  This scheme is compatible with use of the full Wide_Wide_Character set,
  and is also the method used for wide wide character encoding in some standard
  ACATS (Ada Conformity Assessment Test Suite) test suite distributions.


.. _File_Naming_Topics_and_Utilities:

File Naming Topics and Utilities
================================

GNAT has a default file naming scheme and also provides the user with
a high degree of control over how the names and extensions of the
source files correspond to the Ada compilation units that they contain.


.. _File_Naming_Rules:

File Naming Rules
-----------------

The default file name is determined by the name of the unit that the
file contains. The name is formed by taking the full expanded name of
the unit and replacing the separating dots with hyphens and using
lowercase for all letters.

An exception arises if the file name generated by the above rules starts
with one of the characters
``a``, ``g``, ``i``, or ``s``, and the second character is a
minus. In this case, the character tilde is used in place
of the minus. The reason for this special rule is to avoid clashes with
the standard names for child units of the packages System, Ada,
Interfaces, and GNAT, which use the prefixes
``s-``, ``a-``, ``i-``, and ``g-``,
respectively.

The file extension is :file:`.ads` for a spec and
:file:`.adb` for a body. The following table shows some
examples of these rules.

   ============================ ===============================
   Source File                   Ada Compilation Unit
   ---------------------------- -------------------------------
   :file:`main.ads`              Main (spec)
   :file:`main.adb`              Main (body)
   :file:`arith_functions.ads`   Arith_Functions (package spec)
   :file:`arith_functions.adb`   Arith_Functions (package body)
   :file:`func-spec.ads`         Func.Spec (child package spec)
   :file:`func-spec.adb`         Func.Spec (child package body)
   :file:`main-sub.adb`          Sub (subunit of Main)
   :file:`a~bad.adb`             A.Bad (child package body)
   ============================ ===============================

Following these rules can result in excessively long
file names if corresponding
unit names are long (for example, if child units or subunits are
heavily nested). An option is available to shorten such long file names
(called file name 'krunching'). This may be particularly useful when
programs being developed with GNAT are to be used on operating systems
with limited file name lengths. :ref:`Using_gnatkr`.

Of course, no file shortening algorithm can guarantee uniqueness over
all possible unit names; if file name krunching is used, it is your
responsibility to ensure no name clashes occur. Alternatively you
can specify the exact file names that you want used, as described
in the next section. Finally, if your Ada programs are migrating from a
compiler with a different naming convention, you can use the gnatchop
utility to produce source files that follow the GNAT naming conventions.
(For details see :ref:`Renaming_Files_with_gnatchop`.)

Note: in the case of Windows or Mac OS operating systems, case is not
significant. So for example on Windows if the canonical name is
:file:`main-sub.adb`, you can use the file name :file:`Main-Sub.adb` instead.
However, case is significant for other operating systems, so for example,
if you want to use other than canonically cased file names on a Unix system,
you need to follow the procedures described in the next section.

.. _Using_Other_File_Names:

Using Other File Names
----------------------

.. index:: File names

In the previous section, we have described the default rules used by
GNAT to determine the file name in which a given unit resides. It is
often convenient to follow these default rules, and if you follow them,
the compiler knows without being explicitly told where to find all
the files it needs.

.. index:: Source_File_Name pragma

However, in some cases, particularly when a program is imported from
another Ada compiler environment, it may be more convenient for the
programmer to specify which file names contain which units. GNAT allows
arbitrary file names to be used by means of the Source_File_Name pragma.
The form of this pragma is as shown in the following examples:

.. code-block:: ada

      pragma Source_File_Name (My_Utilities.Stacks,
        Spec_File_Name => "myutilst_a.ada");
      pragma Source_File_name (My_Utilities.Stacks,
        Body_File_Name => "myutilst.ada");

As shown in this example, the first argument for the pragma is the unit
name (in this example a child unit). The second argument has the form
of a named association. The identifier
indicates whether the file name is for a spec or a body;
the file name itself is given by a string literal.

The source file name pragma is a configuration pragma, which means that
normally it will be placed in the :file:`gnat.adc`
file used to hold configuration
pragmas that apply to a complete compilation environment.
For more details on how the :file:`gnat.adc` file is created and used
see :ref:`Handling_of_Configuration_Pragmas`.

.. index:: gnat.adc

GNAT allows completely arbitrary file names to be specified using the
source file name pragma. However, if the file name specified has an
extension other than :file:`.ads` or :file:`.adb` it is necessary to use
a special syntax when compiling the file. The name in this case must be
preceded by the special sequence ``-x`` followed by a space and the name
of the language, here ``ada``, as in:

.. code-block:: sh

     $ gcc -c -x ada peculiar_file_name.sim

``gnatmake`` handles non-standard file names in the usual manner (the
non-standard file name for the main program is simply used as the
argument to gnatmake). Note that if the extension is also non-standard,
then it must be included in the ``gnatmake`` command, it may not
be omitted.

.. _Alternative_File_Naming_Schemes:

Alternative File Naming Schemes
-------------------------------

.. index:: File naming schemes, alternative

.. index:: File names

The previous section described the use of the ``Source_File_Name``
pragma to allow arbitrary names to be assigned to individual source files.
However, this approach requires one pragma for each file, and especially in
large systems can result in very long :file:`gnat.adc` files, and also create
a maintenance problem.

.. index:: Source_File_Name pragma

GNAT also provides a facility for specifying systematic file naming schemes
other than the standard default naming scheme previously described. An
alternative scheme for naming is specified by the use of
``Source_File_Name`` pragmas having the following format:

.. code-block:: ada

     pragma Source_File_Name (
        Spec_File_Name  => FILE_NAME_PATTERN
      [ , Casing          => CASING_SPEC]
      [ , Dot_Replacement => STRING_LITERAL ] );

     pragma Source_File_Name (
        Body_File_Name  => FILE_NAME_PATTERN
      [ , Casing          => CASING_SPEC ]
      [ , Dot_Replacement => STRING_LITERAL ] ) ;

     pragma Source_File_Name (
        Subunit_File_Name  => FILE_NAME_PATTERN
      [ , Casing          => CASING_SPEC ]
      [ , Dot_Replacement => STRING_LITERAL ] ) ;

     FILE_NAME_PATTERN ::= STRING_LITERAL
     CASING_SPEC ::= Lowercase | Uppercase | Mixedcase

The ``FILE_NAME_PATTERN`` string shows how the file name is constructed.
It contains a single asterisk character, and the unit name is substituted
systematically for this asterisk. The optional parameter
``Casing`` indicates
whether the unit name is to be all upper-case letters, all lower-case letters,
or mixed-case. If no
``Casing`` parameter is used, then the default is all
lower-case.

The optional ``Dot_Replacement`` string is used to replace any periods
that occur in subunit or child unit names. If no ``Dot_Replacement``
argument is used then separating dots appear unchanged in the resulting
file name.
Although the above syntax indicates that the
``Casing`` argument must appear
before the ``Dot_Replacement`` argument, but it
is also permissible to write these arguments in the opposite order.

As indicated, it is possible to specify different naming schemes for
bodies, specs, and subunits. Quite often the rule for subunits is the
same as the rule for bodies, in which case, there is no need to give
a separate ``Subunit_File_Name`` rule, and in this case the
``Body_File_name`` rule is used for subunits as well.

The separate rule for subunits can also be used to implement the rather
unusual case of a compilation environment (e.g., a single directory) which
contains a subunit and a child unit with the same unit name. Although
both units cannot appear in the same partition, the Ada Reference Manual
allows (but does not require) the possibility of the two units coexisting
in the same environment.

The file name translation works in the following steps:

* If there is a specific ``Source_File_Name`` pragma for the given unit,
  then this is always used, and any general pattern rules are ignored.

* If there is a pattern type ``Source_File_Name`` pragma that applies to
  the unit, then the resulting file name will be used if the file exists. If
  more than one pattern matches, the latest one will be tried first, and the
  first attempt resulting in a reference to a file that exists will be used.

* If no pattern type ``Source_File_Name`` pragma that applies to the unit
  for which the corresponding file exists, then the standard GNAT default
  naming rules are used.

As an example of the use of this mechanism, consider a commonly used scheme
in which file names are all lower case, with separating periods copied
unchanged to the resulting file name, and specs end with :file:`.1.ada`, and
bodies end with :file:`.2.ada`. GNAT will follow this scheme if the following
two pragmas appear:

.. code-block:: ada

     pragma Source_File_Name
       (Spec_File_Name => ".1.ada");
     pragma Source_File_Name
       (Body_File_Name => ".2.ada");

The default GNAT scheme is actually implemented by providing the following
default pragmas internally:

.. code-block:: ada

     pragma Source_File_Name
       (Spec_File_Name => ".ads", Dot_Replacement => "-");
     pragma Source_File_Name
       (Body_File_Name => ".adb", Dot_Replacement => "-");

Our final example implements a scheme typically used with one of the
Ada 83 compilers, where the separator character for subunits was '__'
(two underscores), specs were identified by adding :file:`_.ADA`, bodies
by adding :file:`.ADA`, and subunits by
adding :file:`.SEP`. All file names were
upper case. Child units were not present of course since this was an
Ada 83 compiler, but it seems reasonable to extend this scheme to use
the same double underscore separator for child units.

.. code-block:: ada

     pragma Source_File_Name
       (Spec_File_Name => "_.ADA",
        Dot_Replacement => "__",
        Casing = Uppercase);
     pragma Source_File_Name
       (Body_File_Name => ".ADA",
        Dot_Replacement => "__",
        Casing = Uppercase);
     pragma Source_File_Name
       (Subunit_File_Name => ".SEP",
        Dot_Replacement => "__",
        Casing = Uppercase);


.. index:: ! gnatname

.. _Handling_Arbitrary_File_Naming_Conventions_with_gnatname:

Handling Arbitrary File Naming Conventions with ``gnatname``
------------------------------------------------------------

.. index:: File Naming Conventions

.. _Arbitrary_File_Naming_Conventions:

Arbitrary File Naming Conventions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The GNAT compiler must be able to know the source file name of a compilation
unit.  When using the standard GNAT default file naming conventions
(``.ads`` for specs, ``.adb`` for bodies), the GNAT compiler
does not need additional information.

When the source file names do not follow the standard GNAT default file naming
conventions, the GNAT compiler must be given additional information through
a configuration pragmas file (:ref:`Configuration_Pragmas`)
or a project file.
When the non-standard file naming conventions are well-defined,
a small number of pragmas ``Source_File_Name`` specifying a naming pattern
(:ref:`Alternative_File_Naming_Schemes`) may be sufficient. However,
if the file naming conventions are irregular or arbitrary, a number
of pragma ``Source_File_Name`` for individual compilation units
must be defined.
To help maintain the correspondence between compilation unit names and
source file names within the compiler,
GNAT provides a tool ``gnatname`` to generate the required pragmas for a
set of files.

.. _Running_gnatname:

Running ``gnatname``
^^^^^^^^^^^^^^^^^^^^

The usual form of the ``gnatname`` command is:

.. code-block:: sh

      $ gnatname [ switches ]  naming_pattern  [ naming_patterns ]
          [--and [ switches ]  naming_pattern  [ naming_patterns ]]


All of the arguments are optional. If invoked without any argument,
``gnatname`` will display its usage.

When used with at least one naming pattern, ``gnatname`` will attempt to
find all the compilation units in files that follow at least one of the
naming patterns. To find these compilation units,
``gnatname`` will use the GNAT compiler in syntax-check-only mode on all
regular files.

One or several Naming Patterns may be given as arguments to ``gnatname``.
Each Naming Pattern is enclosed between double quotes (or single
quotes on Windows).
A Naming Pattern is a regular expression similar to the wildcard patterns
used in file names by the Unix shells or the DOS prompt.

``gnatname`` may be called with several sections of directories/patterns.
Sections are separated by the switch :switch:`--and`. In each section, there must be
at least one pattern. If no directory is specified in a section, the current
directory (or the project directory if :switch:`-P` is used) is implied.
The options other that the directory switches and the patterns apply globally
even if they are in different sections.

Examples of Naming Patterns are::

     "*.[12].ada"
     "*.ad[sb]*"
     "body_*"    "spec_*"

For a more complete description of the syntax of Naming Patterns,
see the second kind of regular expressions described in :file:`g-regexp.ads`
(the 'Glob' regular expressions).

When invoked without the switch :switch:`-P`, ``gnatname`` will create a
configuration pragmas file :file:`gnat.adc` in the current working directory,
with pragmas ``Source_File_Name`` for each file that contains a valid Ada
unit.

.. _Switches_for_gnatname:

Switches for ``gnatname``
^^^^^^^^^^^^^^^^^^^^^^^^^

Switches for ``gnatname`` must precede any specified Naming Pattern.

You may specify any of the following switches to ``gnatname``:

.. index:: --version (gnatname)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.

.. index:: --help (gnatname)

:switch:`--help`
  If :switch:`--version` was not used, display usage, then exit disregarding
  all other options.

:switch:`--subdirs={dir}`
  Real object, library or exec directories are subdirectories <dir> of the
  specified ones.

:switch:`--no-backup`
  Do not create a backup copy of an existing project file.

:switch:`--and`
  Start another section of directories/patterns.

.. index:: -c (gnatname)

:switch:`-c{filename}`
  Create a configuration pragmas file :file:`filename` (instead of the default
  :file:`gnat.adc`).
  There may be zero, one or more space between :switch:`-c` and
  :file:`filename`.
  :file:`filename` may include directory information. :file:`filename` must be
  writable. There may be only one switch :switch:`-c`.
  When a switch :switch:`-c` is
  specified, no switch :switch:`-P` may be specified (see below).

.. index:: -d (gnatname)

:switch:`-d{dir}`
  Look for source files in directory :file:`dir`. There may be zero, one or more
  spaces between :switch:`-d` and :file:`dir`.
  :file:`dir` may end with ``/**``, that is it may be of the form
  ``root_dir/**``. In this case, the directory ``root_dir`` and all of its
  subdirectories, recursively, have to be searched for sources.
  When a switch :switch:`-d`
  is specified, the current working directory will not be searched for source
  files, unless it is explicitly specified with a :switch:`-d`
  or :switch:`-D` switch.
  Several switches :switch:`-d` may be specified.
  If :file:`dir` is a relative path, it is relative to the directory of
  the configuration pragmas file specified with switch
  :switch:`-c`,
  or to the directory of the project file specified with switch
  :switch:`-P` or,
  if neither switch :switch:`-c`
  nor switch :switch:`-P` are specified, it is relative to the
  current working directory. The directory
  specified with switch :switch:`-d` must exist and be readable.

.. index:: -D (gnatname)

:switch:`-D{filename}`
  Look for source files in all directories listed in text file :file:`filename`.
  There may be zero, one or more spaces between :switch:`-D`
  and :file:`filename`.
  :file:`filename` must be an existing, readable text file.
  Each nonempty line in :file:`filename` must be a directory.
  Specifying switch :switch:`-D` is equivalent to specifying as many
  switches :switch:`-d` as there are nonempty lines in
  :file:`file`.

:switch:`-eL`
  Follow symbolic links when processing project files.

  .. index:: -f (gnatname)

:switch:`-f{pattern}`
  Foreign patterns. Using this switch, it is possible to add sources of languages
  other than Ada to the list of sources of a project file.
  It is only useful if a -P switch is used.
  For example,

  .. code-block:: sh

     gnatname -Pprj -f"*.c" "*.ada"

  will look for Ada units in all files with the :file:`.ada` extension,
  and will add to the list of file for project :file:`prj.gpr` the C files
  with extension :file:`.c`.

  .. index:: -h (gnatname)

:switch:`-h`
  Output usage (help) information. The output is written to :file:`stdout`.

  .. index:: -P (gnatname)

:switch:`-P{proj}`
  Create or update project file :file:`proj`. There may be zero, one or more space
  between :switch:`-P` and :file:`proj`. :file:`proj` may include directory
  information. :file:`proj` must be writable.
  There may be only one switch :switch:`-P`.
  When a switch :switch:`-P` is specified,
  no switch :switch:`-c` may be specified.
  On all platforms, except on VMS, when ``gnatname`` is invoked for an
  existing project file <proj>.gpr, a backup copy of the project file is created
  in the project directory with file name <proj>.gpr.saved_x. 'x' is the first
  non negative number that makes this backup copy a new file.

  .. index:: -v (gnatname)

:switch:`-v`
  Verbose mode. Output detailed explanation of behavior to :file:`stdout`.
  This includes name of the file written, the name of the directories to search
  and, for each file in those directories whose name matches at least one of
  the Naming Patterns, an indication of whether the file contains a unit,
  and if so the name of the unit.

.. index:: -v -v (gnatname)

:switch:`-v -v`
  Very Verbose mode. In addition to the output produced in verbose mode,
  for each file in the searched directories whose name matches none of
  the Naming Patterns, an indication is given that there is no match.

  .. index:: -x (gnatname)

:switch:`-x{pattern}`
  Excluded patterns. Using this switch, it is possible to exclude some files
  that would match the name patterns. For example,

  .. code-block:: sh

      gnatname -x "*_nt.ada" "*.ada"

  will look for Ada units in all files with the :file:`.ada` extension,
  except those whose names end with :file:`_nt.ada`.


.. _Examples_of_gnatname_Usage:

Examples of ``gnatname`` Usage
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: sh

     $ gnatname -c /home/me/names.adc -d sources "[a-z]*.ada*"

In this example, the directory :file:`/home/me` must already exist
and be writable. In addition, the directory
:file:`/home/me/sources` (specified by
:switch:`-d sources`) must exist and be readable.

Note the optional spaces after :switch:`-c` and :switch:`-d`.

.. code-block:: sh

     $ gnatname -P/home/me/proj -x "*_nt_body.ada"
     -dsources -dsources/plus -Dcommon_dirs.txt "body_*" "spec_*"

Note that several switches :switch:`-d` may be used,
even in conjunction with one or several switches
:switch:`-D`. Several Naming Patterns and one excluded pattern
are used in this example.


.. _File_Name_Krunching_with_gnatkr:

File Name Krunching with ``gnatkr``
-----------------------------------

.. index:: ! gnatkr

This section discusses the method used by the compiler to shorten
the default file names chosen for Ada units so that they do not
exceed the maximum length permitted. It also describes the
``gnatkr`` utility that can be used to determine the result of
applying this shortening.

.. _About_gnatkr:

About ``gnatkr``
^^^^^^^^^^^^^^^^

The default file naming rule in GNAT
is that the file name must be derived from
the unit name. The exact default rule is as follows:

* Take the unit name and replace all dots by hyphens.

* If such a replacement occurs in the
  second character position of a name, and the first character is
  :samp:`a`, :samp:`g`, :samp:`s`, or :samp:`i`,
  then replace the dot by the character
  :samp:`~` (tilde)
  instead of a minus.

  The reason for this exception is to avoid clashes
  with the standard names for children of System, Ada, Interfaces,
  and GNAT, which use the prefixes
  :samp:`s-`, :samp:`a-`, :samp:`i-`, and :samp:`g-`,
  respectively.

The :switch:`-gnatk{nn}`
switch of the compiler activates a 'krunching'
circuit that limits file names to nn characters (where nn is a decimal
integer).

The ``gnatkr`` utility can be used to determine the krunched name for
a given file, when krunched to a specified maximum length.

.. _Using_gnatkr:

Using ``gnatkr``
^^^^^^^^^^^^^^^^

The ``gnatkr`` command has the form:

.. code-block:: sh

      $ gnatkr name [ length ]

``name`` is the uncrunched file name, derived from the name of the unit
in the standard manner described in the previous section (i.e., in particular
all dots are replaced by hyphens). The file name may or may not have an
extension (defined as a suffix of the form period followed by arbitrary
characters other than period). If an extension is present then it will
be preserved in the output. For example, when krunching :file:`hellofile.ads`
to eight characters, the result will be hellofil.ads.

Note: for compatibility with previous versions of ``gnatkr`` dots may
appear in the name instead of hyphens, but the last dot will always be
taken as the start of an extension. So if ``gnatkr`` is given an argument
such as :file:`Hello.World.adb` it will be treated exactly as if the first
period had been a hyphen, and for example krunching to eight characters
gives the result :file:`hellworl.adb`.

Note that the result is always all lower case.
Characters of the other case are folded as required.

``length`` represents the length of the krunched name. The default
when no argument is given is 8 characters. A length of zero stands for
unlimited, in other words do not chop except for system files where the
implied crunching length is always eight characters.

The output is the krunched name. The output has an extension only if the
original argument was a file name with an extension.

.. _Krunching_Method:

Krunching Method
^^^^^^^^^^^^^^^^

The initial file name is determined by the name of the unit that the file
contains. The name is formed by taking the full expanded name of the
unit and replacing the separating dots with hyphens and
using lowercase
for all letters, except that a hyphen in the second character position is
replaced by a tilde if the first character is
:samp:`a`, :samp:`i`, :samp:`g`, or :samp:`s`.
The extension is ``.ads`` for a
spec and ``.adb`` for a body.
Krunching does not affect the extension, but the file name is shortened to
the specified length by following these rules:

* The name is divided into segments separated by hyphens, tildes or
  underscores and all hyphens, tildes, and underscores are
  eliminated. If this leaves the name short enough, we are done.

* If the name is too long, the longest segment is located (left-most
  if there are two of equal length), and shortened by dropping
  its last character. This is repeated until the name is short enough.

  As an example, consider the krunching of :file:`our-strings-wide_fixed.adb`
  to fit the name into 8 characters as required by some operating systems::

      our-strings-wide_fixed 22
      our strings wide fixed 19
      our string  wide fixed 18
      our strin   wide fixed 17
      our stri    wide fixed 16
      our stri    wide fixe  15
      our str     wide fixe  14
      our str     wid  fixe  13
      our str     wid  fix   12
      ou  str     wid  fix   11
      ou  st      wid  fix   10
      ou  st      wi   fix   9
      ou  st      wi   fi    8
      Final file name: oustwifi.adb

* The file names for all predefined units are always krunched to eight
  characters. The krunching of these predefined units uses the following
  special prefix replacements:

  ===================== ==============
  Prefix                 Replacement
  --------------------- --------------
  :file:`ada-`           :file:`a-`
  :file:`gnat-`          :file:`g-`
  :file:`interfac es-`   :file:`i-`
  :file:`system-`        :file:`s-`
  ===================== ==============

  These system files have a hyphen in the second character position. That
  is why normal user files replace such a character with a
  tilde, to avoid confusion with system file names.

  As an example of this special rule, consider
  :file:`ada-strings-wide_fixed.adb`, which gets krunched as follows::

      ada-strings-wide_fixed 22
      a-  strings wide fixed 18
      a-  string  wide fixed 17
      a-  strin   wide fixed 16
      a-  stri    wide fixed 15
      a-  stri    wide fixe  14
      a-  str     wide fixe  13
      a-  str     wid  fixe  12
      a-  str     wid  fix   11
      a-  st      wid  fix   10
      a-  st      wi   fix   9
      a-  st      wi   fi    8
      Final file name: a-stwifi.adb

Of course no file shortening algorithm can guarantee uniqueness over all
possible unit names, and if file name krunching is used then it is your
responsibility to ensure that no name clashes occur. The utility
program ``gnatkr`` is supplied for conveniently determining the
krunched name of a file.

.. _Examples_of_gnatkr_Usage:

Examples of ``gnatkr`` Usage
^^^^^^^^^^^^^^^^^^^^^^^^^^^^

::

    $ gnatkr very_long_unit_name.ads      --> velounna.ads
    $ gnatkr grandparent-parent-child.ads --> grparchi.ads
    $ gnatkr Grandparent.Parent.Child.ads --> grparchi.ads
    $ gnatkr grandparent-parent-child     --> grparchi
    $ gnatkr very_long_unit_name.ads/count=6 --> vlunna.ads
    $ gnatkr very_long_unit_name.ads/count=0 --> very_long_unit_name.ads


.. _Renaming_Files_with_gnatchop:

Renaming Files with ``gnatchop``
--------------------------------

.. index:: ! gnatchop

This section discusses how to handle files with multiple units by using
the ``gnatchop`` utility. This utility is also useful in renaming
files to meet the standard GNAT default file naming conventions.

.. _Handling_Files_with_Multiple_Units:

Handling Files with Multiple Units
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The basic compilation model of GNAT requires that a file submitted to the
compiler have only one unit and there be a strict correspondence
between the file name and the unit name.

If you want to keep your files with multiple units,
perhaps to maintain compatibility with some other Ada compilation system,
you can use ``gnatname`` to generate or update your project files.
Generated or modified project files can be processed by GNAT.

See :ref:`Handling_Arbitrary_File_Naming_Conventions_with_gnatname`
for more details on how to use `gnatname`.

Alternatively, if you want to permanently restructure a set of 'foreign'
files so that they match the GNAT rules, and do the remaining development
using the GNAT structure, you can simply use ``gnatchop`` once, generate the
new set of files and work with them from that point on.

Note that if your file containing multiple units starts with a byte order
mark (BOM) specifying UTF-8 encoding, then the files generated by gnatchop
will each start with a copy of this BOM, meaning that they can be compiled
automatically in UTF-8 mode without needing to specify an explicit encoding.

.. _Operating_gnatchop_in_Compilation_Mode:

Operating gnatchop in Compilation Mode
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The basic function of ``gnatchop`` is to take a file with multiple units
and split it into separate files. The boundary between files is reasonably
clear, except for the issue of comments and pragmas. In default mode, the
rule is that any pragmas between units belong to the previous unit, except
that configuration pragmas always belong to the following unit. Any comments
belong to the following unit. These rules
almost always result in the right choice of
the split point without needing to mark it explicitly and most users will
find this default to be what they want. In this default mode it is incorrect to
submit a file containing only configuration pragmas, or one that ends in
configuration pragmas, to ``gnatchop``.

However, using a special option to activate 'compilation mode',
``gnatchop``
can perform another function, which is to provide exactly the semantics
required by the RM for handling of configuration pragmas in a compilation.
In the absence of configuration pragmas (at the main file level), this
option has no effect, but it causes such configuration pragmas to be handled
in a quite different manner.

First, in compilation mode, if ``gnatchop`` is given a file that consists of
only configuration pragmas, then this file is appended to the
:file:`gnat.adc` file in the current directory. This behavior provides
the required behavior described in the RM for the actions to be taken
on submitting such a file to the compiler, namely that these pragmas
should apply to all subsequent compilations in the same compilation
environment. Using GNAT, the current directory, possibly containing a
:file:`gnat.adc` file is the representation
of a compilation environment. For more information on the
:file:`gnat.adc` file, see :ref:`Handling_of_Configuration_Pragmas`.

Second, in compilation mode, if ``gnatchop``
is given a file that starts with
configuration pragmas, and contains one or more units, then these
configuration pragmas are prepended to each of the chopped files. This
behavior provides the required behavior described in the RM for the
actions to be taken on compiling such a file, namely that the pragmas
apply to all units in the compilation, but not to subsequently compiled
units.

Finally, if configuration pragmas appear between units, they are appended
to the previous unit. This results in the previous unit being illegal,
since the compiler does not accept configuration pragmas that follow
a unit. This provides the required RM behavior that forbids configuration
pragmas other than those preceding the first compilation unit of a
compilation.

For most purposes, ``gnatchop`` will be used in default mode. The
compilation mode described above is used only if you need exactly
accurate behavior with respect to compilations, and you have files
that contain multiple units and configuration pragmas. In this
circumstance the use of ``gnatchop`` with the compilation mode
switch provides the required behavior, and is for example the mode
in which GNAT processes the ACVC tests.


.. _Command_Line_for_gnatchop:

Command Line for ``gnatchop``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The ``gnatchop`` command has the form:

.. code-block:: sh

     $ gnatchop switches file_name [file_name ...]
           [directory]

The only required argument is the file name of the file to be chopped.
There are no restrictions on the form of this file name. The file itself
contains one or more Ada units, in normal GNAT format, concatenated
together. As shown, more than one file may be presented to be chopped.

When run in default mode, ``gnatchop`` generates one output file in
the current directory for each unit in each of the files.

``directory``, if specified, gives the name of the directory to which
the output files will be written. If it is not specified, all files are
written to the current directory.

For example, given a
file called :file:`hellofiles` containing

.. code-block:: ada

     procedure Hello;

     with Ada.Text_IO; use Ada.Text_IO;
     procedure Hello is
     begin
        Put_Line ("Hello");
     end Hello;

the command

.. code-block:: sh

     $ gnatchop hellofiles

generates two files in the current directory, one called
:file:`hello.ads` containing the single line that is the procedure spec,
and the other called :file:`hello.adb` containing the remaining text. The
original file is not affected. The generated files can be compiled in
the normal manner.

When gnatchop is invoked on a file that is empty or that contains only empty
lines and/or comments, gnatchop will not fail, but will not produce any
new sources.

For example, given a
file called :file:`toto.txt` containing

.. code-block:: ada

     --  Just a comment

the command

.. code-block:: sh

     $ gnatchop toto.txt

will not produce any new file and will result in the following warnings::

     toto.txt:1:01: warning: empty file, contains no compilation units
     no compilation units found
     no source files written


.. _Switches_for_gnatchop:

Switches for ``gnatchop``
^^^^^^^^^^^^^^^^^^^^^^^^^

``gnatchop`` recognizes the following switches:


.. index:: --version (gnatchop)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.

.. index:: --help (gnatchop)

:switch:`--help`
  If :switch:`--version` was not used, display usage, then exit disregarding
  all other options.

.. index:: -c (gnatchop)

:switch:`-c`
  Causes ``gnatchop`` to operate in compilation mode, in which
  configuration pragmas are handled according to strict RM rules. See
  previous section for a full description of this mode.

:switch:`-gnat{xxx}`
  This passes the given :switch:`-gnat{xxx}` switch to ``gnat`` which is
  used to parse the given file. Not all *xxx* options make sense,
  but for example, the use of :switch:`-gnati2` allows ``gnatchop`` to
  process a source file that uses Latin-2 coding for identifiers.

:switch:`-h`
  Causes ``gnatchop`` to generate a brief help summary to the standard
  output file showing usage information.

.. index:: -k (gnatchop)

:switch:`-k{mm}`
  Limit generated file names to the specified number ``mm``
  of characters.
  This is useful if the
  resulting set of files is required to be interoperable with systems
  which limit the length of file names.
  No space is allowed between the :switch:`-k` and the numeric value. The numeric
  value may be omitted in which case a default of :switch:`-k8`,
  suitable for use
  with DOS-like file systems, is used. If no :switch:`-k` switch
  is present then
  there is no limit on the length of file names.

.. index:: -p (gnatchop)

:switch:`-p`
  Causes the file modification time stamp of the input file to be
  preserved and used for the time stamp of the output file(s). This may be
  useful for preserving coherency of time stamps in an environment where
  ``gnatchop`` is used as part of a standard build process.

.. index:: -q (gnatchop)

:switch:`-q`
  Causes output of informational messages indicating the set of generated
  files to be suppressed. Warnings and error messages are unaffected.

.. index:: -r (gnatchop)
.. index:: Source_Reference pragmas

:switch:`-r`
  Generate ``Source_Reference`` pragmas. Use this switch if the output
  files are regarded as temporary and development is to be done in terms
  of the original unchopped file. This switch causes
  ``Source_Reference`` pragmas to be inserted into each of the
  generated files to refers back to the original file name and line number.
  The result is that all error messages refer back to the original
  unchopped file.
  In addition, the debugging information placed into the object file (when
  the :switch:`-g` switch of ``gcc`` or ``gnatmake`` is
  specified)
  also refers back to this original file so that tools like profilers and
  debuggers will give information in terms of the original unchopped file.

  If the original file to be chopped itself contains
  a ``Source_Reference``
  pragma referencing a third file, then gnatchop respects
  this pragma, and the generated ``Source_Reference`` pragmas
  in the chopped file refer to the original file, with appropriate
  line numbers. This is particularly useful when ``gnatchop``
  is used in conjunction with ``gnatprep`` to compile files that
  contain preprocessing statements and multiple units.

.. index:: -v (gnatchop)

:switch:`-v`
  Causes ``gnatchop`` to operate in verbose mode. The version
  number and copyright notice are output, as well as exact copies of
  the gnat1 commands spawned to obtain the chop control information.

.. index:: -w (gnatchop)

:switch:`-w`
  Overwrite existing file names. Normally ``gnatchop`` regards it as a
  fatal error if there is already a file with the same name as a
  file it would otherwise output, in other words if the files to be
  chopped contain duplicated units. This switch bypasses this
  check, and causes all but the last instance of such duplicated
  units to be skipped.

.. index:: --GCC= (gnatchop)

:switch:`--GCC={xxxx}`
  Specify the path of the GNAT parser to be used. When this switch is used,
  no attempt is made to add the prefix to the GNAT parser executable.


.. _Examples_of_gnatchop_Usage:

Examples of ``gnatchop`` Usage
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. code-block:: sh

      $ gnatchop -w hello_s.ada prerelease/files

Chops the source file :file:`hello_s.ada`. The output files will be
placed in the directory :file:`prerelease/files`,
overwriting any
files with matching names in that directory (no files in the current
directory are modified).

.. code-block:: sh

      $ gnatchop archive

Chops the source file :file:`archive`
into the current directory. One
useful application of ``gnatchop`` is in sending sets of sources
around, for example in email messages. The required sources are simply
concatenated (for example, using a Unix ``cat``
command), and then
``gnatchop`` is used at the other end to reconstitute the original
file names.

.. code-block:: sh

      $ gnatchop file1 file2 file3 direc

Chops all units in files :file:`file1`, :file:`file2`, :file:`file3`, placing
the resulting files in the directory :file:`direc`. Note that if any units
occur more than once anywhere within this set of files, an error message
is generated, and no files are written. To override this check, use the
:switch:`-w` switch,
in which case the last occurrence in the last file will
be the one that is output, and earlier duplicate occurrences for a given
unit will be skipped.

.. _Configuration_Pragmas:

Configuration Pragmas
=====================

.. index:: Configuration pragmas

.. index:: Pragmas, configuration

Configuration pragmas include those pragmas described as
such in the Ada Reference Manual, as well as
implementation-dependent pragmas that are configuration pragmas.
See the ``Implementation_Defined_Pragmas`` chapter in the
:title:`GNAT_Reference_Manual` for details on these
additional GNAT-specific configuration pragmas.
Most notably, the pragma ``Source_File_Name``, which allows
specifying non-default names for source files, is a configuration
pragma. The following is a complete list of configuration pragmas
recognized by GNAT::

     Ada_83
     Ada_95
     Ada_05
     Ada_2005
     Ada_12
     Ada_2012
     Allow_Integer_Address
     Annotate
     Assertion_Policy
     Assume_No_Invalid_Values
     C_Pass_By_Copy
     Check_Float_Overflow
     Check_Name
     Check_Policy
     Compile_Time_Error
     Compile_Time_Warning
     Compiler_Unit
     Compiler_Unit_Warning
     Component_Alignment
     Convention_Identifier
     Debug_Policy
     Detect_Blocking
     Default_Scalar_Storage_Order
     Default_Storage_Pool
     Disable_Atomic_Synchronization
     Discard_Names
     Elaboration_Checks
     Eliminate
     Enable_Atomic_Synchronization
     Extend_System
     Extensions_Allowed
     External_Name_Casing
     Fast_Math
     Favor_Top_Level
     Ignore_Pragma
     Implicit_Packing
     Initialize_Scalars
     Interrupt_State
     License
     Locking_Policy
     No_Component_Reordering
     No_Heap_Finalization
     No_Run_Time
     No_Strict_Aliasing
     Normalize_Scalars
     Optimize_Alignment
     Overflow_Mode
     Overriding_Renamings
     Partition_Elaboration_Policy
     Persistent_BSS
     Prefix_Exception_Messages
     Priority_Specific_Dispatching
     Profile
     Profile_Warnings
     Propagate_Exceptions
     Queuing_Policy
     Rational
     Ravenscar
     Rename_Pragma
     Restricted_Run_Time
     Restrictions
     Restrictions_Warnings
     Reviewable
     Short_Circuit_And_Or
     Short_Descriptors
     Source_File_Name
     Source_File_Name_Project
     SPARK_Mode
     Style_Checks
     Suppress
     Suppress_Exception_Locations
     Task_Dispatching_Policy
     Unevaluated_Use_Of_Old
     Universal_Data
     Unsuppress
     Use_VADS_Size
     Validity_Checks
     Warning_As_Error
     Warnings
     Wide_Character_Encoding


.. _Handling_of_Configuration_Pragmas:

Handling of Configuration Pragmas
---------------------------------

Configuration pragmas may either appear at the start of a compilation
unit, or they can appear in a configuration pragma file to apply to
all compilations performed in a given compilation environment.

GNAT also provides the ``gnatchop`` utility to provide an automatic
way to handle configuration pragmas following the semantics for
compilations (that is, files with multiple units), described in the RM.
See :ref:`Operating_gnatchop_in_Compilation_Mode` for details.
However, for most purposes, it will be more convenient to edit the
:file:`gnat.adc` file that contains configuration pragmas directly,
as described in the following section.

In the case of ``Restrictions`` pragmas appearing as configuration
pragmas in individual compilation units, the exact handling depends on
the type of restriction.

Restrictions that require partition-wide consistency (like
``No_Tasking``) are
recognized wherever they appear
and can be freely inherited, e.g. from a |withed| unit to the |withing|
unit. This makes sense since the binder will in any case insist on seeing
consistent use, so any unit not conforming to any restrictions that are
anywhere in the partition will be rejected, and you might as well find
that out at compile time rather than at bind time.

For restrictions that do not require partition-wide consistency, e.g.
SPARK or No_Implementation_Attributes, in general the restriction applies
only to the unit in which the pragma appears, and not to any other units.

The exception is No_Elaboration_Code which always applies to the entire
object file from a compilation, i.e. to the body, spec, and all subunits.
This restriction can be specified in a configuration pragma file, or it
can be on the body and/or the spec (in eithe case it applies to all the
relevant units). It can appear on a subunit only if it has previously
appeared in the body of spec.


.. _The_Configuration_Pragmas_Files:

The Configuration Pragmas Files
-------------------------------

.. index:: gnat.adc

In GNAT a compilation environment is defined by the current
directory at the time that a compile command is given. This current
directory is searched for a file whose name is :file:`gnat.adc`. If
this file is present, it is expected to contain one or more
configuration pragmas that will be applied to the current compilation.
However, if the switch :switch:`-gnatA` is used, :file:`gnat.adc` is not
considered. When taken into account, :file:`gnat.adc` is added to the
dependencies, so that if :file:`gnat.adc` is modified later, an invocation of
``gnatmake`` will recompile the source.

Configuration pragmas may be entered into the :file:`gnat.adc` file
either by running ``gnatchop`` on a source file that consists only of
configuration pragmas, or more conveniently by direct editing of the
:file:`gnat.adc` file, which is a standard format source file.

Besides :file:`gnat.adc`, additional files containing configuration
pragmas may be applied to the current compilation using the switch
:switch:`-gnatec={path}` where ``path`` must designate an existing file that
contains only configuration pragmas. These configuration pragmas are
in addition to those found in :file:`gnat.adc` (provided :file:`gnat.adc`
is present and switch :switch:`-gnatA` is not used).

It is allowable to specify several switches :switch:`-gnatec=`, all of which
will be taken into account.

Files containing configuration pragmas specified with switches
:switch:`-gnatec=` are added to the dependencies, unless they are
temporary files. A file is considered temporary if its name ends in
:file:`.tmp` or :file:`.TMP`. Certain tools follow this naming
convention because they pass information to ``gcc`` via
temporary files that are immediately deleted; it doesn't make sense to
depend on a file that no longer exists. Such tools include
``gprbuild``, ``gnatmake``, and ``gnatcheck``.

By default, configuration pragma files are stored by their absolute paths in
ALI files. You can use the :switch:`-gnateb` switch in order to store them by
their basename instead.

If you are using project file, a separate mechanism is provided using
project attributes.

.. --Comment
   See :ref:`Specifying_Configuration_Pragmas` for more details.


.. _Generating_Object_Files:

Generating Object Files
=======================

An Ada program consists of a set of source files, and the first step in
compiling the program is to generate the corresponding object files.
These are generated by compiling a subset of these source files.
The files you need to compile are the following:

* If a package spec has no body, compile the package spec to produce the
  object file for the package.

* If a package has both a spec and a body, compile the body to produce the
  object file for the package. The source file for the package spec need
  not be compiled in this case because there is only one object file, which
  contains the code for both the spec and body of the package.

* For a subprogram, compile the subprogram body to produce the object file
  for the subprogram. The spec, if one is present, is as usual in a
  separate file, and need not be compiled.

.. index:: Subunits

* In the case of subunits, only compile the parent unit. A single object
  file is generated for the entire subunit tree, which includes all the
  subunits.

* Compile child units independently of their parent units
  (though, of course, the spec of all the ancestor unit must be present in order
  to compile a child unit).

  .. index:: Generics

* Compile generic units in the same manner as any other units. The object
  files in this case are small dummy files that contain at most the
  flag used for elaboration checking. This is because GNAT always handles generic
  instantiation by means of macro expansion. However, it is still necessary to
  compile generic units, for dependency checking and elaboration purposes.

The preceding rules describe the set of files that must be compiled to
generate the object files for a program. Each object file has the same
name as the corresponding source file, except that the extension is
:file:`.o` as usual.

You may wish to compile other files for the purpose of checking their
syntactic and semantic correctness. For example, in the case where a
package has a separate spec and body, you would not normally compile the
spec. However, it is convenient in practice to compile the spec to make
sure it is error-free before compiling clients of this spec, because such
compilations will fail if there is an error in the spec.

GNAT provides an option for compiling such files purely for the
purposes of checking correctness; such compilations are not required as
part of the process of building a program. To compile a file in this
checking mode, use the :switch:`-gnatc` switch.

.. _Source_Dependencies:

Source Dependencies
===================

A given object file clearly depends on the source file which is compiled
to produce it. Here we are using "depends" in the sense of a typical
``make`` utility; in other words, an object file depends on a source
file if changes to the source file require the object file to be
recompiled.
In addition to this basic dependency, a given object may depend on
additional source files as follows:

* If a file being compiled |withs| a unit ``X``, the object file
  depends on the file containing the spec of unit ``X``. This includes
  files that are |withed| implicitly either because they are parents
  of |withed| child units or they are run-time units required by the
  language constructs used in a particular unit.

* If a file being compiled instantiates a library level generic unit, the
  object file depends on both the spec and body files for this generic
  unit.

* If a file being compiled instantiates a generic unit defined within a
  package, the object file depends on the body file for the package as
  well as the spec file.

.. index:: Inline
.. index:: -gnatn switch

* If a file being compiled contains a call to a subprogram for which
  pragma ``Inline`` applies and inlining is activated with the
  :switch:`-gnatn` switch, the object file depends on the file containing the
  body of this subprogram as well as on the file containing the spec. Note
  that for inlining to actually occur as a result of the use of this switch,
  it is necessary to compile in optimizing mode.

  .. index:: -gnatN switch

  The use of :switch:`-gnatN` activates  inlining optimization
  that is performed by the front end of the compiler. This inlining does
  not require that the code generation be optimized. Like :switch:`-gnatn`,
  the use of this switch generates additional dependencies.

  When using a gcc-based back end, then the use of
  :switch:`-gnatN` is deprecated, and the use of :switch:`-gnatn` is preferred.
  Historically front end inlining was more extensive than the gcc back end
  inlining, but that is no longer the case.

* If an object file :file:`O` depends on the proper body of a subunit through
  inlining or instantiation, it depends on the parent unit of the subunit.
  This means that any modification of the parent unit or one of its subunits
  affects the compilation of :file:`O`.

* The object file for a parent unit depends on all its subunit body files.

* The previous two rules meant that for purposes of computing dependencies and
  recompilation, a body and all its subunits are treated as an indivisible whole.

  These rules are applied transitively: if unit ``A`` |withs|
  unit ``B``, whose elaboration calls an inlined procedure in package
  ``C``, the object file for unit ``A`` will depend on the body of
  ``C``, in file :file:`c.adb`.

  The set of dependent files described by these rules includes all the
  files on which the unit is semantically dependent, as dictated by the
  Ada language standard. However, it is a superset of what the
  standard describes, because it includes generic, inline, and subunit
  dependencies.

  An object file must be recreated by recompiling the corresponding source
  file if any of the source files on which it depends are modified. For
  example, if the ``make`` utility is used to control compilation,
  the rule for an Ada object file must mention all the source files on
  which the object file depends, according to the above definition.
  The determination of the necessary
  recompilations is done automatically when one uses ``gnatmake``.

.. _The_Ada_Library_Information_Files:

The Ada Library Information Files
=================================

.. index:: Ada Library Information files

.. index:: ALI files

Each compilation actually generates two output files. The first of these
is the normal object file that has a :file:`.o` extension. The second is a
text file containing full dependency information. It has the same
name as the source file, but an :file:`.ali` extension.
This file is known as the Ada Library Information (:file:`ALI`) file.
The following information is contained in the :file:`ALI` file.

* Version information (indicates which version of GNAT was used to compile
  the unit(s) in question)

* Main program information (including priority and time slice settings,
  as well as the wide character encoding used during compilation).

* List of arguments used in the ``gcc`` command for the compilation

* Attributes of the unit, including configuration pragmas used, an indication
  of whether the compilation was successful, exception model used etc.

* A list of relevant restrictions applying to the unit (used for consistency)
  checking.

* Categorization information (e.g., use of pragma ``Pure``).

* Information on all |withed| units, including presence of
  ``Elaborate`` or ``Elaborate_All`` pragmas.

* Information from any ``Linker_Options`` pragmas used in the unit

* Information on the use of ``Body_Version`` or ``Version``
  attributes in the unit.

* Dependency information. This is a list of files, together with
  time stamp and checksum information. These are files on which
  the unit depends in the sense that recompilation is required
  if any of these units are modified.

* Cross-reference data. Contains information on all entities referenced
  in the unit. Used by tools like ``gnatxref`` and ``gnatfind`` to
  provide cross-reference information.

For a full detailed description of the format of the :file:`ALI` file,
see the source of the body of unit ``Lib.Writ``, contained in file
:file:`lib-writ.adb` in the GNAT compiler sources.


.. _Binding_an_Ada_Program:

Binding an Ada Program
======================

When using languages such as C and C++, once the source files have been
compiled the only remaining step in building an executable program
is linking the object modules together. This means that it is possible to
link an inconsistent version of a program, in which two units have
included different versions of the same header.

The rules of Ada do not permit such an inconsistent program to be built.
For example, if two clients have different versions of the same package,
it is illegal to build a program containing these two clients.
These rules are enforced by the GNAT binder, which also determines an
elaboration order consistent with the Ada rules.

The GNAT binder is run after all the object files for a program have
been created. It is given the name of the main program unit, and from
this it determines the set of units required by the program, by reading the
corresponding ALI files. It generates error messages if the program is
inconsistent or if no valid order of elaboration exists.

If no errors are detected, the binder produces a main program, in Ada by
default, that contains calls to the elaboration procedures of those
compilation unit that require them, followed by
a call to the main program. This Ada program is compiled to generate the
object file for the main program. The name of
the Ada file is :file:`b~xxx`.adb` (with the corresponding spec
:file:`b~xxx`.ads`) where ``xxx`` is the name of the
main program unit.

Finally, the linker is used to build the resulting executable program,
using the object from the main program from the bind step as well as the
object files for the Ada units of the program.


.. _GNAT_and_Libraries:

GNAT and Libraries
==================

.. index:: Library building and using

This section describes how to build and use libraries with GNAT, and also shows
how to recompile the GNAT run-time library. You should be familiar with the
Project Manager facility (see the *GNAT_Project_Manager* chapter of the
*GPRbuild User's Guide*) before reading this chapter.

.. _Introduction_to_Libraries_in_GNAT:

Introduction to Libraries in GNAT
---------------------------------

A library is, conceptually, a collection of objects which does not have its
own main thread of execution, but rather provides certain services to the
applications that use it. A library can be either statically linked with the
application, in which case its code is directly included in the application,
or, on platforms that support it, be dynamically linked, in which case
its code is shared by all applications making use of this library.

GNAT supports both types of libraries.
In the static case, the compiled code can be provided in different ways. The
simplest approach is to provide directly the set of objects resulting from
compilation of the library source files. Alternatively, you can group the
objects into an archive using whatever commands are provided by the operating
system. For the latter case, the objects are grouped into a shared library.

In the GNAT environment, a library has three types of components:

*  Source files,

*  :file:`ALI` files (see :ref:`The_Ada_Library_Information_Files`), and

*  Object files, an archive or a shared library.

A GNAT library may expose all its source files, which is useful for
documentation purposes. Alternatively, it may expose only the units needed by
an external user to make use of the library. That is to say, the specs
reflecting the library services along with all the units needed to compile
those specs, which can include generic bodies or any body implementing an
inlined routine. In the case of *stand-alone libraries* those exposed
units are called *interface units* (:ref:`Stand-alone_Ada_Libraries`).

All compilation units comprising an application, including those in a library,
need to be elaborated in an order partially defined by Ada's semantics. GNAT
computes the elaboration order from the :file:`ALI` files and this is why they
constitute a mandatory part of GNAT libraries.
*Stand-alone libraries* are the exception to this rule because a specific
library elaboration routine is produced independently of the application(s)
using the library.

.. _General_Ada_Libraries:

General Ada Libraries
---------------------


.. _Building_a_library:

Building a library
^^^^^^^^^^^^^^^^^^

The easiest way to build a library is to use the Project Manager,
which supports a special type of project called a *Library Project*
(see the *Library Projects* section in the *GNAT Project Manager*
chapter of the *GPRbuild User's Guide*).

A project is considered a library project, when two project-level attributes
are defined in it: ``Library_Name`` and ``Library_Dir``. In order to
control different aspects of library configuration, additional optional
project-level attributes can be specified:

* ``Library_Kind``
    This attribute controls whether the library is to be static or dynamic


* ``Library_Version``
    This attribute specifies the library version; this value is used
    during dynamic linking of shared libraries to determine if the currently
    installed versions of the binaries are compatible.

* ``Library_Options``

* ``Library_GCC``
    These attributes specify additional low-level options to be used during
    library generation, and redefine the actual application used to generate
    library.

The GNAT Project Manager takes full care of the library maintenance task,
including recompilation of the source files for which objects do not exist
or are not up to date, assembly of the library archive, and installation of
the library (i.e., copying associated source, object and :file:`ALI` files
to the specified location).

Here is a simple library project file:

.. code-block:: gpr

       project My_Lib is
         for Source_Dirs use ("src1", "src2");
         for Object_Dir use "obj";
         for Library_Name use "mylib";
         for Library_Dir use "lib";
         for Library_Kind use "dynamic";
       end My_lib;

and the compilation command to build and install the library:

.. code-block:: sh

     $ gnatmake -Pmy_lib

It is not entirely trivial to perform manually all the steps required to
produce a library. We recommend that you use the GNAT Project Manager
for this task. In special cases where this is not desired, the necessary
steps are discussed below.

There are various possibilities for compiling the units that make up the
library: for example with a Makefile (:ref:`Using_the_GNU_make_Utility`) or
with a conventional script. For simple libraries, it is also possible to create
a dummy main program which depends upon all the packages that comprise the
interface of the library. This dummy main program can then be given to
``gnatmake``, which will ensure that all necessary objects are built.

After this task is accomplished, you should follow the standard procedure
of the underlying operating system to produce the static or shared library.

Here is an example of such a dummy program:

.. code-block:: ada

       with My_Lib.Service1;
       with My_Lib.Service2;
       with My_Lib.Service3;
       procedure My_Lib_Dummy is
       begin
          null;
       end;

Here are the generic commands that will build an archive or a shared library.

.. code-block:: sh

     # compiling the library
     $ gnatmake -c my_lib_dummy.adb

     # we don't need the dummy object itself
     $ rm my_lib_dummy.o my_lib_dummy.ali

     # create an archive with the remaining objects
     $ ar rc libmy_lib.a *.o
     # some systems may require "ranlib" to be run as well

     # or create a shared library
     $ gcc -shared -o libmy_lib.so *.o
     # some systems may require the code to have been compiled with -fPIC

     # remove the object files that are now in the library
     $ rm *.o

     # Make the ALI files read-only so that gnatmake will not try to
     # regenerate the objects that are in the library
     $ chmod -w *.ali

Please note that the library must have a name of the form :file:`lib{xxx}.a`
or :file:`lib{xxx}.so` (or :file:`lib{xxx}.dll` on Windows) in order to
be accessed by the directive :switch:`-l{xxx}` at link time.

.. _Installing_a_library:

Installing a library
^^^^^^^^^^^^^^^^^^^^

.. index:: ADA_PROJECT_PATH
.. index:: GPR_PROJECT_PATH

If you use project files, library installation is part of the library build
process (see the *Installing a Library with Project Files* section of the
*GNAT Project Manager* chapter of the *GPRbuild User's Guide*).

When project files are not an option, it is also possible, but not recommended,
to install the library so that the sources needed to use the library are on the
Ada source path and the ALI files & libraries be on the Ada Object path (see
:ref:`Search_Paths_and_the_Run-Time_Library_RTL`. Alternatively, the system
administrator can place general-purpose libraries in the default compiler
paths, by specifying the libraries' location in the configuration files
:file:`ada_source_path` and :file:`ada_object_path`. These configuration files
must be located in the GNAT installation tree at the same place as the gcc spec
file. The location of the gcc spec file can be determined as follows:

.. code-block:: sh

     $ gcc -v


The configuration files mentioned above have a simple format: each line
must contain one unique directory name.
Those names are added to the corresponding path
in their order of appearance in the file. The names can be either absolute
or relative; in the latter case, they are relative to where theses files
are located.

The files :file:`ada_source_path` and :file:`ada_object_path` might not be
present in a
GNAT installation, in which case, GNAT will look for its run-time library in
the directories :file:`adainclude` (for the sources) and :file:`adalib` (for the
objects and :file:`ALI` files). When the files exist, the compiler does not
look in :file:`adainclude` and :file:`adalib`, and thus the
:file:`ada_source_path` file
must contain the location for the GNAT run-time sources (which can simply
be :file:`adainclude`). In the same way, the :file:`ada_object_path` file must
contain the location for the GNAT run-time objects (which can simply
be :file:`adalib`).

You can also specify a new default path to the run-time library at compilation
time with the switch :switch:`--RTS=rts-path`. You can thus choose / change
the run-time library you want your program to be compiled with. This switch is
recognized by ``gcc``, ``gnatmake``, ``gnatbind``,
``gnatls``, ``gnatfind`` and ``gnatxref``.

It is possible to install a library before or after the standard GNAT
library, by reordering the lines in the configuration files. In general, a
library must be installed before the GNAT library if it redefines
any part of it.

.. _Using_a_library:

Using a library
^^^^^^^^^^^^^^^

Once again, the project facility greatly simplifies the use of
libraries. In this context, using a library is just a matter of adding a
|with| clause in the user project. For instance, to make use of the
library ``My_Lib`` shown in examples in earlier sections, you can
write:

.. code-block:: gpr

       with "my_lib";
       project My_Proj is
         ...
       end My_Proj;

Even if you have a third-party, non-Ada library, you can still use GNAT's
Project Manager facility to provide a wrapper for it. For example, the
following project, when |withed| by your main project, will link with the
third-party library :file:`liba.a`:

.. code-block:: gpr

       project Liba is
          for Externally_Built use "true";
          for Source_Files use ();
          for Library_Dir use "lib";
          for Library_Name use "a";
          for Library_Kind use "static";
       end Liba;

This is an alternative to the use of ``pragma Linker_Options``. It is
especially interesting in the context of systems with several interdependent
static libraries where finding a proper linker order is not easy and best be
left to the tools having visibility over project dependence information.

In order to use an Ada library manually, you need to make sure that this
library is on both your source and object path
(see :ref:`Search_Paths_and_the_Run-Time_Library_RTL`
and :ref:`Search_Paths_for_gnatbind`). Furthermore, when the objects are grouped
in an archive or a shared library, you need to specify the desired
library at link time.

For example, you can use the library :file:`mylib` installed in
:file:`/dir/my_lib_src` and :file:`/dir/my_lib_obj` with the following commands:

.. code-block:: sh

     $ gnatmake -aI/dir/my_lib_src -aO/dir/my_lib_obj my_appl \\
       -largs -lmy_lib

This can be expressed more simply:

.. code-block:: sh

    $ gnatmake my_appl

when the following conditions are met:

* :file:`/dir/my_lib_src` has been added by the user to the environment
  variable :envvar:`ADA_INCLUDE_PATH`, or by the administrator to the file
  :file:`ada_source_path`

* :file:`/dir/my_lib_obj` has been added by the user to the environment
  variable :envvar:`ADA_OBJECTS_PATH`, or by the administrator to the file
  :file:`ada_object_path`

* a pragma ``Linker_Options`` has been added to one of the sources.
  For example:

  .. code-block:: ada

       pragma Linker_Options ("-lmy_lib");

Note that you may also load a library dynamically at
run time given its filename, as illustrated in the GNAT :file:`plugins` example
in the directory :file:`share/examples/gnat/plugins` within the GNAT
install area.

.. _Stand-alone_Ada_Libraries:

Stand-alone Ada Libraries
-------------------------

.. index:: ! Stand-alone libraries

.. _Introduction_to_Stand-alone_Libraries:

Introduction to Stand-alone Libraries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

A Stand-alone Library (abbreviated 'SAL') is a library that contains the
necessary code to
elaborate the Ada units that are included in the library. In contrast with
an ordinary library, which consists of all sources, objects and :file:`ALI`
files of the
library, a SAL may specify a restricted subset of compilation units
to serve as a library interface. In this case, the fully
self-sufficient set of files will normally consist of an objects
archive, the sources of interface units' specs, and the :file:`ALI`
files of interface units.
If an interface spec contains a generic unit or an inlined subprogram,
the body's
source must also be provided; if the units that must be provided in the source
form depend on other units, the source and :file:`ALI` files of those must
also be provided.

The main purpose of a SAL is to minimize the recompilation overhead of client
applications when a new version of the library is installed. Specifically,
if the interface sources have not changed, client applications do not need to
be recompiled. If, furthermore, a SAL is provided in the shared form and its
version, controlled by ``Library_Version`` attribute, is not changed,
then the clients do not need to be relinked.

SALs also allow the library providers to minimize the amount of library source
text exposed to the clients.  Such 'information hiding' might be useful or
necessary for various reasons.

Stand-alone libraries are also well suited to be used in an executable whose
main routine is not written in Ada.

.. _Building_a_Stand-alone_Library:

Building a Stand-alone Library
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

GNAT's Project facility provides a simple way of building and installing
stand-alone libraries; see the *Stand-alone Library Projects* section
in the *GNAT Project Manager* chapter of the *GPRbuild User's Guide*.
To be a Stand-alone Library Project, in addition to the two attributes
that make a project a Library Project (``Library_Name`` and
``Library_Dir``; see the *Library Projects* section in the
*GNAT Project Manager* chapter of the *GPRbuild User's Guide*),
the attribute ``Library_Interface`` must be defined.  For example:

.. code-block:: gpr

       for Library_Dir use "lib_dir";
       for Library_Name use "dummy";
       for Library_Interface use ("int1", "int1.child");

Attribute ``Library_Interface`` has a non-empty string list value,
each string in the list designating a unit contained in an immediate source
of the project file.

When a Stand-alone Library is built, first the binder is invoked to build
a package whose name depends on the library name
(:file:`b~dummy.ads/b` in the example above).
This binder-generated package includes initialization and
finalization procedures whose
names depend on the library name (``dummyinit`` and ``dummyfinal``
in the example
above). The object corresponding to this package is included in the library.

You must ensure timely (e.g., prior to any use of interfaces in the SAL)
calling of these procedures if a static SAL is built, or if a shared SAL
is built
with the project-level attribute ``Library_Auto_Init`` set to
``"false"``.

For a Stand-Alone Library, only the :file:`ALI` files of the Interface Units
(those that are listed in attribute ``Library_Interface``) are copied to
the Library Directory. As a consequence, only the Interface Units may be
imported from Ada units outside of the library. If other units are imported,
the binding phase will fail.

It is also possible to build an encapsulated library where not only
the code to elaborate and finalize the library is embedded but also
ensuring that the library is linked only against static
libraries. So an encapsulated library only depends on system
libraries, all other code, including the GNAT runtime, is embedded. To
build an encapsulated library the attribute
``Library_Standalone`` must be set to ``encapsulated``:

.. code-block:: gpr

       for Library_Dir use "lib_dir";
       for Library_Name use "dummy";
       for Library_Kind use "dynamic";
       for Library_Interface use ("int1", "int1.child");
       for Library_Standalone use "encapsulated";

The default value for this attribute is ``standard`` in which case
a stand-alone library is built.

The attribute ``Library_Src_Dir`` may be specified for a
Stand-Alone Library. ``Library_Src_Dir`` is a simple attribute that has a
single string value. Its value must be the path (absolute or relative to the
project directory) of an existing directory. This directory cannot be the
object directory or one of the source directories, but it can be the same as
the library directory. The sources of the Interface
Units of the library that are needed by an Ada client of the library will be
copied to the designated directory, called the Interface Copy directory.
These sources include the specs of the Interface Units, but they may also
include bodies and subunits, when pragmas ``Inline`` or ``Inline_Always``
are used, or when there is a generic unit in the spec. Before the sources
are copied to the Interface Copy directory, an attempt is made to delete all
files in the Interface Copy directory.

Building stand-alone libraries by hand is somewhat tedious, but for those
occasions when it is necessary here are the steps that you need to perform:

* Compile all library sources.

* Invoke the binder with the switch :switch:`-n` (No Ada main program),
  with all the :file:`ALI` files of the interfaces, and
  with the switch :switch:`-L` to give specific names to the ``init``
  and ``final`` procedures.  For example:

  .. code-block:: sh

      $ gnatbind -n int1.ali int2.ali -Lsal1

* Compile the binder generated file:

  .. code-block:: sh

      $ gcc -c b~int2.adb

* Link the dynamic library with all the necessary object files,
  indicating to the linker the names of the ``init`` (and possibly
  ``final``) procedures for automatic initialization (and finalization).
  The built library should be placed in a directory different from
  the object directory.

* Copy the ``ALI`` files of the interface to the library directory,
  add in this copy an indication that it is an interface to a SAL
  (i.e., add a word ``SL`` on the line in the :file:`ALI` file that starts
  with letter 'P') and make the modified copy of the :file:`ALI` file
  read-only.

Using SALs is not different from using other libraries
(see :ref:`Using_a_library`).

.. _Creating_a_Stand-alone_Library_to_be_used_in_a_non-Ada_context:

Creating a Stand-alone Library to be used in a non-Ada context
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

It is easy to adapt the SAL build procedure discussed above for use of a SAL in
a non-Ada context.

The only extra step required is to ensure that library interface subprograms
are compatible with the main program, by means of ``pragma Export``
or ``pragma Convention``.

Here is an example of simple library interface for use with C main program:

.. code-block:: ada

       package My_Package is

          procedure Do_Something;
          pragma Export (C, Do_Something, "do_something");

          procedure Do_Something_Else;
          pragma Export (C, Do_Something_Else, "do_something_else");

       end My_Package;

On the foreign language side, you must provide a 'foreign' view of the
library interface; remember that it should contain elaboration routines in
addition to interface subprograms.

The example below shows the content of :file:`mylib_interface.h` (note
that there is no rule for the naming of this file, any name can be used)

.. code-block:: c

       /* the library elaboration procedure */
       extern void mylibinit (void);

       /* the library finalization procedure */
       extern void mylibfinal (void);

       /* the interface exported by the library */
       extern void do_something (void);
       extern void do_something_else (void);

Libraries built as explained above can be used from any program, provided
that the elaboration procedures (named ``mylibinit`` in the previous
example) are called before the library services are used. Any number of
libraries can be used simultaneously, as long as the elaboration
procedure of each library is called.

Below is an example of a C program that uses the ``mylib`` library.

.. code-block:: c

       #include "mylib_interface.h"

       int
       main (void)
       {
          /* First, elaborate the library before using it */
          mylibinit ();

          /* Main program, using the library exported entities */
          do_something ();
          do_something_else ();

          /* Library finalization at the end of the program */
          mylibfinal ();
          return 0;
       }

Note that invoking any library finalization procedure generated by
``gnatbind`` shuts down the Ada run-time environment.
Consequently, the
finalization of all Ada libraries must be performed at the end of the program.
No call to these libraries or to the Ada run-time library should be made
after the finalization phase.

Note also that special care must be taken with multi-tasks
applications. The initialization and finalization routines are not
protected against concurrent access. If such requirement is needed it
must be ensured at the application level using a specific operating
system services like a mutex or a critical-section.

.. _Restrictions_in_Stand-alone_Libraries:

Restrictions in Stand-alone Libraries
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The pragmas listed below should be used with caution inside libraries,
as they can create incompatibilities with other Ada libraries:

* pragma ``Locking_Policy``
* pragma ``Partition_Elaboration_Policy``
* pragma ``Queuing_Policy``
* pragma ``Task_Dispatching_Policy``
* pragma ``Unreserve_All_Interrupts``

When using a library that contains such pragmas, the user must make sure
that all libraries use the same pragmas with the same values. Otherwise,
``Program_Error`` will
be raised during the elaboration of the conflicting
libraries. The usage of these pragmas and its consequences for the user
should therefore be well documented.

Similarly, the traceback in the exception occurrence mechanism should be
enabled or disabled in a consistent manner across all libraries.
Otherwise, Program_Error will be raised during the elaboration of the
conflicting libraries.

If the ``Version`` or ``Body_Version``
attributes are used inside a library, then you need to
perform a ``gnatbind`` step that specifies all :file:`ALI` files in all
libraries, so that version identifiers can be properly computed.
In practice these attributes are rarely used, so this is unlikely
to be a consideration.

.. _Rebuilding_the_GNAT_Run-Time_Library:

Rebuilding the GNAT Run-Time Library
------------------------------------

.. index:: GNAT Run-Time Library, rebuilding
.. index:: Building the GNAT Run-Time Library
.. index:: Rebuilding the GNAT Run-Time Library
.. index:: Run-Time Library, rebuilding

It may be useful to recompile the GNAT library in various debugging or
experimentation contexts. A project file called
:file:`libada.gpr` is provided to that effect and can be found in
the directory containing the GNAT library. The location of this
directory depends on the way the GNAT environment has been installed and can
be determined by means of the command:

.. code-block:: sh

      $ gnatls -v

The last entry in the source search path usually contains the
gnat library (the :file:`adainclude` directory). This project file contains its
own documentation and in particular the set of instructions needed to rebuild a
new library and to use it.

Note that rebuilding the GNAT Run-Time is only recommended for temporary
experiments or debugging, and is not supported.


.. index:: ! Conditional compilation

.. _Conditional_Compilation:

Conditional Compilation
=======================

This section presents some guidelines for modeling conditional compilation in Ada and describes the
gnatprep preprocessor utility.

.. index:: ! Conditional compilation

.. _Modeling_Conditional_Compilation_in_Ada:

Modeling Conditional Compilation in Ada
---------------------------------------

It is often necessary to arrange for a single source program
to serve multiple purposes, where it is compiled in different
ways to achieve these different goals. Some examples of the
need for this feature are

* Adapting a program to a different hardware environment
* Adapting a program to a different target architecture
* Turning debugging features on and off
* Arranging for a program to compile with different compilers

In C, or C++, the typical approach would be to use the preprocessor
that is defined as part of the language. The Ada language does not
contain such a feature. This is not an oversight, but rather a very
deliberate design decision, based on the experience that overuse of
the preprocessing features in C and C++ can result in programs that
are extremely difficult to maintain. For example, if we have ten
switches that can be on or off, this means that there are a thousand
separate programs, any one of which might not even be syntactically
correct, and even if syntactically correct, the resulting program
might not work correctly. Testing all combinations can quickly become
impossible.

Nevertheless, the need to tailor programs certainly exists, and in
this section we will discuss how this can
be achieved using Ada in general, and GNAT in particular.

.. _Use_of_Boolean_Constants:

Use of Boolean Constants
^^^^^^^^^^^^^^^^^^^^^^^^

In the case where the difference is simply which code
sequence is executed, the cleanest solution is to use Boolean
constants to control which code is executed.

.. code-block:: ada

      FP_Initialize_Required : constant Boolean := True;
      ...
      if FP_Initialize_Required then
      ...
      end if;

Not only will the code inside the ``if`` statement not be executed if
the constant Boolean is ``False``, but it will also be completely
deleted from the program.
However, the code is only deleted after the ``if`` statement
has been checked for syntactic and semantic correctness.
(In contrast, with preprocessors the code is deleted before the
compiler ever gets to see it, so it is not checked until the switch
is turned on.)

.. index:: Preprocessors (contrasted with conditional compilation)

Typically the Boolean constants will be in a separate package,
something like:

.. code-block:: ada

       package Config is
          FP_Initialize_Required : constant Boolean := True;
          Reset_Available        : constant Boolean := False;
          ...
       end Config;

The ``Config`` package exists in multiple forms for the various targets,
with an appropriate script selecting the version of ``Config`` needed.
Then any other unit requiring conditional compilation can do a |with|
of ``Config`` to make the constants visible.

.. _Debugging_-_A_Special_Case:

Debugging - A Special Case
^^^^^^^^^^^^^^^^^^^^^^^^^^

A common use of conditional code is to execute statements (for example
dynamic checks, or output of intermediate results) under control of a
debug switch, so that the debugging behavior can be turned on and off.
This can be done using a Boolean constant to control whether the code
is active:

.. code-block:: ada

       if Debugging then
          Put_Line ("got to the first stage!");
       end if;

or

.. code-block:: ada

       if Debugging and then Temperature > 999.0 then
          raise Temperature_Crazy;
       end if;

.. index:: pragma Assert

Since this is a common case, there are special features to deal with
this in a convenient manner. For the case of tests, Ada 2005 has added
a pragma ``Assert`` that can be used for such tests. This pragma is modeled
on the ``Assert`` pragma that has always been available in GNAT, so this
feature may be used with GNAT even if you are not using Ada 2005 features.
The use of pragma ``Assert`` is described in the
:title:`GNAT_Reference_Manual`, but as an
example, the last test could be written:

.. code-block:: ada

       pragma Assert (Temperature <= 999.0, "Temperature Crazy");

or simply

.. code-block:: ada

       pragma Assert (Temperature <= 999.0);

In both cases, if assertions are active and the temperature is excessive,
the exception ``Assert_Failure`` will be raised, with the given string in
the first case or a string indicating the location of the pragma in the second
case used as the exception message.

.. index:: pragma Assertion_Policy

You can turn assertions on and off by using the ``Assertion_Policy``
pragma.

.. index:: -gnata switch

This is an Ada 2005 pragma which is implemented in all modes by
GNAT. Alternatively, you can use the :switch:`-gnata` switch
to enable assertions from the command line, which applies to
all versions of Ada.

.. index:: pragma Debug

For the example above with the ``Put_Line``, the GNAT-specific pragma
``Debug`` can be used:

.. code-block:: ada

       pragma Debug (Put_Line ("got to the first stage!"));

If debug pragmas are enabled, the argument, which must be of the form of
a procedure call, is executed (in this case, ``Put_Line`` will be called).
Only one call can be present, but of course a special debugging procedure
containing any code you like can be included in the program and then
called in a pragma ``Debug`` argument as needed.

One advantage of pragma ``Debug`` over the ``if Debugging then``
construct is that pragma ``Debug`` can appear in declarative contexts,
such as at the very beginning of a procedure, before local declarations have
been elaborated.

.. index:: pragma Debug_Policy

Debug pragmas are enabled using either the :switch:`-gnata` switch that also
controls assertions, or with a separate Debug_Policy pragma.

The latter pragma is new in the Ada 2005 versions of GNAT (but it can be used
in Ada 95 and Ada 83 programs as well), and is analogous to
pragma ``Assertion_Policy`` to control assertions.

``Assertion_Policy`` and ``Debug_Policy`` are configuration pragmas,
and thus they can appear in :file:`gnat.adc` if you are not using a
project file, or in the file designated to contain configuration pragmas
in a project file.
They then apply to all subsequent compilations. In practice the use of
the :switch:`-gnata` switch is often the most convenient method of controlling
the status of these pragmas.

Note that a pragma is not a statement, so in contexts where a statement
sequence is required, you can't just write a pragma on its own. You have
to add a ``null`` statement.

.. code-block:: ada

       if ... then
          ... -- some statements
       else
          pragma Assert (Num_Cases < 10);
          null;
       end if;

.. _Conditionalizing_Declarations:

Conditionalizing Declarations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In some cases it may be necessary to conditionalize declarations to meet
different requirements. For example we might want a bit string whose length
is set to meet some hardware message requirement.

This may be possible using declare blocks controlled
by conditional constants:

.. code-block:: ada

       if Small_Machine then
          declare
             X : Bit_String (1 .. 10);
          begin
             ...
          end;
       else
          declare
             X : Large_Bit_String (1 .. 1000);
          begin
             ...
          end;
       end if;

Note that in this approach, both declarations are analyzed by the
compiler so this can only be used where both declarations are legal,
even though one of them will not be used.

Another approach is to define integer constants, e.g., ``Bits_Per_Word``,
or Boolean constants, e.g., ``Little_Endian``, and then write declarations
that are parameterized by these constants. For example

.. code-block:: ada

       for Rec use
         Field1 at 0 range Boolean'Pos (Little_Endian) * 10 .. Bits_Per_Word;
       end record;

If ``Bits_Per_Word`` is set to 32, this generates either

.. code-block:: ada

       for Rec use
         Field1 at 0 range 0 .. 32;
       end record;

for the big endian case, or

.. code-block:: ada

       for Rec use record
           Field1 at 0 range 10 .. 32;
       end record;

for the little endian case. Since a powerful subset of Ada expression
notation is usable for creating static constants, clever use of this
feature can often solve quite difficult problems in conditionalizing
compilation (note incidentally that in Ada 95, the little endian
constant was introduced as ``System.Default_Bit_Order``, so you do not
need to define this one yourself).

.. _Use_of_Alternative_Implementations:

Use of Alternative Implementations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In some cases, none of the approaches described above are adequate. This
can occur for example if the set of declarations required is radically
different for two different configurations.

In this situation, the official Ada way of dealing with conditionalizing
such code is to write separate units for the different cases. As long as
this does not result in excessive duplication of code, this can be done
without creating maintenance problems. The approach is to share common
code as far as possible, and then isolate the code and declarations
that are different. Subunits are often a convenient method for breaking
out a piece of a unit that is to be conditionalized, with separate files
for different versions of the subunit for different targets, where the
build script selects the right one to give to the compiler.

.. index:: Subunits (and conditional compilation)

As an example, consider a situation where a new feature in Ada 2005
allows something to be done in a really nice way. But your code must be able
to compile with an Ada 95 compiler. Conceptually you want to say:

.. code-block:: ada

       if Ada_2005 then
          ... neat Ada 2005 code
       else
          ... not quite as neat Ada 95 code
       end if;

where ``Ada_2005`` is a Boolean constant.

But this won't work when ``Ada_2005`` is set to ``False``,
since the ``then`` clause will be illegal for an Ada 95 compiler.
(Recall that although such unreachable code would eventually be deleted
by the compiler, it still needs to be legal.  If it uses features
introduced in Ada 2005, it will be illegal in Ada 95.)

So instead we write

.. code-block:: ada

       procedure Insert is separate;

Then we have two files for the subunit ``Insert``, with the two sets of
code.
If the package containing this is called ``File_Queries``, then we might
have two files

* :file:`file_queries-insert-2005.adb`
* :file:`file_queries-insert-95.adb`

and the build script renames the appropriate file to :file:`file_queries-insert.adb` and then carries out the compilation.

This can also be done with project files' naming schemes. For example:

.. code-block:: gpr

       for body ("File_Queries.Insert") use "file_queries-insert-2005.ada";

Note also that with project files it is desirable to use a different extension
than :file:`ads` / :file:`adb` for alternative versions. Otherwise a naming
conflict may arise through another commonly used feature: to declare as part
of the project a set of directories containing all the sources obeying the
default naming scheme.

The use of alternative units is certainly feasible in all situations,
and for example the Ada part of the GNAT run-time is conditionalized
based on the target architecture using this approach. As a specific example,
consider the implementation of the AST feature in VMS. There is one
spec: :file:`s-asthan.ads` which is the same for all architectures, and three
bodies:

* :file:`s-asthan.adb`
    used for all non-VMS operating systems

* :file:`s-asthan-vms-alpha.adb`
    used for VMS on the Alpha

* :file:`s-asthan-vms-ia64.adb`
    used for VMS on the ia64

The dummy version :file:`s-asthan.adb` simply raises exceptions noting that
this operating system feature is not available, and the two remaining
versions interface with the corresponding versions of VMS to provide
VMS-compatible AST handling. The GNAT build script knows the architecture
and operating system, and automatically selects the right version,
renaming it if necessary to :file:`s-asthan.adb` before the run-time build.

Another style for arranging alternative implementations is through Ada's
access-to-subprogram facility.
In case some functionality is to be conditionally included,
you can declare an access-to-procedure variable ``Ref`` that is initialized
to designate a 'do nothing' procedure, and then invoke ``Ref.all``
when appropriate.
In some library package, set ``Ref`` to ``Proc'Access`` for some
procedure ``Proc`` that performs the relevant processing.
The initialization only occurs if the library package is included in the
program.
The same idea can also be implemented using tagged types and dispatching
calls.

.. _Preprocessing:

Preprocessing
^^^^^^^^^^^^^

.. index:: Preprocessing

Although it is quite possible to conditionalize code without the use of
C-style preprocessing, as described earlier in this section, it is
nevertheless convenient in some cases to use the C approach. Moreover,
older Ada compilers have often provided some preprocessing capability,
so legacy code may depend on this approach, even though it is not
standard.

To accommodate such use, GNAT provides a preprocessor (modeled to a large
extent on the various preprocessors that have been used
with legacy code on other compilers, to enable easier transition).

.. index:: gnatprep

The preprocessor may be used in two separate modes. It can be used quite
separately from the compiler, to generate a separate output source file
that is then fed to the compiler as a separate step. This is the
``gnatprep`` utility, whose use is fully described in
:ref:`Preprocessing_with_gnatprep`.

The preprocessing language allows such constructs as

.. code-block:: c

       #if DEBUG or else (PRIORITY > 4) then
          sequence of declarations
       #else
          completely different sequence of declarations
       #end if;

The values of the symbols ``DEBUG`` and ``PRIORITY`` can be
defined either on the command line or in a separate file.

The other way of running the preprocessor is even closer to the C style and
often more convenient. In this approach the preprocessing is integrated into
the compilation process. The compiler is given the preprocessor input which
includes ``#if`` lines etc, and then the compiler carries out the
preprocessing internally and processes the resulting output.
For more details on this approach, see :ref:`Integrated_Preprocessing`.

.. _Preprocessing_with_gnatprep:

Preprocessing with ``gnatprep``
-------------------------------

.. index:: ! gnatprep
.. index:: Preprocessing (gnatprep)

This section discusses how to use GNAT's ``gnatprep`` utility for simple
preprocessing.
Although designed for use with GNAT, ``gnatprep`` does not depend on any
special GNAT features.
For further discussion of conditional compilation in general, see
:ref:`Conditional_Compilation`.

.. _Preprocessing_Symbols:

Preprocessing Symbols
^^^^^^^^^^^^^^^^^^^^^

Preprocessing symbols are defined in *definition files* and referenced in the
sources to be preprocessed. A preprocessing symbol is an identifier, following
normal Ada (case-insensitive) rules for its syntax, with the restriction that
all characters need to be in the ASCII set (no accented letters).

.. _Using_gnatprep:

Using ``gnatprep``
^^^^^^^^^^^^^^^^^^

To call ``gnatprep`` use:

.. code-block:: sh

    $ gnatprep [ switches ] infile outfile [ deffile ]

where

* *switches*
    is an optional sequence of switches as described in the next section.

* *infile*
    is the full name of the input file, which is an Ada source
    file containing preprocessor directives.

* *outfile*
    is the full name of the output file, which is an Ada source
    in standard Ada form. When used with GNAT, this file name will
    normally have an ``ads`` or ``adb`` suffix.

* ``deffile``
    is the full name of a text file containing definitions of
    preprocessing symbols to be referenced by the preprocessor. This argument is
    optional, and can be replaced by the use of the :switch:`-D` switch.


.. _Switches_for_gnatprep:

Switches for ``gnatprep``
^^^^^^^^^^^^^^^^^^^^^^^^^

.. index:: --version (gnatprep)

:switch:`--version`
  Display Copyright and version, then exit disregarding all other options.

.. index:: --help (gnatprep)

:switch:`--help`
  If :switch:`--version` was not used, display usage and then exit disregarding
  all other options.

.. index:: -b (gnatprep)

:switch:`-b`
  Causes both preprocessor lines and the lines deleted by
  preprocessing to be replaced by blank lines in the output source file,
  preserving line numbers in the output file.

.. index:: -c (gnatprep)

:switch:`-c`
  Causes both preprocessor lines and the lines deleted
  by preprocessing to be retained in the output source as comments marked
  with the special string ``"--! "``. This option will result in line numbers
  being preserved in the output file.

.. index:: -C (gnatprep)

:switch:`-C`
  Causes comments to be scanned. Normally comments are ignored by gnatprep.
  If this option is specified, then comments are scanned and any $symbol
  substitutions performed as in program text. This is particularly useful
  when structured comments are used (e.g., for programs written in a
  pre-2014 version of the SPARK Ada subset). Note that this switch is not
  available when  doing integrated preprocessing (it would be useless in
  this context since comments are ignored by the compiler in any case).

.. index:: -D (gnatprep)

:switch:`-D{symbol}[={value}]`
  Defines a new preprocessing symbol with the specified value. If no value is given
  on the command line, then symbol is considered to be ``True``. This switch
  can be used in place of a definition file.

.. index:: -r (gnatprep)

:switch:`-r`
  Causes a ``Source_Reference`` pragma to be generated that
  references the original input file, so that error messages will use
  the file name of this original file. The use of this switch implies
  that preprocessor lines are not to be removed from the file, so its
  use will force ``-b`` mode if ``-c``
  has not been specified explicitly.

  Note that if the file to be preprocessed contains multiple units, then
  it will be necessary to ``gnatchop`` the output file from
  ``gnatprep``. If a ``Source_Reference`` pragma is present
  in the preprocessed file, it will be respected by
  ``gnatchop -r``
  so that the final chopped files will correctly refer to the original
  input source file for ``gnatprep``.

.. index:: -s (gnatprep)

:switch:`-s`
  Causes a sorted list of symbol names and values to be
  listed on the standard output file.

.. index:: -T (gnatprep)

:switch:`-T`
  Use LF as line terminators when writing files. By default the line terminator
  of the host (LF under unix, CR/LF under Windows) is used.

.. index:: -u (gnatprep)

:switch:`-u`
  Causes undefined symbols to be treated as having the value FALSE in the context
  of a preprocessor test. In the absence of this option, an undefined symbol in
  a ``#if`` or ``#elsif`` test will be treated as an error.

.. index:: -v (gnatprep)

:switch:`-v`
  Verbose mode: generates more output about work done.


Note: if neither :switch:`-b` nor :switch:`-c` is present,
then preprocessor lines and
deleted lines are completely removed from the output, unless -r is
specified, in which case -b is assumed.


.. _Form_of_Definitions_File:

Form of Definitions File
^^^^^^^^^^^^^^^^^^^^^^^^

The definitions file contains lines of the form::

      symbol := value

where ``symbol`` is a preprocessing symbol, and ``value`` is one of the following:

*  Empty, corresponding to a null substitution,
*  A string literal using normal Ada syntax, or
*  Any sequence of characters from the set {letters, digits, period, underline}.

Comment lines may also appear in the definitions file, starting with
the usual ``--``,
and comments may be added to the definitions lines.


.. _Form_of_Input_Text_for_gnatprep:

Form of Input Text for ``gnatprep``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The input text may contain preprocessor conditional inclusion lines,
as well as general symbol substitution sequences.

The preprocessor conditional inclusion commands have the form:

.. code-block:: c

       #if <expression> [then]
          lines
       #elsif <expression> [then]
          lines
       #elsif <expression> [then]
          lines
       ...
       #else
          lines
       #end if;

In this example, <expression> is defined by the following grammar::

       <expression> ::=  <symbol>
       <expression> ::=  <symbol> = "<value>"
       <expression> ::=  <symbol> = <symbol>
       <expression> ::=  <symbol> = <integer>
       <expression> ::=  <symbol> > <integer>
       <expression> ::=  <symbol> >= <integer>
       <expression> ::=  <symbol> < <integer>
       <expression> ::=  <symbol> <= <integer>
       <expression> ::=  <symbol> 'Defined
       <expression> ::=  not <expression>
       <expression> ::=  <expression> and <expression>
       <expression> ::=  <expression> or <expression>
       <expression> ::=  <expression> and then <expression>
       <expression> ::=  <expression> or else <expression>
       <expression> ::=  ( <expression> )

Note the following restriction: it is not allowed to have "and" or "or"
following "not" in the same expression without parentheses. For example, this
is not allowed:

.. code-block:: ada

       not X or Y

This can be expressed instead as one of the following forms:

.. code-block:: ada

     (not X) or Y
     not (X or Y)

For the first test (<expression> ::= <symbol>) the symbol must have
either the value true or false, that is to say the right-hand of the
symbol definition must be one of the (case-insensitive) literals
``True`` or ``False``. If the value is true, then the
corresponding lines are included, and if the value is false, they are
excluded.

When comparing a symbol to an integer, the integer is any non negative
literal integer as defined in the Ada Reference Manual, such as 3, 16#FF# or
2#11#. The symbol value must also be a non negative integer. Integer values
in the range 0 .. 2**31-1 are supported.

The test (<expression> ::= <symbol>'Defined) is true only if
the symbol has been defined in the definition file or by a :switch:`-D`
switch on the command line. Otherwise, the test is false.

The equality tests are case insensitive, as are all the preprocessor lines.

If the symbol referenced is not defined in the symbol definitions file,
then the effect depends on whether or not switch :switch:`-u`
is specified. If so, then the symbol is treated as if it had the value
false and the test fails. If this switch is not specified, then
it is an error to reference an undefined symbol. It is also an error to
reference a symbol that is defined with a value other than ``True``
or ``False``.

The use of the ``not`` operator inverts the sense of this logical test.
The ``not`` operator cannot be combined with the ``or`` or ``and``
operators, without parentheses. For example, "if not X or Y then" is not
allowed, but "if (not X) or Y then" and "if not (X or Y) then" are.

The ``then`` keyword is optional as shown

The ``#`` must be the first non-blank character on a line, but
otherwise the format is free form. Spaces or tabs may appear between
the ``#`` and the keyword. The keywords and the symbols are case
insensitive as in normal Ada code. Comments may be used on a
preprocessor line, but other than that, no other tokens may appear on a
preprocessor line. Any number of ``elsif`` clauses can be present,
including none at all. The ``else`` is optional, as in Ada.

The ``#`` marking the start of a preprocessor line must be the first
non-blank character on the line, i.e., it must be preceded only by
spaces or horizontal tabs.

Symbol substitution outside of preprocessor lines is obtained by using
the sequence::

      $symbol

anywhere within a source line, except in a comment or within a
string literal. The identifier
following the ``$`` must match one of the symbols defined in the symbol
definition file, and the result is to substitute the value of the
symbol in place of ``$symbol`` in the output file.

Note that although the substitution of strings within a string literal
is not possible, it is possible to have a symbol whose defined value is
a string literal. So instead of setting XYZ to ``hello`` and writing:

.. code-block:: ada

     Header : String := "$XYZ";

you should set XYZ to ``"hello"`` and write:

.. code-block:: ada

     Header : String := $XYZ;

and then the substitution will occur as desired.


.. _Integrated_Preprocessing:

Integrated Preprocessing
------------------------

As noted above, a file to be preprocessed consists of Ada source code
in which preprocessing lines have been inserted. However,
instead of using ``gnatprep`` to explicitly preprocess a file as a separate
step before compilation, you can carry out the preprocessing implicitly
as part of compilation. Such *integrated preprocessing*, which is the common
style with C, is performed when either or both of the following switches
are passed to the compiler:

   *   :switch:`-gnatep`, which specifies the *preprocessor data file*.
       This file dictates how the source files will be preprocessed (e.g., which
       symbol definition files apply to which sources).

   *   :switch:`-gnateD`, which defines values for preprocessing symbols.

Integrated preprocessing applies only to Ada source files, it is
not available for configuration pragma files.

With integrated preprocessing, the output from the preprocessor is not,
by default, written to any external file. Instead it is passed
internally to the compiler. To preserve the result of
preprocessing in a file, either run ``gnatprep``
in standalone mode or else supply the :switch:`-gnateG` switch
(described below) to the compiler.

When using project files:

   *    the builder switch :switch:`-x` should be used if any Ada source is
        compiled with :switch:`gnatep=`, so that the compiler finds the
        *preprocessor data file*.

   *    the preprocessing data file and the symbol definition files should be
        located in the source directories of the project.

Note that the ``gnatmake`` switch :switch:`-m` will almost
always trigger recompilation for sources that are preprocessed,
because ``gnatmake`` cannot compute the checksum of the source after
preprocessing.

The actual preprocessing function is described in detail in
:ref:`Preprocessing_with_gnatprep`. This section explains the switches
that relate to integrated preprocessing.

.. index:: -gnatep (gcc)

:switch:`-gnatep={preprocessor_data_file}`
  This switch specifies the file name (without directory
  information) of the preprocessor data file. Either place this file
  in one of the source directories, or, when using project
  files, reference the project file's directory via the
  ``project_name'Project_Dir`` project attribute; e.g:

     .. code-block:: gpr

         project Prj is
            package Compiler is
               for Switches ("Ada") use
                 ("-gnatep=" & Prj'Project_Dir & "prep.def");
            end Compiler;
         end Prj;

  A preprocessor data file is a text file that contains *preprocessor
  control lines*.  A preprocessor control line directs the preprocessing of
  either a particular source file, or, analogous to ``others`` in Ada,
  all sources not specified elsewhere in  the preprocessor data file.
  A preprocessor control line
  can optionally identify a *definition file* that assigns values to
  preprocessor symbols, as well as a list of switches that relate to
  preprocessing.
  Empty lines and comments (using Ada syntax) are also permitted, with no
  semantic effect.

  Here's an example of a preprocessor data file:

    .. code-block:: ada

        "toto.adb"  "prep.def" -u
        --  Preprocess toto.adb, using definition file prep.def
        --  Undefined symbols are treated as False

        * -c -DVERSION=V101
        --  Preprocess all other sources without using a definition file
        --  Suppressed lined are commented
        --  Symbol VERSION has the value V101

        "tata.adb" "prep2.def" -s
        --  Preprocess tata.adb, using definition file prep2.def
        --  List all symbols with their values

  A preprocessor control line has the following syntax:

    ::

        <preprocessor_control_line> ::=
           <preprocessor_input> [ <definition_file_name> ] { <switch> }

        <preprocessor_input> ::= <source_file_name> | '*'

        <definition_file_name> ::= <string_literal>

        <source_file_name> := <string_literal>

        <switch> := (See below for list)

  Thus  each preprocessor control line starts with either a literal string or
  the character '*':

  *  A literal string is the file name (without directory information) of the source
     file that will be input to the preprocessor.

  *  The character '*' is a wild-card indicator; the additional parameters on the line
     indicate the preprocessing for all the sources
     that are not specified explicitly on other lines (the order of the lines is not
     significant).

  It is an error to have two lines with the same file name or two
  lines starting with the character '*'.

  After the file name or '*', an optional literal string specifies the name of
  the definition file to be used for preprocessing
  (:ref:`Form_of_Definitions_File`). The definition files are found by the
  compiler in one of the source directories. In some cases, when compiling
  a source in a directory other than the current directory, if the definition
  file is in the current directory, it may be necessary to add the current
  directory as a source directory through the :switch:`-I` switch; otherwise
  the compiler would not find the definition file.

  Finally, switches similar to those of ``gnatprep`` may optionally appear:

  :switch:`-b`
    Causes both preprocessor lines and the lines deleted by
    preprocessing to be replaced by blank lines, preserving the line number.
    This switch is always implied; however, if specified after :switch:`-c`
    it cancels the effect of :switch:`-c`.


  :switch:`-c`
    Causes both preprocessor lines and the lines deleted
    by preprocessing to be retained as comments marked
    with the special string '`--!`'.


  :switch:`-D{symbol}={new_value}`
    Define or redefine ``symbol`` to have ``new_value`` as its value.
    The permitted form for ``symbol`` is either an Ada identifier, or any Ada reserved word
    aside from ``if``,
    ``else``, ``elsif``, ``end``, ``and``, ``or`` and ``then``.
    The permitted form for ``new_value`` is a literal string, an Ada identifier or any Ada reserved
    word. A symbol declared with this switch replaces a symbol with the
    same name defined in a definition file.


  :switch:`-s`
    Causes a sorted list of symbol names and values to be
    listed on the standard output file.


  :switch:`-u`
    Causes undefined symbols to be treated as having the value ``FALSE``
    in the context
    of a preprocessor test. In the absence of this option, an undefined symbol in
    a ``#if`` or ``#elsif`` test will be treated as an error.


.. index:: -gnateD (gcc)

:switch:`-gnateD{symbol}[={new_value}]`
  Define or redefine ``symbol`` to have ``new_value`` as its value. If no value
  is supplied, then the value of ``symbol`` is ``True``.
  The form of ``symbol`` is an identifier, following normal Ada (case-insensitive)
  rules for its syntax, and ``new_value`` is either an arbitrary string between double
  quotes or any sequence (including an empty sequence) of characters from the
  set (letters, digits, period, underline).
  Ada reserved words may be used as symbols, with the exceptions of ``if``,
  ``else``, ``elsif``, ``end``, ``and``, ``or`` and ``then``.

  Examples:

    ::

        -gnateDToto=Tata
        -gnateDFoo
        -gnateDFoo=\"Foo-Bar\"

  A symbol declared with this switch on the command line replaces a
  symbol with the same name either in a definition file or specified with a
  switch :switch:`-D` in the preprocessor data file.

  This switch is similar to switch :switch:`-D` of ``gnatprep``.


:switch:`-gnateG`
  When integrated preprocessing is performed on source file :file:`filename.extension`,
  create or overwrite :file:`filename.extension.prep` to contain
  the result of the preprocessing.
  For example if the source file is :file:`foo.adb` then
  the output file will be :file:`foo.adb.prep`.


.. _Mixed_Language_Programming:

Mixed Language Programming
==========================

.. index:: Mixed Language Programming

This section describes how to develop a mixed-language program,
with a focus on combining Ada with C or C++.

.. _Interfacing_to_C:

Interfacing to C
----------------

Interfacing Ada with a foreign language such as C involves using
compiler directives to import and/or export entity definitions in each
language -- using ``extern`` statements in C, for instance, and the
``Import``, ``Export``, and ``Convention`` pragmas in Ada.
A full treatment of these topics is provided in Appendix B, section 1
of the Ada Reference Manual.

There are two ways to build a program using GNAT that contains some Ada
sources and some foreign language sources, depending on whether or not
the main subprogram is written in Ada.  Here is a source example with
the main subprogram in Ada:

.. code-block:: c

    /* file1.c */
    #include <stdio.h>

    void print_num (int num)
    {
      printf ("num is %d.\\n", num);
      return;
    }

.. code-block:: c

    /* file2.c */

    /* num_from_Ada is declared in my_main.adb */
    extern int num_from_Ada;

    int get_num (void)
    {
      return num_from_Ada;
    }

.. code-block:: ada

    --  my_main.adb
    procedure My_Main is

       --  Declare then export an Integer entity called num_from_Ada
       My_Num : Integer := 10;
       pragma Export (C, My_Num, "num_from_Ada");

       --  Declare an Ada function spec for Get_Num, then use
       --  C function get_num for the implementation.
       function Get_Num return Integer;
       pragma Import (C, Get_Num, "get_num");

       --  Declare an Ada procedure spec for Print_Num, then use
       --  C function print_num for the implementation.
       procedure Print_Num (Num : Integer);
       pragma Import (C, Print_Num, "print_num");

    begin
       Print_Num (Get_Num);
    end My_Main;

To build this example:

* First compile the foreign language files to
  generate object files:

  .. code-block:: sh

      $ gcc -c file1.c
      $ gcc -c file2.c

* Then, compile the Ada units to produce a set of object files and ALI
  files:

  .. code-block:: sh

      $ gnatmake -c my_main.adb

* Run the Ada binder on the Ada main program:

  .. code-block:: sh

      $ gnatbind my_main.ali

* Link the Ada main program, the Ada objects and the other language
  objects:

  .. code-block:: sh

      $ gnatlink my_main.ali file1.o file2.o

The last three steps can be grouped in a single command:

.. code-block:: sh

   $ gnatmake my_main.adb -largs file1.o file2.o


.. index:: Binder output file

If the main program is in a language other than Ada, then you may have
more than one entry point into the Ada subsystem. You must use a special
binder option to generate callable routines that initialize and
finalize the Ada units (:ref:`Binding_with_Non-Ada_Main_Programs`).
Calls to the initialization and finalization routines must be inserted
in the main program, or some other appropriate point in the code. The
call to initialize the Ada units must occur before the first Ada
subprogram is called, and the call to finalize the Ada units must occur
after the last Ada subprogram returns. The binder will place the
initialization and finalization subprograms into the
:file:`b~xxx.adb` file where they can be accessed by your C
sources.  To illustrate, we have the following example:

.. code-block:: c

     /* main.c */
     extern void adainit (void);
     extern void adafinal (void);
     extern int add (int, int);
     extern int sub (int, int);

     int main (int argc, char *argv[])
     {
        int a = 21, b = 7;

        adainit();

        /* Should print "21 + 7 = 28" */
        printf ("%d + %d = %d\\n", a, b, add (a, b));

        /* Should print "21 - 7 = 14" */
        printf ("%d - %d = %d\\n", a, b, sub (a, b));

        adafinal();
     }

.. code-block:: ada

     --  unit1.ads
     package Unit1 is
        function Add (A, B : Integer) return Integer;
        pragma Export (C, Add, "add");
     end Unit1;

.. code-block:: ada

     --  unit1.adb
     package body Unit1 is
        function Add (A, B : Integer) return Integer is
        begin
           return A + B;
        end Add;
     end Unit1;

.. code-block:: ada

     --  unit2.ads
     package Unit2 is
        function Sub (A, B : Integer) return Integer;
        pragma Export (C, Sub, "sub");
     end Unit2;

.. code-block:: ada

     --  unit2.adb
     package body Unit2 is
        function Sub (A, B : Integer) return Integer is
        begin
           return A - B;
        end Sub;
     end Unit2;

The build procedure for this application is similar to the last
example's:

* First, compile the foreign language files to generate object files:

  .. code-block:: sh

      $ gcc -c main.c


* Next, compile the Ada units to produce a set of object files and ALI
  files:

  .. code-block:: sh

      $ gnatmake -c unit1.adb
      $ gnatmake -c unit2.adb

* Run the Ada binder on every generated ALI file.  Make sure to use the
  :switch:`-n` option to specify a foreign main program:

  .. code-block:: sh

      $ gnatbind -n unit1.ali unit2.ali

* Link the Ada main program, the Ada objects and the foreign language
  objects. You need only list the last ALI file here:

  .. code-block:: sh

      $ gnatlink unit2.ali main.o -o exec_file

  This procedure yields a binary executable called :file:`exec_file`.

Depending on the circumstances (for example when your non-Ada main object
does not provide symbol ``main``), you may also need to instruct the
GNAT linker not to include the standard startup objects by passing the
:switch:`-nostartfiles` switch to ``gnatlink``.

.. _Calling_Conventions:

Calling Conventions
-------------------

.. index:: Foreign Languages

.. index:: Calling Conventions

GNAT follows standard calling sequence conventions and will thus interface
to any other language that also follows these conventions. The following
Convention identifiers are recognized by GNAT:


.. index:: Interfacing to Ada

.. index:: Other Ada compilers

.. index:: Convention Ada

``Ada``
  This indicates that the standard Ada calling sequence will be
  used and all Ada data items may be passed without any limitations in the
  case where GNAT is used to generate both the caller and callee. It is also
  possible to mix GNAT generated code and code generated by another Ada
  compiler. In this case, the data types should be restricted to simple
  cases, including primitive types. Whether complex data types can be passed
  depends on the situation. Probably it is safe to pass simple arrays, such
  as arrays of integers or floats. Records may or may not work, depending
  on whether both compilers lay them out identically. Complex structures
  involving variant records, access parameters, tasks, or protected types,
  are unlikely to be able to be passed.

  Note that in the case of GNAT running
  on a platform that supports HP Ada 83, a higher degree of compatibility
  can be guaranteed, and in particular records are laid out in an identical
  manner in the two compilers. Note also that if output from two different
  compilers is mixed, the program is responsible for dealing with elaboration
  issues. Probably the safest approach is to write the main program in the
  version of Ada other than GNAT, so that it takes care of its own elaboration
  requirements, and then call the GNAT-generated adainit procedure to ensure
  elaboration of the GNAT components. Consult the documentation of the other
  Ada compiler for further details on elaboration.

  However, it is not possible to mix the tasking run time of GNAT and
  HP Ada 83, All the tasking operations must either be entirely within
  GNAT compiled sections of the program, or entirely within HP Ada 83
  compiled sections of the program.

.. index:: Interfacing to Assembly

.. index:: Convention Assembler


``Assembler``
  Specifies assembler as the convention. In practice this has the
  same effect as convention Ada (but is not equivalent in the sense of being
  considered the same convention).

.. index:: Convention Asm

.. index:: Asm

``Asm``
  Equivalent to Assembler.

  .. index:: Interfacing to COBOL

  .. index:: Convention COBOL

.. index:: COBOL

``COBOL``
  Data will be passed according to the conventions described
  in section B.4 of the Ada Reference Manual.

.. index:: C
.. index:: Interfacing to C

.. index:: Convention C


``C``
  Data will be passed according to the conventions described
  in section B.3 of the Ada Reference Manual.

  A note on interfacing to a C 'varargs' function:

    .. index:: C varargs function
    .. index:: Interfacing to C varargs function
    .. index:: varargs function interfaces

    In C, ``varargs`` allows a function to take a variable number of
    arguments. There is no direct equivalent in this to Ada. One
    approach that can be used is to create a C wrapper for each
    different profile and then interface to this C wrapper. For
    example, to print an ``int`` value using ``printf``,
    create a C function ``printfi`` that takes two arguments, a
    pointer to a string and an int, and calls ``printf``.
    Then in the Ada program, use pragma ``Import`` to
    interface to ``printfi``.

    It may work on some platforms to directly interface to
    a ``varargs`` function by providing a specific Ada profile
    for a particular call. However, this does not work on
    all platforms, since there is no guarantee that the
    calling sequence for a two argument normal C function
    is the same as for calling a ``varargs`` C function with
    the same two arguments.

.. index:: Convention Default

.. index:: Default

``Default``
  Equivalent to C.

.. index:: Convention External

.. index:: External

``External``
  Equivalent to C.

.. index:: C++
.. index:: Interfacing to C++

.. index:: Convention C++


``C_Plus_Plus`` (or ``CPP``)
  This stands for C++. For most purposes this is identical to C.
  See the separate description of the specialized GNAT pragmas relating to
  C++ interfacing for further details.

.. index:: Fortran
.. index:: Interfacing to Fortran
.. index:: Convention Fortran


``Fortran``
  Data will be passed according to the conventions described
  in section B.5 of the Ada Reference Manual.


``Intrinsic``
  This applies to an intrinsic operation, as defined in the Ada
  Reference Manual. If a pragma Import (Intrinsic) applies to a subprogram,
  this means that the body of the subprogram is provided by the compiler itself,
  usually by means of an efficient code sequence, and that the user does not
  supply an explicit body for it. In an application program, the pragma may
  be applied to the following sets of names:


  * Rotate_Left, Rotate_Right, Shift_Left, Shift_Right, Shift_Right_Arithmetic.
    The corresponding subprogram declaration must have
    two formal parameters. The
    first one must be a signed integer type or a modular type with a binary
    modulus, and the second parameter must be of type Natural.
    The return type must be the same as the type of the first argument. The size
    of this type can only be 8, 16, 32, or 64.


  * Binary arithmetic operators: '+', '-', '*', '/'.
    The corresponding operator declaration must have parameters and result type
    that have the same root numeric type (for example, all three are long_float
    types). This simplifies the definition of operations that use type checking
    to perform dimensional checks:


  .. code-block:: ada

      type Distance is new Long_Float;
      type Time     is new Long_Float;
      type Velocity is new Long_Float;
      function "/" (D : Distance; T : Time)
        return Velocity;
      pragma Import (Intrinsic, "/");

    This common idiom is often programmed with a generic definition and an
    explicit body. The pragma makes it simpler to introduce such declarations.
    It incurs no overhead in compilation time or code size, because it is
    implemented as a single machine instruction.


  * General subprogram entities. This is used  to bind an Ada subprogram
    declaration to
    a compiler builtin by name with back-ends where such interfaces are
    available. A typical example is the set of ``__builtin`` functions
    exposed by the GCC back-end, as in the following example:


    .. code-block:: ada

         function builtin_sqrt (F : Float) return Float;
         pragma Import (Intrinsic, builtin_sqrt, "__builtin_sqrtf");

    Most of the GCC builtins are accessible this way, and as for other
    import conventions (e.g. C), it is the user's responsibility to ensure
    that the Ada subprogram profile matches the underlying builtin
    expectations.

.. index:: Stdcall
.. index:: Convention Stdcall

``Stdcall``
  This is relevant only to Windows implementations of GNAT,
  and specifies that the ``Stdcall`` calling sequence will be used,
  as defined by the NT API. Nevertheless, to ease building
  cross-platform bindings this convention will be handled as a ``C`` calling
  convention on non-Windows platforms.

.. index:: DLL
.. index:: Convention DLL


``DLL``
  This is equivalent to ``Stdcall``.

.. index:: Win32
.. index:: Convention Win32


``Win32``
  This is equivalent to ``Stdcall``.

.. index:: Stubbed
.. index:: Convention Stubbed


``Stubbed``
  This is a special convention that indicates that the compiler
  should provide a stub body that raises ``Program_Error``.

GNAT additionally provides a useful pragma ``Convention_Identifier``
that can be used to parameterize conventions and allow additional synonyms
to be specified. For example if you have legacy code in which the convention
identifier Fortran77 was used for Fortran, you can use the configuration
pragma:

.. code-block:: ada

     pragma Convention_Identifier (Fortran77, Fortran);

And from now on the identifier Fortran77 may be used as a convention
identifier (for example in an ``Import`` pragma) with the same
meaning as Fortran.


.. _Building_Mixed_Ada_and_C++_Programs:

Building Mixed Ada and C++ Programs
-----------------------------------

A programmer inexperienced with mixed-language development may find that
building an application containing both Ada and C++ code can be a
challenge.  This section gives a few hints that should make this task easier.

.. _Interfacing_to_C++:

Interfacing to C++
^^^^^^^^^^^^^^^^^^

GNAT supports interfacing with the G++ compiler (or any C++ compiler
generating code that is compatible with the G++ Application Binary
Interface ---see http://www.codesourcery.com/archives/cxx-abi).

Interfacing can be done at 3 levels: simple data, subprograms, and
classes. In the first two cases, GNAT offers a specific ``Convention C_Plus_Plus``
(or ``CPP``) that behaves exactly like ``Convention C``.
Usually, C++ mangles the names of subprograms. To generate proper mangled
names automatically, see :ref:`Generating_Ada_Bindings_for_C_and_C++_headers`).
This problem can also be addressed manually in two ways:

* by modifying the C++ code in order to force a C convention using
  the ``extern "C"`` syntax.

* by figuring out the mangled name (using e.g. ``nm``) and using it as the
  Link_Name argument of the pragma import.

Interfacing at the class level can be achieved by using the GNAT specific
pragmas such as ``CPP_Constructor``.  See the :title:`GNAT_Reference_Manual` for additional information.

.. _Linking_a_Mixed_C++_and_Ada_Program:

Linking a Mixed C++ & Ada Program
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Usually the linker of the C++ development system must be used to link
mixed applications because most C++ systems will resolve elaboration
issues (such as calling constructors on global class instances)
transparently during the link phase. GNAT has been adapted to ease the
use of a foreign linker for the last phase. Three cases can be
considered:


* Using GNAT and G++ (GNU C++ compiler) from the same GCC installation:
  The C++ linker can simply be called by using the C++ specific driver
  called ``g++``.

  Note that if the C++ code uses inline functions, you will need to
  compile your C++ code with the :switch:`-fkeep-inline-functions` switch in
  order to provide an existing function implementation that the Ada code can
  link with.

  .. code-block:: sh

    $ g++ -c -fkeep-inline-functions file1.C
    $ g++ -c -fkeep-inline-functions file2.C
    $ gnatmake ada_unit -largs file1.o file2.o --LINK=g++


* Using GNAT and G++ from two different GCC installations: If both
  compilers are on the :envvar`PATH`, the previous method may be used. It is
  important to note that environment variables such as
  :envvar:`C_INCLUDE_PATH`, :envvar:`GCC_EXEC_PREFIX`,
  :envvar:`BINUTILS_ROOT`, and
  :envvar:`GCC_ROOT` will affect both compilers
  at the same time and may make one of the two compilers operate
  improperly if set during invocation of the wrong compiler.  It is also
  very important that the linker uses the proper :file:`libgcc.a` GCC
  library -- that is, the one from the C++ compiler installation. The
  implicit link command as suggested in the ``gnatmake`` command
  from the former example can be replaced by an explicit link command with
  the full-verbosity option in order to verify which library is used:

  .. code-block:: sh

    $ gnatbind ada_unit
    $ gnatlink -v -v ada_unit file1.o file2.o --LINK=c++

  If there is a problem due to interfering environment variables, it can
  be worked around by using an intermediate script. The following example
  shows the proper script to use when GNAT has not been installed at its
  default location and g++ has been installed at its default location:

  .. code-block:: sh

    $ cat ./my_script
    #!/bin/sh
    unset BINUTILS_ROOT
    unset GCC_ROOT
    c++ $*
    $ gnatlink -v -v ada_unit file1.o file2.o --LINK=./my_script


* Using a non-GNU C++ compiler: The commands previously described can be
  used to insure that the C++ linker is used. Nonetheless, you need to add
  a few more parameters to the link command line, depending on the exception
  mechanism used.

  If the ``setjmp`` / ``longjmp`` exception mechanism is used, only the paths
  to the ``libgcc`` libraries are required:

  .. code-block:: sh

    $ cat ./my_script
    #!/bin/sh
    CC $* gcc -print-file-name=libgcc.a gcc -print-file-name=libgcc_eh.a
    $ gnatlink ada_unit file1.o file2.o --LINK=./my_script


  where CC is the name of the non-GNU C++ compiler.

  If the "zero cost" exception mechanism is used, and the platform
  supports automatic registration of exception tables (e.g., Solaris),
  paths to more objects are required:

  .. code-block:: sh

    $ cat ./my_script
    #!/bin/sh
    CC gcc -print-file-name=crtbegin.o $* \\
    gcc -print-file-name=libgcc.a gcc -print-file-name=libgcc_eh.a \\
    gcc -print-file-name=crtend.o
    $ gnatlink ada_unit file1.o file2.o --LINK=./my_script


  If the "zero cost exception" mechanism is used, and the platform
  doesn't support automatic registration of exception tables (e.g., HP-UX
  or AIX), the simple approach described above will not work and
  a pre-linking phase using GNAT will be necessary.


Another alternative is to use the :command:`gprbuild` multi-language builder
which has a large knowledge base and knows how to link Ada and C++ code
together automatically in most cases.

.. _A_Simple_Example:

A Simple Example
^^^^^^^^^^^^^^^^

The following example, provided as part of the GNAT examples, shows how
to achieve procedural interfacing between Ada and C++ in both
directions. The C++ class A has two methods. The first method is exported
to Ada by the means of an extern C wrapper function. The second method
calls an Ada subprogram. On the Ada side, the C++ calls are modelled by
a limited record with a layout comparable to the C++ class. The Ada
subprogram, in turn, calls the C++ method. So, starting from the C++
main program, the process passes back and forth between the two
languages.

Here are the compilation commands:

.. code-block:: sh

     $ gnatmake -c simple_cpp_interface
     $ g++ -c cpp_main.C
     $ g++ -c ex7.C
     $ gnatbind -n simple_cpp_interface
     $ gnatlink simple_cpp_interface -o cpp_main --LINK=g++ -lstdc++ ex7.o cpp_main.o

Here are the corresponding sources:

.. code-block:: cpp

     //cpp_main.C

     #include "ex7.h"

     extern "C" {
       void adainit (void);
       void adafinal (void);
       void method1 (A *t);
     }

     void method1 (A *t)
     {
       t->method1 ();
     }

     int main ()
     {
       A obj;
       adainit ();
       obj.method2 (3030);
       adafinal ();
     }

.. code-block:: cpp

     //ex7.h

     class Origin {
      public:
       int o_value;
     };
     class A : public Origin {
      public:
       void method1 (void);
       void method2 (int v);
       A();
       int   a_value;
     };

.. code-block:: cpp

     //ex7.C

     #include "ex7.h"
     #include <stdio.h>

     extern "C" { void ada_method2 (A *t, int v);}

     void A::method1 (void)
     {
       a_value = 2020;
       printf ("in A::method1, a_value = %d \\n",a_value);
     }

     void A::method2 (int v)
     {
        ada_method2 (this, v);
        printf ("in A::method2, a_value = %d \\n",a_value);
     }

     A::A(void)
     {
        a_value = 1010;
       printf ("in A::A, a_value = %d \\n",a_value);
     }

.. code-block:: ada

     -- simple_cpp_interface.ads
     with System;
     package Simple_Cpp_Interface is
        type A is limited
           record
              Vptr    : System.Address;
              O_Value : Integer;
              A_Value : Integer;
           end record;
        pragma Convention (C, A);

        procedure Method1 (This : in out A);
        pragma Import (C, Method1);

        procedure Ada_Method2 (This : in out A; V : Integer);
        pragma Export (C, Ada_Method2);

     end Simple_Cpp_Interface;

.. code-block:: ada

     -- simple_cpp_interface.adb
     package body Simple_Cpp_Interface is

        procedure Ada_Method2 (This : in out A; V : Integer) is
        begin
           Method1 (This);
           This.A_Value := V;
        end Ada_Method2;

     end Simple_Cpp_Interface;


.. _Interfacing_with_C++_constructors:

Interfacing with C++ constructors
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In order to interface with C++ constructors GNAT provides the
``pragma CPP_Constructor`` (see the :title:`GNAT_Reference_Manual`
for additional information).
In this section we present some common uses of C++ constructors
in mixed-languages programs in GNAT.

Let us assume that we need to interface with the following
C++ class:

.. code-block:: cpp

     class Root {
     public:
       int  a_value;
       int  b_value;
       virtual int Get_Value ();
       Root();              // Default constructor
       Root(int v);         // 1st non-default constructor
       Root(int v, int w);  // 2nd non-default constructor
     };

For this purpose we can write the following package spec (further
information on how to build this spec is available in
:ref:`Interfacing_with_C++_at_the_Class_Level` and
:ref:`Generating_Ada_Bindings_for_C_and_C++_headers`).

.. code-block:: ada

     with Interfaces.C; use Interfaces.C;
     package Pkg_Root is
       type Root is tagged limited record
          A_Value : int;
          B_Value : int;
       end record;
       pragma Import (CPP, Root);

       function Get_Value (Obj : Root) return int;
       pragma Import (CPP, Get_Value);

       function Constructor return Root;
       pragma Cpp_Constructor (Constructor, "_ZN4RootC1Ev");

       function Constructor (v : Integer) return Root;
       pragma Cpp_Constructor (Constructor, "_ZN4RootC1Ei");

       function Constructor (v, w : Integer) return Root;
       pragma Cpp_Constructor (Constructor, "_ZN4RootC1Eii");
     end Pkg_Root;

On the Ada side the constructor is represented by a function (whose
name is arbitrary) that returns the classwide type corresponding to
the imported C++ class. Although the constructor is described as a
function, it is typically a procedure with an extra implicit argument
(the object being initialized) at the implementation level. GNAT
issues the appropriate call, whatever it is, to get the object
properly initialized.

Constructors can only appear in the following contexts:

* On the right side of an initialization of an object of type ``T``.
* On the right side of an initialization of a record component of type ``T``.
* In an Ada 2005 limited aggregate.
* In an Ada 2005 nested limited aggregate.
* In an Ada 2005 limited aggregate that initializes an object built in
  place by an extended return statement.

In a declaration of an object whose type is a class imported from C++,
either the default C++ constructor is implicitly called by GNAT, or
else the required C++ constructor must be explicitly called in the
expression that initializes the object. For example:

.. code-block:: ada

     Obj1 : Root;
     Obj2 : Root := Constructor;
     Obj3 : Root := Constructor (v => 10);
     Obj4 : Root := Constructor (30, 40);

The first two declarations are equivalent: in both cases the default C++
constructor is invoked (in the former case the call to the constructor is
implicit, and in the latter case the call is explicit in the object
declaration). ``Obj3`` is initialized by the C++ non-default constructor
that takes an integer argument, and ``Obj4`` is initialized by the
non-default C++ constructor that takes two integers.

Let us derive the imported C++ class in the Ada side. For example:

.. code-block:: ada

     type DT is new Root with record
        C_Value : Natural := 2009;
     end record;

In this case the components DT inherited from the C++ side must be
initialized by a C++ constructor, and the additional Ada components
of type DT are initialized by GNAT. The initialization of such an
object is done either by default, or by means of a function returning
an aggregate of type DT, or by means of an extension aggregate.

.. code-block:: ada

     Obj5 : DT;
     Obj6 : DT := Function_Returning_DT (50);
     Obj7 : DT := (Constructor (30,40) with C_Value => 50);

The declaration of ``Obj5`` invokes the default constructors: the
C++ default constructor of the parent type takes care of the initialization
of the components inherited from Root, and GNAT takes care of the default
initialization of the additional Ada components of type DT (that is,
``C_Value`` is initialized to value 2009). The order of invocation of
the constructors is consistent with the order of elaboration required by
Ada and C++. That is, the constructor of the parent type is always called
before the constructor of the derived type.

Let us now consider a record that has components whose type is imported
from C++. For example:

.. code-block:: ada

     type Rec1 is limited record
        Data1 : Root := Constructor (10);
        Value : Natural := 1000;
     end record;

     type Rec2 (D : Integer := 20) is limited record
        Rec   : Rec1;
        Data2 : Root := Constructor (D, 30);
     end record;

The initialization of an object of type ``Rec2`` will call the
non-default C++ constructors specified for the imported components.
For example:

.. code-block:: ada

     Obj8 : Rec2 (40);

Using Ada 2005 we can use limited aggregates to initialize an object
invoking C++ constructors that differ from those specified in the type
declarations. For example:

.. code-block:: ada

     Obj9 : Rec2 := (Rec => (Data1 => Constructor (15, 16),
                             others => <>),
                     others => <>);

The above declaration uses an Ada 2005 limited aggregate to
initialize ``Obj9``, and the C++ constructor that has two integer
arguments is invoked to initialize the ``Data1`` component instead
of the constructor specified in the declaration of type ``Rec1``. In
Ada 2005 the box in the aggregate indicates that unspecified components
are initialized using the expression (if any) available in the component
declaration. That is, in this case discriminant ``D`` is initialized
to value ``20``, ``Value`` is initialized to value 1000, and the
non-default C++ constructor that handles two integers takes care of
initializing component ``Data2`` with values ``20,30``.

In Ada 2005 we can use the extended return statement to build the Ada
equivalent to C++ non-default constructors. For example:

.. code-block:: ada

     function Constructor (V : Integer) return Rec2 is
     begin
        return Obj : Rec2 := (Rec => (Data1  => Constructor (V, 20),
                                      others => <>),
                              others => <>) do
           --  Further actions required for construction of
           --  objects of type Rec2
           ...
        end record;
     end Constructor;

In this example the extended return statement construct is used to
build in place the returned object whose components are initialized
by means of a limited aggregate. Any further action associated with
the constructor can be placed inside the construct.

.. _Interfacing_with_C++_at_the_Class_Level:

Interfacing with C++ at the Class Level
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

In this section we demonstrate the GNAT features for interfacing with
C++ by means of an example making use of Ada 2005 abstract interface
types. This example consists of a classification of animals; classes
have been used to model our main classification of animals, and
interfaces provide support for the management of secondary
classifications. We first demonstrate a case in which the types and
constructors are defined on the C++ side and imported from the Ada
side, and latter the reverse case.

The root of our derivation will be the ``Animal`` class, with a
single private attribute (the ``Age`` of the animal), a constructor,
and two public primitives to set and get the value of this attribute.

.. code-block:: cpp

     class Animal {
      public:
        virtual void Set_Age (int New_Age);
        virtual int Age ();
        Animal() {Age_Count = 0;};
      private:
        int Age_Count;
     };

Abstract interface types are defined in C++ by means of classes with pure
virtual functions and no data members. In our example we will use two
interfaces that provide support for the common management of ``Carnivore``
and ``Domestic`` animals:

.. code-block:: cpp

     class Carnivore {
     public:
        virtual int Number_Of_Teeth () = 0;
     };

     class Domestic {
     public:
        virtual void Set_Owner (char* Name) = 0;
     };

Using these declarations, we can now say that a ``Dog`` is an animal that is
both Carnivore and Domestic, that is:

.. code-block:: cpp

     class Dog : Animal, Carnivore, Domestic {
      public:
        virtual int  Number_Of_Teeth ();
        virtual void Set_Owner (char* Name);

        Dog(); // Constructor
      private:
        int  Tooth_Count;
        char *Owner;
     };

In the following examples we will assume that the previous declarations are
located in a file named :file:`animals.h`. The following package demonstrates
how to import these C++ declarations from the Ada side:

.. code-block:: ada

     with Interfaces.C.Strings; use Interfaces.C.Strings;
     package Animals is
       type Carnivore is limited interface;
       pragma Convention (C_Plus_Plus, Carnivore);
       function Number_Of_Teeth (X : Carnivore)
          return Natural is abstract;

       type Domestic is limited interface;
       pragma Convention (C_Plus_Plus, Domestic);
       procedure Set_Owner
         (X    : in out Domestic;
          Name : Chars_Ptr) is abstract;

       type Animal is tagged limited record
         Age : Natural;
       end record;
       pragma Import (C_Plus_Plus, Animal);

       procedure Set_Age (X : in out Animal; Age : Integer);
       pragma Import (C_Plus_Plus, Set_Age);

       function Age (X : Animal) return Integer;
       pragma Import (C_Plus_Plus, Age);

       function New_Animal return Animal;
       pragma CPP_Constructor (New_Animal);
       pragma Import (CPP, New_Animal, "_ZN6AnimalC1Ev");

       type Dog is new Animal and Carnivore and Domestic with record
         Tooth_Count : Natural;
         Owner       : Chars_Ptr;
       end record;
       pragma Import (C_Plus_Plus, Dog);

       function Number_Of_Teeth (A : Dog) return Natural;
       pragma Import (C_Plus_Plus, Number_Of_Teeth);

       procedure Set_Owner (A : in out Dog; Name : Chars_Ptr);
       pragma Import (C_Plus_Plus, Set_Owner);

       function New_Dog return Dog;
       pragma CPP_Constructor (New_Dog);
       pragma Import (CPP, New_Dog, "_ZN3DogC2Ev");
     end Animals;

Thanks to the compatibility between GNAT run-time structures and the C++ ABI,
interfacing with these C++ classes is easy. The only requirement is that all
the primitives and components must be declared exactly in the same order in
the two languages.

Regarding the abstract interfaces, we must indicate to the GNAT compiler by
means of a ``pragma Convention (C_Plus_Plus)``, the convention used to pass
the arguments to the called primitives will be the same as for C++. For the
imported classes we use ``pragma Import`` with convention ``C_Plus_Plus``
to indicate that they have been defined on the C++ side; this is required
because the dispatch table associated with these tagged types will be built
in the C++ side and therefore will not contain the predefined Ada primitives
which Ada would otherwise expect.

As the reader can see there is no need to indicate the C++ mangled names
associated with each subprogram because it is assumed that all the calls to
these primitives will be dispatching calls. The only exception is the
constructor, which must be registered with the compiler by means of
``pragma CPP_Constructor`` and needs to provide its associated C++
mangled name because the Ada compiler generates direct calls to it.

With the above packages we can now declare objects of type Dog on the Ada side
and dispatch calls to the corresponding subprograms on the C++ side. We can
also extend the tagged type Dog with further fields and primitives, and
override some of its C++ primitives on the Ada side. For example, here we have
a type derivation defined on the Ada side that inherits all the dispatching
primitives of the ancestor from the C++ side.

.. code-block:: ada

     with Animals; use Animals;
     package Vaccinated_Animals is
       type Vaccinated_Dog is new Dog with null record;
       function Vaccination_Expired (A : Vaccinated_Dog) return Boolean;
     end Vaccinated_Animals;

It is important to note that, because of the ABI compatibility, the programmer
does not need to add any further information to indicate either the object
layout or the dispatch table entry associated with each dispatching operation.

Now let us define all the types and constructors on the Ada side and export
them to C++, using the same hierarchy of our previous example:

.. code-block:: ada

     with Interfaces.C.Strings;
     use Interfaces.C.Strings;
     package Animals is
       type Carnivore is limited interface;
       pragma Convention (C_Plus_Plus, Carnivore);
       function Number_Of_Teeth (X : Carnivore)
          return Natural is abstract;

       type Domestic is limited interface;
       pragma Convention (C_Plus_Plus, Domestic);
       procedure Set_Owner
         (X    : in out Domestic;
          Name : Chars_Ptr) is abstract;

       type Animal is tagged record
         Age : Natural;
       end record;
       pragma Convention (C_Plus_Plus, Animal);

       procedure Set_Age (X : in out Animal; Age : Integer);
       pragma Export (C_Plus_Plus, Set_Age);

       function Age (X : Animal) return Integer;
       pragma Export (C_Plus_Plus, Age);

       function New_Animal return Animal'Class;
       pragma Export (C_Plus_Plus, New_Animal);

       type Dog is new Animal and Carnivore and Domestic with record
         Tooth_Count : Natural;
         Owner       : String (1 .. 30);
       end record;
       pragma Convention (C_Plus_Plus, Dog);

       function Number_Of_Teeth (A : Dog) return Natural;
       pragma Export (C_Plus_Plus, Number_Of_Teeth);

       procedure Set_Owner (A : in out Dog; Name : Chars_Ptr);
       pragma Export (C_Plus_Plus, Set_Owner);

       function New_Dog return Dog'Class;
       pragma Export (C_Plus_Plus, New_Dog);
     end Animals;

Compared with our previous example the only differences are the use of
``pragma Convention`` (instead of ``pragma Import``), and the use of
``pragma Export`` to indicate to the GNAT compiler that the primitives will
be available to C++. Thanks to the ABI compatibility, on the C++ side there is
nothing else to be done; as explained above, the only requirement is that all
the primitives and components are declared in exactly the same order.

For completeness, let us see a brief C++ main program that uses the
declarations available in :file:`animals.h` (presented in our first example) to
import and use the declarations from the Ada side, properly initializing and
finalizing the Ada run-time system along the way:

.. code-block:: cpp

     #include "animals.h"
     #include <iostream>
     using namespace std;

     void Check_Carnivore (Carnivore *obj) {...}
     void Check_Domestic (Domestic *obj)   {...}
     void Check_Animal (Animal *obj)       {...}
     void Check_Dog (Dog *obj)             {...}

     extern "C" {
       void adainit (void);
       void adafinal (void);
       Dog* new_dog ();
     }

     void test ()
     {
       Dog *obj = new_dog();  // Ada constructor
       Check_Carnivore (obj); // Check secondary DT
       Check_Domestic (obj);  // Check secondary DT
       Check_Animal (obj);    // Check primary DT
       Check_Dog (obj);       // Check primary DT
     }

     int main ()
     {
       adainit ();  test();  adafinal ();
       return 0;
     }

.. _Generating_Ada_Bindings_for_C_and_C++_headers:

Generating Ada Bindings for C and C++ headers
---------------------------------------------

.. index:: Binding generation (for C and C++ headers)
.. index:: C headers (binding generation)
.. index:: C++ headers (binding generation)

GNAT includes a binding generator for C and C++ headers which is
intended to do 95% of the tedious work of generating Ada specs from C
or C++ header files.

Note that this capability is not intended to generate 100% correct Ada specs,
and will is some cases require manual adjustments, although it can often
be used out of the box in practice.

Some of the known limitations include:

* only very simple character constant macros are translated into Ada
  constants. Function macros (macros with arguments) are partially translated
  as comments, to be completed manually if needed.
* some extensions (e.g. vector types) are not supported
* pointers to pointers or complex structures are mapped to System.Address
* identifiers with identical name (except casing) will generate compilation
  errors (e.g. ``shm_get`` vs ``SHM_GET``).

The code is generated using Ada 2012 syntax, which makes it easier to interface
with other languages. In most cases you can still use the generated binding
even if your code is compiled using earlier versions of Ada (e.g. ``-gnat95``).

.. _Running_the_binding_generator:

Running the Binding Generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The binding generator is part of the ``gcc`` compiler and can be
invoked via the :switch:`-fdump-ada-spec` switch, which will generate Ada
spec files for the header files specified on the command line, and all
header files needed by these files transitively. For example:

.. code-block:: sh

      $ g++ -c -fdump-ada-spec -C /usr/include/time.h
      $ gcc -c *.ads

will generate, under GNU/Linux, the following files: :file:`time_h.ads`,
:file:`bits_time_h.ads`, :file:`stddef_h.ads`, :file:`bits_types_h.ads` which
correspond to the files :file:`/usr/include/time.h`,
:file:`/usr/include/bits/time.h`, etc..., and will then compile these Ada specs
in Ada 2005 mode.

The :switch:`-C` switch tells ``gcc`` to extract comments from headers,
and will attempt to generate corresponding Ada comments.

If you want to generate a single Ada file and not the transitive closure, you
can use instead the :switch:`-fdump-ada-spec-slim` switch.

You can optionally specify a parent unit, of which all generated units will
be children, using :switch:`-fada-spec-parent={unit}`.

Note that we recommend when possible to use the *g++* driver to
generate bindings, even for most C headers, since this will in general
generate better Ada specs. For generating bindings for C++ headers, it is
mandatory to use the *g++* command, or *gcc -x c++* which
is equivalent in this case. If *g++* cannot work on your C headers
because of incompatibilities between C and C++, then you can fallback to
``gcc`` instead.

For an example of better bindings generated from the C++ front-end,
the name of the parameters (when available) are actually ignored by the C
front-end. Consider the following C header:

.. code-block:: c

     extern void foo (int variable);

with the C front-end, ``variable`` is ignored, and the above is handled as:

.. code-block:: c

     extern void foo (int);

generating a generic:

.. code-block:: ada

     procedure foo (param1 : int);

with the C++ front-end, the name is available, and we generate:

.. code-block:: ada

     procedure foo (variable : int);

In some cases, the generated bindings will be more complete or more meaningful
when defining some macros, which you can do via the :switch:`-D` switch. This
is for example the case with :file:`Xlib.h` under GNU/Linux:

.. code-block:: sh

      $ g++ -c -fdump-ada-spec -DXLIB_ILLEGAL_ACCESS -C /usr/include/X11/Xlib.h

The above will generate more complete bindings than a straight call without
the :switch:`-DXLIB_ILLEGAL_ACCESS` switch.

In other cases, it is not possible to parse a header file in a stand-alone
manner, because other include files need to be included first. In this
case, the solution is to create a small header file including the needed
``#include`` and possible ``#define`` directives. For example, to
generate Ada bindings for :file:`readline/readline.h`, you need to first
include :file:`stdio.h`, so you can create a file with the following two
lines in e.g. :file:`readline1.h`:

.. code-block:: cpp

      #include <stdio.h>
      #include <readline/readline.h>

and then generate Ada bindings from this file:

.. code-block:: sh

      $ g++ -c -fdump-ada-spec readline1.h


.. _Generating_bindings_for_C++_headers:

Generating Bindings for C++ Headers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Generating bindings for C++ headers is done using the same options, always
with the *g++* compiler. Note that generating Ada spec from C++ headers is a
much more complex job and support for C++ headers is much more limited that
support for C headers. As a result, you will need to modify the resulting
bindings by hand more extensively when using C++ headers.

In this mode, C++ classes will be mapped to Ada tagged types, constructors
will be mapped using the ``CPP_Constructor`` pragma, and when possible,
multiple inheritance of abstract classes will be mapped to Ada interfaces
(see the *Interfacing to C++* section in the :title:`GNAT Reference Manual`
for additional information on interfacing to C++).

For example, given the following C++ header file:

.. code-block:: cpp

       class Carnivore {
       public:
          virtual int Number_Of_Teeth () = 0;
       };

       class Domestic {
       public:
          virtual void Set_Owner (char* Name) = 0;
       };

       class Animal {
       public:
         int Age_Count;
         virtual void Set_Age (int New_Age);
       };

       class Dog : Animal, Carnivore, Domestic {
        public:
         int  Tooth_Count;
         char *Owner;

         virtual int  Number_Of_Teeth ();
         virtual void Set_Owner (char* Name);

         Dog();
       };

The corresponding Ada code is generated:

.. code-block:: ada

         package Class_Carnivore is
           type Carnivore is limited interface;
           pragma Import (CPP, Carnivore);

           function Number_Of_Teeth (this : access Carnivore) return int is abstract;
         end;
         use Class_Carnivore;

         package Class_Domestic is
           type Domestic is limited interface;
           pragma Import (CPP, Domestic);

           procedure Set_Owner
             (this : access Domestic;
              Name : Interfaces.C.Strings.chars_ptr) is abstract;
         end;
         use Class_Domestic;

         package Class_Animal is
           type Animal is tagged limited record
             Age_Count : aliased int;
           end record;
           pragma Import (CPP, Animal);

           procedure Set_Age (this : access Animal; New_Age : int);
           pragma Import (CPP, Set_Age, "_ZN6Animal7Set_AgeEi");
         end;
         use Class_Animal;

         package Class_Dog is
           type Dog is new Animal and Carnivore and Domestic with record
             Tooth_Count : aliased int;
             Owner : Interfaces.C.Strings.chars_ptr;
           end record;
           pragma Import (CPP, Dog);

           function Number_Of_Teeth (this : access Dog) return int;
           pragma Import (CPP, Number_Of_Teeth, "_ZN3Dog15Number_Of_TeethEv");

           procedure Set_Owner
             (this : access Dog; Name : Interfaces.C.Strings.chars_ptr);
           pragma Import (CPP, Set_Owner, "_ZN3Dog9Set_OwnerEPc");

           function New_Dog return Dog;
           pragma CPP_Constructor (New_Dog);
           pragma Import (CPP, New_Dog, "_ZN3DogC1Ev");
         end;
         use Class_Dog;


.. _Switches_for_Ada_Binding_Generation:

Switches
^^^^^^^^

.. index:: -fdump-ada-spec (gcc)

:switch:`-fdump-ada-spec`
  Generate Ada spec files for the given header files transitively (including
  all header files that these headers depend upon).

.. index:: -fdump-ada-spec-slim (gcc)

:switch:`-fdump-ada-spec-slim`
  Generate Ada spec files for the header files specified on the command line
  only.

.. index:: -fada-spec-parent (gcc)

:switch:`-fada-spec-parent={unit}`
  Specifies that all files generated by :switch:`-fdump-ada-spec` are
  to be child units of the specified parent unit.

.. index:: -C (gcc)

:switch:`-C`
  Extract comments from headers and generate Ada comments in the Ada spec files.

.. _Generating_C_Headers_for_Ada_Specifications:

Generating C Headers for Ada Specifications
-------------------------------------------

.. index:: Binding generation (for Ada specs)
.. index:: C headers (binding generation)

GNAT includes a C header generator for Ada specifications which supports
Ada types that have a direct mapping to C types. This includes in particular
support for:

* Scalar types
* Constrained arrays
* Records (untagged)
* Composition of the above types
* Constant declarations
* Object declarations
* Subprogram declarations

Running the C Header Generator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The C header generator is part of the GNAT compiler and can be invoked via
the :switch:`-gnatceg` combination of switches, which will generate a :file:`.h`
file corresponding to the given input file (Ada spec or body). Note that
only spec files are processed in any case, so giving a spec or a body file
as input is equivalent. For example:

.. code-block:: sh

   $ gcc -c -gnatceg pack1.ads

will generate a self-contained file called :file:`pack1.h` including
common definitions from the Ada Standard package, followed by the
definitions included in :file:`pack1.ads`, as well as all the other units
withed by this file.

For instance, given the following Ada files:

.. code-block:: ada

   package Pack2 is
      type Int is range 1 .. 10;
   end Pack2;

.. code-block:: ada

   with Pack2;

   package Pack1 is
      type Rec is record
         Field1, Field2 : Pack2.Int;
      end record;

      Global : Rec := (1, 2);

      procedure Proc1 (R : Rec);
      procedure Proc2 (R : in out Rec);
   end Pack1;

The above ``gcc`` command will generate the following :file:`pack1.h` file:

.. code-block:: c

   /* Standard definitions skipped */
   #ifndef PACK2_ADS
   #define PACK2_ADS
   typedef short_short_integer pack2__TintB;
   typedef pack2__TintB pack2__int;
   #endif /* PACK2_ADS */

   #ifndef PACK1_ADS
   #define PACK1_ADS
   typedef struct _pack1__rec {
     pack2__int field1;
     pack2__int field2;
   } pack1__rec;
   extern pack1__rec pack1__global;
   extern void pack1__proc1(const pack1__rec r);
   extern void pack1__proc2(pack1__rec *r);
   #endif /* PACK1_ADS */

You can then ``include`` :file:`pack1.h` from a C source file and use the types,
call subprograms, reference objects, and constants.

.. _GNAT_and_Other_Compilation_Models:

GNAT and Other Compilation Models
=================================

This section compares the GNAT model with the approaches taken in
other environents, first the C/C++ model and then the mechanism that
has been used in other Ada systems, in particular those traditionally
used for Ada 83.

.. _Comparison_between_GNAT_and_C/C++_Compilation_Models:

Comparison between GNAT and C/C++ Compilation Models
----------------------------------------------------

The GNAT model of compilation is close to the C and C++ models. You can
think of Ada specs as corresponding to header files in C. As in C, you
don't need to compile specs; they are compiled when they are used. The
Ada |with| is similar in effect to the ``#include`` of a C
header.

One notable difference is that, in Ada, you may compile specs separately
to check them for semantic and syntactic accuracy. This is not always
possible with C headers because they are fragments of programs that have
less specific syntactic or semantic rules.

The other major difference is the requirement for running the binder,
which performs two important functions. First, it checks for
consistency. In C or C++, the only defense against assembling
inconsistent programs lies outside the compiler, in a makefile, for
example. The binder satisfies the Ada requirement that it be impossible
to construct an inconsistent program when the compiler is used in normal
mode.

.. index:: Elaboration order control

The other important function of the binder is to deal with elaboration
issues. There are also elaboration issues in C++ that are handled
automatically. This automatic handling has the advantage of being
simpler to use, but the C++ programmer has no control over elaboration.
Where ``gnatbind`` might complain there was no valid order of
elaboration, a C++ compiler would simply construct a program that
malfunctioned at run time.

.. _Comparison_between_GNAT_and_Conventional_Ada_Library_Models:

Comparison between GNAT and Conventional Ada Library Models
-----------------------------------------------------------

This section is intended for Ada programmers who have
used an Ada compiler implementing the traditional Ada library
model, as described in the Ada Reference Manual.

.. index:: GNAT library

In GNAT, there is no 'library' in the normal sense. Instead, the set of
source files themselves acts as the library. Compiling Ada programs does
not generate any centralized information, but rather an object file and
a ALI file, which are of interest only to the binder and linker.
In a traditional system, the compiler reads information not only from
the source file being compiled, but also from the centralized library.
This means that the effect of a compilation depends on what has been
previously compiled. In particular:

* When a unit is |withed|, the unit seen by the compiler corresponds
  to the version of the unit most recently compiled into the library.

* Inlining is effective only if the necessary body has already been
  compiled into the library.

* Compiling a unit may obsolete other units in the library.

In GNAT, compiling one unit never affects the compilation of any other
units because the compiler reads only source files. Only changes to source
files can affect the results of a compilation. In particular:

* When a unit is |withed|, the unit seen by the compiler corresponds
  to the source version of the unit that is currently accessible to the
  compiler.

  .. index:: Inlining

* Inlining requires the appropriate source files for the package or
  subprogram bodies to be available to the compiler. Inlining is always
  effective, independent of the order in which units are compiled.

* Compiling a unit never affects any other compilations. The editing of
  sources may cause previous compilations to be out of date if they
  depended on the source file being modified.

The most important result of these differences is that order of compilation
is never significant in GNAT. There is no situation in which one is
required to do one compilation before another. What shows up as order of
compilation requirements in the traditional Ada library becomes, in
GNAT, simple source dependencies; in other words, there is only a set
of rules saying what source files must be present when a file is
compiled.


.. _Using_GNAT_Files_with_External_Tools:

Using GNAT Files with External Tools
====================================

This section explains how files that are produced by GNAT may be
used with tools designed for other languages.


.. _Using_Other_Utility_Programs_with_GNAT:

Using Other Utility Programs with GNAT
--------------------------------------

The object files generated by GNAT are in standard system format and in
particular the debugging information uses this format. This means
programs generated by GNAT can be used with existing utilities that
depend on these formats.

In general, any utility program that works with C will also often work with
Ada programs generated by GNAT. This includes software utilities such as
gprof (a profiling program), gdb (the FSF debugger), and utilities such
as Purify.


.. _The_External_Symbol_Naming_Scheme_of_GNAT:

The External Symbol Naming Scheme of GNAT
-----------------------------------------

In order to interpret the output from GNAT, when using tools that are
originally intended for use with other languages, it is useful to
understand the conventions used to generate link names from the Ada
entity names.

All link names are in all lowercase letters. With the exception of library
procedure names, the mechanism used is simply to use the full expanded
Ada name with dots replaced by double underscores. For example, suppose
we have the following package spec:

.. code-block:: ada

     package QRS is
        MN : Integer;
     end QRS;

.. index:: pragma Export

The variable ``MN`` has a full expanded Ada name of ``QRS.MN``, so
the corresponding link name is ``qrs__mn``.
Of course if a ``pragma Export`` is used this may be overridden:

.. code-block:: ada

     package Exports is
        Var1 : Integer;
        pragma Export (Var1, C, External_Name => "var1_name");
        Var2 : Integer;
        pragma Export (Var2, C, Link_Name => "var2_link_name");
     end Exports;

In this case, the link name for ``Var1`` is whatever link name the
C compiler would assign for the C function ``var1_name``. This typically
would be either ``var1_name`` or ``_var1_name``, depending on operating
system conventions, but other possibilities exist. The link name for
``Var2`` is ``var2_link_name``, and this is not operating system
dependent.

One exception occurs for library level procedures. A potential ambiguity
arises between the required name ``_main`` for the C main program,
and the name we would otherwise assign to an Ada library level procedure
called ``Main`` (which might well not be the main program).

To avoid this ambiguity, we attach the prefix ``_ada_`` to such
names. So if we have a library level procedure such as:

.. code-block:: ada

     procedure Hello (S : String);

the external name of this procedure will be ``_ada_hello``.
