.. 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
     Ada_2022
     Aggregate_Individually_Assign
     Allow_Integer_Address
     Annotate
     Assertion_Policy
     Assume_No_Invalid_Values
     C_Pass_By_Copy
     Check_Float_Overflow
     Check_Name
     Check_Policy
     Component_Alignment
     Convention_Identifier
     Debug_Policy
     Default_Scalar_Storage_Order
     Default_Storage_Pool
     Detect_Blocking
     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_Strict_Aliasing
     Normalize_Scalars
     Optimize_Alignment
     Overflow_Mode
     Overriding_Renamings
     Partition_Elaboration_Policy
     Persistent_BSS
     Prefix_Exception_Messages
     Priority_Specific_Dispatching
     Profile
     Profile_Warnings
     Queuing_Policy
     Rename_Pragma
     Restrictions
     Restriction_Warnings
     Reviewable
     Short_Circuit_And_Or
     Source_File_Name
     Source_File_Name_Project
     SPARK_Mode
     Style_Checks
     Suppress
     Suppress_Exception_Locations
     Task_Dispatching_Policy
     Unevaluated_Use_Of_Old
     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 either 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 some tools 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``, and all
project aware tools.

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://itanium-cxx-abi.github.io/cxx-abi/abi.html).

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 are mapped to System.Address
* identifiers with identical name (except casing) may 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

      $ gcc -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 then compile these Ada specs.
That is to say, the name of the Ada specs is in keeping with the relative path
under :file:`/usr/include/` of the header files. This behavior is specific to
paths ending with :file:`/include/`; in all the other cases, the name of the
Ada specs is derived from the simple name of the header files instead.

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}`.

The simple ``gcc``-based command works only for C headers. For C++ headers
you need to use either the ``g++`` command or the combination ``gcc -x c++``.

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

      $ gcc -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

      $ gcc -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 environments, 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``.
