ada-mode: No project files
6.1 No project files
====================
This example uses no project files.
First, create a directory ‘Example_1’, containing:
‘hello.adb’:
with Ada.Text_IO;
procedure Hello
is begin
Put_Line("Hello from hello.adb");
end Hello;
Yes, this is missing “use Ada.Text_IO;” - we want to demonstrate
compiler error handling.
‘hello_2.adb’:
with Hello_Pkg;
procedure Hello_2
is begin
Hello_Pkg.Say_Hello;
end Hello_2;
This file has no errors.
‘hello_pkg.ads’:
package Hello_Pkg is
procedure Say_Hello;
end Hello_Pkg;
This file has no errors.
‘hello_pkg.adb’:
with Ada.Text_IO;
package Hello_Pkg is
procedure Say_Hello
is begin
Ada.Text_IO.Put_Line ("Hello from hello_pkg.adb");
end Say_Hello;
end Hello_Pkg;
Yes, this is missing the keyword ‘body’; another compiler error
example.
In buffer ‘hello.adb’, invoke ‘Ada | Check file’. You should get a
‘*compilation*’ buffer containing something like (the directory paths
will be different):
cd c:/Examples/Example_1/
gnatmake -u -c -gnatc -g c:/Examples/Example_1/hello.adb -cargs -gnatq -gnatQ
gcc -c -Ic:/Examples/Example_1/ -gnatc -g -gnatq -gnatQ -I- c:/Examples/Example_1/hello.adb
hello.adb:4:04: "Put_Line" is not visible
hello.adb:4:04: non-visible declaration at a-textio.ads:264
hello.adb:4:04: non-visible declaration at a-textio.ads:260
gnatmake: "c:/Examples/Example_1/hello.adb" compilation error
If you have enabled font-lock, the lines with actual errors (starting
with ‘hello.adb’) are highlighted, with the file name in red.
Now type ‘C-x `’ (on a PC keyboard, <`> is next to <1>). Or you can
click the middle mouse button on the first error line. The compilation
buffer scrolls to put the first error on the top line, and point is put
at the place of the error in the ‘hello.adb’ buffer.
To fix the error, change the line to be
Ada.Text_IO.Put_Line ("hello from hello.adb");
Now invoke ‘Ada | Show main’; this displays ‘Ada mode main: hello’.
Now (in buffer ‘hello.adb’), invoke ‘Ada | Build’. You are prompted
to save the file (if you haven’t already). Then the compilation buffer
is displayed again, containing:
cd c:/Examples/Example_1/
gnatmake -o hello hello -g -cargs -gnatq -gnatQ -bargs -largs
gcc -c -g -gnatq -gnatQ hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -o hello.exe -g
The compilation has succeeded without errors; ‘hello.exe’ now exists
in the same directory as ‘hello.adb’.
Now invoke ‘Ada | Run’. A ‘*run*’ buffer is displayed, containing
Hello from hello.adb
Process run finished
That completes the first part of this example.
Now we will compile a multi-file project. Open the file
‘hello_2.adb’, and invoke ‘Ada | Set main and Build’. This finds an
error in ‘hello_pkg.adb’:
cd c:/Examples/Example_1/
gnatmake -o hello_2 hello_2 -g -cargs -gnatq -gnatQ -bargs -largs
gcc -c -g -gnatq -gnatQ hello_pkg.adb
hello_pkg.adb:2:08: keyword "body" expected here [see file name]
gnatmake: "hello_pkg.adb" compilation error
This demonstrates that gnatmake finds the files needed by the main
program. However, it cannot find files in a different directory, unless
you use an Emacs Ada mode project file to specify the other directories;
DONTPRINTYET Set source search path, or a GNAT project file; *noteUse GNAT
DONTPRINTYET Set source search path, or a GNAT project file; Use GNAT
project file.
Invoke ‘Ada | Show main’; this displays ‘Ada mode main: hello_2’.
Move to the error with ‘C-x `’, and fix the error by adding ‘body’:
package body Hello_Pkg is
Now, while still in ‘hello_pkg.adb’, invoke ‘Ada | Build’. gnatmake
successfully builds ‘hello_2’. This demonstrates that Emacs has
remembered the main file, in the project variable ‘main’, and used it
for the Build command.
Finally, again while in ‘hello_pkg.adb’, invoke ‘Ada | Run’. The
‘*run*’ buffer displays ‘Hello from hello_pkg.adb’.
One final point. If you switch back to buffer ‘hello.adb’, and
invoke ‘Ada | Run’, ‘hello_2.exe’ will be run. That is because ‘main’
is still set to ‘hello_2’, as you can see when you invoke ‘Ada | Project
| Edit’.
There are three ways to change ‘main’:
1. Invoke ‘Ada | Set main and Build’, which sets ‘main’ to the current
file.
2. Invoke ‘Ada | Project | Edit’, edit ‘main’, and click ‘[save]’
3. Invoke ‘Ada | Project | Load’, and load a project file that
specifies ‘main’