ADA File Names vs. Package Names

2019-07-19 02:38发布

问题:

I inherited an ADA program where the source file names and package file names don't follow the default naming convention. ADA is new to me, so I may be missing something simple, but I can't see it in the GNAT Pro User's Guide. (This similar question didn't help me.)

Here are a couple of examples:

File Name:    C_Comm_Config_S.Ada
Package Name: Comm_Configuration

File Name:    D_Bus_Buffers_S.Ada
Package Name: Bus_Buffers

I think I have the _S.Ada and _B.Ada sorted out, but I can't find anything in the program source or build files that show the binding between the Package Name and the rest of the File Name.

When I compile a file that doesn't use any other packages, I get a warning: file name does not match unit name... This appears to be from the prefix of C_ or D_, in this particular case.

Also, I'm not clear if the prefixes C_ and D_ have any special meaning in the context of ADA, but if it does, I'd like to know about it.

So I appear to have two issues, the Prefix of C_ or D_ and in some cases the rest of the file name doesn't match the package.

回答1:

You could use gnatname: see the User’s Guide.

I copied subdirectories a/ and d/ from the ACATS test suite to a working directory and created a project file p.gpr:

project p is
   for source_dirs use ("a", "d");
end p;

and ran gnatname with

gnatname -P p -d a -d d \*.ada

which resulted in an edited p.gpr and two new files, p_naming.gpr and p_source_list.txt. These are rather long, but look like

p.gpr:

with "p_naming.gpr";

project P is

   for Source_List_File use "p_source_list.txt";
   for Source_Dirs use ("a", "d");

   package Naming renames P_Naming.Naming;

end P;

p_naming.gpr:

project P_Naming is

   for Source_Files use ();

   package Naming is
      for Body ("d4a004b") use "d4a004b.ada";
      for Body ("d4a004a") use "d4a004a.ada";
      for Body ("d4a002b") use "d4a002b.ada";
      ...
      for Body ("aa2010a_parent.boolean") use "aa2010a.ada" at 4;
      for Body ("aa2010a_parent") use "aa2010a.ada" at 3;
      for Spec ("aa2010a_parent") use "aa2010a.ada" at 2;
      for Spec ("aa2010a_typedef") use "aa2010a.ada" at 1;
      ...
      for Body ("a22006d") use "a22006d.ada";
      for Body ("a22006c") use "a22006c.ada";
      for Body ("a22006b") use "a22006b.ada”;
    end Naming;

 end P_Naming;

The for Body ("aa2010a_parent") use "aa2010a.ada" at 3; is used when there’s more than one unit in the source file.

p_source_list.txt:

a22006b.ada
a22006c.ada
a22006d.ada
a27003a.ada
a29003a.ada
...
d4a002b.ada
d4a004a.ada
d4a004b.ada

When building, for example, test d4a004b, you have to use the file name and suffix:

gnatmake -P p d4a004b.ada


回答2:

The Ada standard does not say anything about source file naming conventions. As it appears that you use GNAT, I assume that you mean the "GNAT default naming convention".

You can tell GNAT about alternatively named files in a Naming package inside your project files.

A simple example:

project OpenID is
   ...

   package Naming is
      for Implementation ("Util.Log.Loggers.Traceback")
        use "util-log-loggers-traceback-gnat.adb";
      for Implementation ("Util.Serialize.IO.XML.Get_Location") 
        use "util-serialize-io-xml-get_location-xmlada-4.adb";
   end Naming;
end OpenID;


标签: ada