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.
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:
|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 gnat.adc
file used to hold configuration
pragmas that apply to a complete compilation environment.
For more details on how the gnat.adc file is created and used
see Handling of Configuration Pragmas
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 .ads or .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:
$ 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.