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 (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.