Reputation: 1821
To learn the processes behind compilation of Ada programs (without resorting to using gpr
), I've decided to compile one of my projects manually. To compile a program, I run the following command on each .adb
file therein (not manually, however):
$ gcc -c src/<file>.adb -o obj/<file>.o
That compiles all the files and puts them in the obj
directory.
Or rather, it would. There is a slight problem with this. I have an archive (static library) that I've generated from another project, called libapples.a
, containing package Apples
. The Apples
package is used by the files you see me compiling above.
Since libapples.a
doesn't have source files anymore (given its archive format), it's not viable (not even possible) to provide the sources of that library to the command above using -I
switches; on the other hand, if I don't have the sources included, the command above comes back to me saying:
<file>.adb:<y>:<x>: file "apples.ads" not found
gnatmake: "src/<file>.adb" compilation error
I've attempted to include the library in the compilation process by using flags -L
and l
(which I believe is how you'd do it in C; feel free to correct me if I'm wrong). In another attempt I placed the archive right in the source directory.
How does one go about including a library in the compilation process?
Upvotes: 2
Views: 1400
Reputation: 39638
apples.ads
is somewhat like a header in C and you definitely need it for your file to compile. You should use -I
to point gcc to the directory where apples.ads
is located in.
Be aware that compiling an Ada source not only yields an object file, but also an Ada Library Information (.ali
) file. You'll need that for the next step. You should not use the -o
flag because it may lead to your .o
and .ali
files having different names.
On the other hand, since you only want to produce an object file, you should use -c
to tell gcc to only compile. In other languages like C, gcc compiles and links by default; in Ada, the process is more complex.
After compilation, you need to call gnatbind
on the .ali
file of your main program. This generates a package that will take care of proper initialization of everything. To do that, gnatbind
needs the .ali
file of the Apples
package! You can specify the .ali
search directory with -aO
.
Finally, gnatlink
called on the main .ali
file will link everything together. It figures out itself which object files and libraries it needs. It will append the necessary options to the linker, including the reference to libapples.a
. It also compiles the package generated by gnatlink
.
I don't know exactly what gnatlink
will do under the hood; you could probably compile the package generated by gnatbind
manually and then call the linker if you can figure out the proper arguments.
Upvotes: 5