如何使用gnatmake编译规范_.ada和body .ada?

时间:2019-03-12 08:02:54

标签: gnu ada

gnatmake xx.ada xx_.ada     
gcc -c -x ada xx.ada      
xx.ada:44:14: warning: file name does not match unit name, should be 
"xx.adb"  
xx.ada:44:14: file "xx.ads" not found
gnatmake: "xx.ada" compilation error

尝试使用gnatmake ..编译不起作用。

2 个答案:

答案 0 :(得分:4)

除非有一些非常重要的理由必须遵循该文件命名约定,否则使用默认的GNAT约定会更加容易:规范文件名为.ads,主体文件{{1 }}。

实际上,当您说.adb时,会收到警告,提示文件名不符合预期,然后编译器继续;它会发现gnatmake xx.ada是一个程序包主体,然后去寻找规范(在xx.ada中,因为您没有告诉它任何不同的地方)而找不到它。

有一个实用程序 gnatname (请参阅here),您可以在您的源代码上运行(xx.ads对我有用,只有4个文件)以生成“配置文件“ gnatname *.ada”, gnatmake 首先读取该文件,以明确告诉它哪个文件包含哪些文件。我的测试结果是

gnat.adc

或者,您可以在GNAT Project Manager中使用等效项,例如编写一个项目文件。 pragma Source_File_Name (Linked_List, Body_File_Name => "linked_list.ada"); pragma Source_File_Name (Lists, Spec_File_Name => "lists_.ada"); pragma Source_File_Name (Lists, Body_File_Name => "lists.ada"); pragma Source_File_Name (Linked_List, Spec_File_Name => "linked_list_.ada"); 包含

t.gpr

并使用project T is package Naming is for Spec_Suffix ("ada") use "_.ada"; for Body_Suffix ("ada") use ".ada"; end Naming; end T; 进行编译。

(GNAT的较新版本包括实用程序 gprbuild ,该实用程序可以理解gnatmake -P t.gpr文件; gnatmake 会在发现后实际调用 gprbuild 它,所以您实际上在说的是.gpr。)

答案 1 :(得分:0)

要补充Simon Wright anwser,如果您能够编辑源文件,则需要一些其他提示。

根据here

Pragma Source_File_Name

报价链接:

  

使用它来覆盖常规命名约定。它是一个配置实用程序,因此也具有配置实用程序的通常适用性(即,它适用于整个分区,或者适用于编译中的所有单元,或者适用于单个单元,具体取决于使用方式。unit_name映射到file_name_literal。第二个参数的标识符是必需的,它指示这是规范还是正文的文件名。

  

Source_File_Name pragma的另一种形式允许指定定义替代文件命名方案的模式的规范应用于所有文件。

 pragma Source_File_Name
   (  [Spec_File_Name  =>] STRING_LITERAL
    [,[Casing          =>] CASING_SPEC]
    [,[Dot_Replacement =>] STRING_LITERAL]);

 pragma Source_File_Name
   (  [Body_File_Name  =>] STRING_LITERAL
    [,[Casing          =>] CASING_SPEC]
    [,[Dot_Replacement =>] STRING_LITERAL]);

 pragma Source_File_Name
   (  [Subunit_File_Name =>] STRING_LITERAL
    [,[Casing            =>] CASING_SPEC]
    [,[Dot_Replacement   =>] STRING_LITERAL]);

 CASING_SPEC ::= Lowercase | Uppercase | Mixedcase
  

第一个参数是一个包含单个星号的模式,该星号指示要在模式字符串中插入单元名称以形成文件名的位置。第二个参数是可选的。如果存在,它将在结果文件名字符串中指定单元名的大小写。默认为小写。最后,第三个参数允许使用指定的字符串文字系统替换单元名称中的任何点。

警告:

  

请注意,如果您使用的是项目文件,则不应使用Source_File_Name编译指示。该规则的原因是,项目经理不了解这些编译指示,因此其他使用projet的工具文件不会知道预期的命名约定。如果使用项目文件,则文件命名由Source_File_Name_Project编译指示控制,通常由项目管理器自动提供。杂注Source_File_Name_Project后不能出现杂注Source_File_Name。

据我所知,根据Simon的链接,这些似乎基本上就是gnatname所做的事,引述如下:

  

为帮助维护编译器中的编译单元名称和源文件名称之间的对应关系,GNAT提供了一个工具名称以生成一组文件所需的编译指示