[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
A typical development cycle when working on an Ada program consists of the following steps:
6.1 Running gnatmake
6.2 Switches for gnatmake
6.3 Mode Switches for gnatmake
6.4 Notes on the Command Line 6.5 How gnatmake
Works6.6 Examples of gnatmake
Usage
The third step can be tricky, because not only do the modified files
have to be compiled, but any files depending on these files must also be
recompiled. The dependency rules in Ada can be quite complex, especially
in the presence of overloading, use
clauses, generics and inlined
subprograms.
gnatmake
automatically takes care of the third and fourth steps
of this process. It determines which sources need to be compiled,
compiles them, and binds and links the resulting object files.
Unlike some other Ada make programs, the dependencies are always
accurately recomputed from the new sources. The source based approach of
the GNAT compilation model makes this possible. This means that if
changes to the source program cause corresponding changes in
dependencies, they will always be tracked exactly correctly by
gnatmake
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
The usual form of the gnatmake
command is
$ gnatmake [switches] file_name [file_names] [mode_switches] |
The only required argument is one file_name, which specifies
a compilation unit that is a main program. Several file_names can be
specified: this will result in several executables being built.
If switches
are present, they can be placed before the first
file_name, between file_names or after the last file_name.
If mode_switches are present, they must always be placed after
the last file_name and all switches
.
If you are using standard file extensions (.adb and .ads), then the
extension may be omitted from the file_name arguments. However, if
you are using non-standard extensions, then it is required that the
extension be given. A relative or absolute directory path can be
specified in a file_name, in which case, the input source file will
be searched for in the specified directory only. Otherwise, the input
source file will first be searched in the directory where
gnatmake
was invoked and if it is not found, it will be search on
the source path of the compiler as described in
3.3 Search Paths and the Run-Time Library (RTL).
All gnatmake
output (except when you specify
`-M') is to
`stderr'. The output produced by the
`-M' switch is send to
`stdout'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
You may specify any of the following switches to gnatmake
:
gcc
'. You need to use
quotes around compiler_name if compiler_name
contains
spaces or other separator characters. As an example `--GCC="foo -x
-y"' will instruct gnatmake
to use foo -x -y
as your
compiler. Note that switch `-c' is always inserted after your
command name. Thus in the above example the compiler command that will
be used by gnatmake
will be foo -c -x -y
.
If several `--GCC=compiler_name' are used, only the last
compiler_name is taken into account. However, all the additional
switches are also taken into account. Thus,
`--GCC="foo -x -y" --GCC="bar -z -t"' is equivalent to
`--GCC="bar -x -y -z -t"'.
gnatbind
'. You need to
use quotes around binder_name if binder_name contains spaces
or other separator characters. As an example `--GNATBIND="bar -x
-y"' will instruct gnatmake
to use bar -x -y
as your
binder. Binder switches that are normally appended by gnatmake
to
`gnatbind
' are now appended to the end of bar -x -y
.
gnatlink
'. You need to
use quotes around linker_name if linker_name contains spaces
or other separator characters. As an example `--GNATLINK="lan -x
-y"' will instruct gnatmake
to use lan -x -y
as your
linker. Linker switches that are normally appended by gnatmake
to
`gnatlink
' are now appended to the end of lan -x -y
.
gnatmake
does not check these files,
because the assumption is that the GNAT internal files are properly up
to date, and also that any write protected ALI files have been properly
installed. Note that if there is an installation problem, such that one
of these files is not up to date, it will be properly caught by the
binder.
You may have to specify this switch if you are working on GNAT
itself. The switch `-a' is also useful
in conjunction with `-f'
if you need to recompile an entire application,
including run-time files, using special configuration pragmas,
such as a Normalize_Scalars
pragma.
By default
gnatmake -a
compiles all GNAT
internal files with
gcc -c -gnatpg
rather than gcc -c
.
gnatmake
will attempt binding and linking
unless all objects are up to date and the executable is more recent than
the objects.
gnatmake
is invoked with this switch, it will create
a temporary mapping file, initially populated by the project manager,
if `-P' is used, otherwise initially empty.
Each invocation of the compiler will add the newly accessed sources to the
mapping file. This will improve the source search during the next invocation
of the compiler.
This switch cannot be used when using a project file.
gnatmake
compiles all object files and ALI files
into the current directory. If the `-i' switch is used,
then instead object files and ALI files that already exist are overwritten
in place. This means that once a large project is organized into separate
directories in the desired manner, then gnatmake
will automatically
maintain and update this organization. If no ALI files are found on the
Ada object path (3.3 Search Paths and the Run-Time Library (RTL)),
the new object and ALI files are created in the
directory containing the source being compiled. If another organization
is desired, where objects and sources are kept in different directories,
a useful technique is to create dummy ALI files in the desired directories.
When detecting such a dummy file, gnatmake
will be forced to
recompile the corresponding source file, and it will be put the resulting
object and ALI files in the directory where it found the dummy file.
gnatmake
will give you the full ordered
list of failing compiles at the end). If this is problematic, rerun
the make process with n set to 1 to get a clean list of messages.
gnatmake
terminates.
If gnatmake
is invoked with several `file_names' and with this
switch, if there are compilation errors when building an executable,
gnatmake
will not attempt to build the following executables.
gnatmake
ignores time
stamp differences when the only
modifications to a source file consist in adding/removing comments,
empty lines, spaces or tabs. This means that if you have changed the
comments in a source file or have simply reformatted it, using this
switch will tell gnatmake not to recompile files that depend on it
(provided other sources on which these files depend have undergone no
semantic modifications). Note that the debugging information may be
out of date with respect to the sources if the `-m' switch causes
a compilation to be switched, so the use of this switch represents a
trade-off between compilation time and accurate debugging information.
gnatmake -M
`-q'
(see below), only the source file names,
without relative paths, are output. If you just specify the
`-M'
switch, dependencies of the GNAT internal system files are omitted. This
is typically what you want. If you also specify
the `-a' switch,
dependencies of the GNAT internal files are also listed. Note that
dependencies of the objects in external Ada libraries (see switch
`-aL'dir in the following list)
are never reported.
This switch cannot be used when invoking gnatmake
with several
`file_names'.
gnatmake
are displayed.
This switch is recommended when Integrated Preprocessing is used.
gnatmake
decides are necessary.
external(name)
when parsing the project file.
See section 11.14 Switches Related to Project Files.
gcc
switches
gnatmake
switch
is passed to gcc
(e.g. `-O', `-gnato,' etc.)
Source and library search path switches:
gnatmake
to skip compilation units whose `.ALI'
files have been located in directory dir. This allows you to have
missing bodies for the units in dir and to ignore out of date bodies
for the same units. You still need to specify
the location of the specs for these units by using the switches
`-aIdir'
or `-Idir'.
Note: this switch is provided for compatibility with previous versions
of gnatmake
. The easier method of causing standard libraries
to be excluded from consideration is to write-protect the corresponding
ALI files.
gnatbind
.
gnatmake
was invoked.
The selected path is handled like a normal RTS path.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
The mode switches (referred to as mode_switches
) allow the
inclusion of switches that are to be passed to the compiler itself, the
binder or the linker. The effect of a mode switch is to cause all
subsequent switches up to the end of the switch list, or up to the next
mode switch, to be interpreted as switches to be passed on to the
designated component of GNAT.
gcc
. They will be passed on to
all compile steps performed by gnatmake
.
gnatbind
. They will be passed on to
all bind steps performed by gnatmake
.
gnatlink
. They will be passed on to
all link steps performed by gnatmake
.
gnatmake
,
regardless of any previous occurrence of `-cargs', `-bargs'
or `-largs'.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This section contains some additional useful notes on the operation
of the gnatmake
command.
gnatmake
finds no ALI files, it recompiles the main program
and all other units required by the main program.
This means that gnatmake
can be used for the initial compile, as well as during subsequent steps of
the development cycle.
gnatmake file.adb
, where `file.adb'
is a subunit or body of a generic unit, gnatmake
recompiles
`file.adb' (because it finds no ALI) and stops, issuing a
warning.
gnatmake
the switch `-I'
is used to specify both source and
library file paths. Use `-aI'
instead if you just want to specify
source paths only and `-aO'
if you want to specify library paths
only.
gnatmake
will ignore any files whose ALI file is write-protected.
This may conveniently be used to exclude standard libraries from
consideration and in particular it means that the use of the
`-f' switch will not recompile these files
unless `-a' is also specified.
gnatmake
has been designed to make the use of Ada libraries
particularly convenient. Assume you have an Ada library organized
as follows: obj-dir contains the objects and ALI files for
of your Ada compilation units,
whereas include-dir contains the
specs of these units, but no bodies. Then to compile a unit
stored in main.adb
, which uses this Ada library you would just type
$ gnatmake -aIinclude-dir -aLobj-dir main |
gnatmake
along with the
`-m (minimal recompilation)'
switch provides a mechanism for avoiding unnecessary rcompilations. Using
this switch,
you can update the comments/format of your
source files without having to recompile everything. Note, however, that
adding or deleting lines in a source files may render its debugging
info obsolete. If the file in question is a spec, the impact is rather
limited, as that debugging info will only be useful during the
elaboration phase of your program. For bodies the impact can be more
significant. In all events, your debugger will warn you if a source file
is more recent than the corresponding object, and alert you to the fact
that the debugging information may be out of date.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
Works
Generally gnatmake
automatically performs all necessary
recompilations and you don't need to worry about how it works. However,
it may be useful to have some basic understanding of the gnatmake
approach and in particular to understand how it uses the results of
previous compilations without incorrectly depending on them.
First a definition: an object file is considered up to date if the corresponding ALI file exists and if all the source files listed in the dependency section of this ALI file have time stamps matching those in the ALI file. This means that neither the source file itself nor any files that it depends on have been modified, and hence there is no need to recompile this file.
gnatmake
works by first checking if the specified main unit is up
to date. If so, no compilations are required for the main unit. If not,
gnatmake
compiles the main program to build a new ALI file that
reflects the latest sources. Then the ALI file of the main unit is
examined to find all the source files on which the main program depends,
and gnatmake
recursively applies the above procedure on all these
files.
This process ensures that gnatmake
only trusts the dependencies
in an existing ALI file if they are known to be correct. Otherwise it
always recompiles to determine a new, guaranteed accurate set of
dependencies. As a result the program is compiled "upside down" from what may
be more familiar as the required order of compilation in some other Ada
systems. In particular, clients are compiled before the units on which
they depend. The ability of GNAT to compile in any order is critical in
allowing an order of compilation to be chosen that guarantees that
gnatmake
will recompute a correct set of new dependencies if
necessary.
When invoking gnatmake
with several file_names, if a unit is
imported by several of the executables, it will be recompiled at most once.
Note: when using non-standard naming conventions
(see section 2.4 Using Other File Names), changing through a configuration pragmas
file the version of a source and invoking gnatmake
to recompile may
have no effect, if the previous version of the source is still accessible
by gnatmake
. It may be necessary to use the switch
-f.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gnatmake
Usage
gnatmake hello.adb
Hello
) and bind and link the
resulting object files to generate an executable file `hello'.
gnatmake main1 main2 main3
Main1
), `main2.adb'
(containing unit Main2
) and `main3.adb'
(containing unit Main3
) and bind and link the resulting object files
to generate three executable files `main1',
`main2'
and `main3'.
gnatmake -q Main_Unit -cargs -O2 -bargs -l
Compile all files necessary to bind and link the main program unit
Main_Unit
(from file `main_unit.adb'). All compilations will
be done with optimization level 2 and the order of elaboration will be
listed by the binder. gnatmake
will operate in quiet mode, not
displaying commands it is executing.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |