Если нет действительно очень важной причины, по которой вы должны придерживаться этого соглашения об именах файлов, будет гораздо проще, если вы будете придерживаться соглашения 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
.)