Спецификация не разрешает тело (удалить в файле gpr), не касаясь исходных файлов

Я получил следующую ошибку, которая характерна для сгенерированных источников:

spec of this package does not allow a body

Я хотел бы знать, существует ли правило для добавления в файл gpr игнорирования этой ошибки. Как флаг игнорирования. Как я уже упоминал, эти файлы генерируются, поэтому у меня нет на них прав (не разрешается их скрывать или переписывать). Более того, было бы неплохо иметь правило, работающее для каждого поколения.


person Brighter side    schedule 01.09.2017    source источник


Ответы (2)


Если бы вы собирали

package Guillaume is
end Guillaume;

package body Guillaume is
end Guillaume;

в режиме Ады 1983 вы получите, например.

gnatmake -gnat83 guillaume.ads
gcc -c -gnat83 guillaume.ads
guillaume.ada:1:09: warning: package "Guillaume" does not require a body
guillaume.ada:1:09: warning: body in file "guillaume.adb" will be ignored

Наличие тела, не требуемого спецификацией, было объявлено незаконным с Адой 95 (была бы возможность изменить тело и процесс компиляции не заметил бы, что его нужно перекомпилировать, что привело бы к путанице). Если ваш генератор кода был разработан для создания Ады 83, то, я думаю, вам, возможно, придется столкнуться с компиляцией в режиме Ады 83, но GNAT, насколько мне известно, не гарантирует 100% совместимость, особенно в отношении выполнения. система времени касается.

Действительно ли тела оскорбительных пакетов пусты? Если это так, вы можете перечислить их и использовать атрибут Excluded_Source_List_File в своем проекте. Если нет, у вас проблемы, потому что нет способа (без изменения исходников пакетов) заставить код в них выполняться.

(Позже): на самом деле Excluded_Source_List_File не помогает; он останавливает просмотр gprbuild в файле, но не в компиляторе; и именно компилятор отвергает тело. Извиняюсь. Но если бы вы могли составить такой список, вы могли бы использовать его для удаления плохих тел.

person Simon Wright    schedule 01.09.2017
comment
О, как плохо... Мои исходники находятся в Ada 95, и я не могу его изменить (критическое приложение реального времени). И проблема с исключенными файлами заключается в том, что мне нужно знать файлы, которые нужно исключить, прежде чем создавать gpr. Действительно, эти файлы генерируются. Решением может быть только сценарий создания исключенных файлов... - person Brighter side; 01.09.2017
comment
Но да, недопустимый пакет пуст. Содержит только комментарий - person Brighter side; 01.09.2017
comment
Excluded_Source_List_File принимает имя файла, который содержит список файлов, подлежащих исключению, который вы можете создавать при каждом запуске генерации без изменения gpr. - person Simon Wright; 01.09.2017
comment
Excluded_Source_List_File нельзя было поставить в файл gpr? - person Brighter side; 01.09.2017
comment
Если в спецификации нет ни процедуры, ни объявления функции, тело не должно использоваться, как упомянул Саймон. Однако вы можете добавить pragma Elaborate_Body в спецификацию в своем инструменте/скрипте генерации исходного кода, если это возможно. Эта прагма поддерживается в Аде 95 и более поздних версиях и сообщает компилятору обработать (т.е. обработать) тело, даже если спецификация пуста относительно. к подпрограммам. - person NeoSer; 01.09.2017
comment
См. обновленный ответ на вопрос: почему Excluded_Source_List_File не годится. - person Simon Wright; 01.09.2017
comment
Проблема с Excluded_Source_List_File заключается в том, что вам нужно знать все файлы, которые имеют пустое тело во время компиляции. В то время как компиляция идет после генерации. И поколение создает это бесполезное тело. Вот поэтому я и искал вариант, который чисто игнорирует эти кузова. Может быть, изменить инструмент, который создает тело, и добавить pragma Elaborate_Body, это сделает. Извините, что не ответил, мой интернет был недоступен. - person Brighter side; 06.09.2017

Вы можете исключить тело из списка исходных файлов:

for Excluded_Source_Files use ("my_body.adb");
person egilhh    schedule 01.09.2017
comment
Этого типа я и ожидал. Но существует ли он как флаг (который игнорируется каждый раз, когда спецификация не разрешает тело?) - person Brighter side; 01.09.2017
comment
Я мог бы сделать скрипт, который переписывает файл gpr после обнаружения файла, который не позволяет тело (например, анализировать ошибку компиляции). Но это не очень чистый метод программирования. - person Brighter side; 01.09.2017