Как скомпилировать spec _.ada и body .ada, используя gnatmake? - PullRequest
2 голосов
/ 12 марта 2019
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 ]

4 голосов
/ 12 марта 2019

Если нет действительно очень важной причины, по которой вы должны придерживаться этого соглашения об именах файлов, будет гораздо проще, если вы будете придерживаться соглашения GNAT по умолчанию: файлы спецификаций называются .ads, файлы тела .adb.

Когда вы говорите gnatmake xx.ada, вы получаете предупреждение о том, что имя файла не соответствует ожидаемому, и затем компилятор продолжает работу; он видит, что xx.ada является телом пакета, и начинает искать спецификацию (в xx.ads, потому что вы не сказали ему ничего другого) и не может найти ее.

Существует утилита gnatname (см. здесь ), которую вы можете запустить через свои источники (gnatname *.ada работал для меня, всего с 4 файлами), чтобы создать "файл конфигурации" "gnat.adc, gnatmake читает первым, чтобы явно указать, какой файл содержит что. В результате моего теста

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");

Или вы можете использовать эквивалент в GNAT Project Manager , написав файл проекта, например. t.gpr содержащий

project T is

   package Naming is
      for Spec_Suffix ("ada") use "_.ada";
      for Body_Suffix ("ada") use ".ada";
   end Naming;

end T;

и компиляция с gnatmake -P t.gpr.

(Более новые выпуски GNAT включают в себя утилиту gprbuild , которая распознает .gpr файлы; gnatmake фактически вызовет gprbuild , если найдет его, так что вы эффективно говорите gprbuild -P t.gpr.)

0 голосов
/ 14 марта 2019

В дополнение к Simon Wright anwser, если вы можете редактировать исходные файлы, некоторые дополнительные подсказки.

Как указано здесь

Pragma Source_File_Name

Ссылка для цитирования:

Используйте это, чтобы переопределить обычное соглашение об именах.Это прагма конфигурации, и поэтому она имеет обычную применимость прагм конфигурации (то есть она применяется либо ко всему разделу, либо ко всем модулям в компиляции, либо к одному модулю, в зависимости от того, как он используется.file_name_literal. Идентификатор второго аргумента является обязательным и указывает, является ли это именем файла для спецификации или для тела.

и

Другая формаПрагма Source_File_Name позволяет задавать шаблоны, определяющие альтернативные схемы именования файлов, для всех файлов.

 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 не может появиться после Pragma Source_File_Name_Project.

Насколько я могу судить, это, по-видимому, в основном то, что gnatname делает по ссылке Саймона, цитируя:

Чтобы помочь поддерживать соответствие между именами модулей компиляции и именами исходных файлов в компиляторе, GNAT предоставляет инструмент gnatname для генерации требуемых прагм для набора файлов .

...