Ада-95. Компилятор GNAT

       

Импорт других проектов


Какой-либо компилируемый модуль расположенный в файле с исходным текстом, который принадлежит одному проекту, может зависить от компилируемых модулей расположенных в файлах с исходными текстами, которые принадлежат другим проектам.

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

Достижение такого эффекта заключено в синтаксисе, который подобен использованию спецификатора with в языке Ада.

При этом указываемыми в with сущностями являются строки, которые обозначают файлы проектов.

В качестве простого примера предположим, что два проекта GUI_Proj и Comm_Proj

описаны в файлах проектов "gui_proj.gpr" и "comm_proj.gpr", которые расположены в каталогах "/gui" и "/comm" соответственно.

Предположим также, что исходными файлами проекта GUI_Proj являются файлы "gui.ads" и "gui.adb", а исходными файлами проекта Comm_Proj являются файлы "comm.ads" и "comm.adb", и файлы каждого проекта размещаются в каталоге соответствующего проекта.

Для наглядности, представим схематическую диаграмму:

/gui gui_proj.gpr gui.ads gui.adb

/comm comm_proj.gpr comm.ads comm.adb

Предположим, что в каталоге "/app" необходимо разработать приложение, которое будет указывать в спецификаторе with пакеты GUI и Comm, используя свойства соответствующих файлов проекта (например, установки опций и указание каталога сохранения объектных файлов).



Скелет кода для головной процедуры приложения может иметь следующий вид:

with GUI, Comm; procedure App_Main is

... begin

... end App_Main;

Файл проекта приложения "app_proj.gpr", который позволяет добиться желаемого эффекта, может выглядеть следующим образом:

with "/gui/gui_proj", "/comm/comm_proj"; project App_Proj is

for Main use ("app_main"); end App_Proj;

Сборка исполняемого файла приложения может быть получена с помощью команды:




gnatmake -P/app/app_proj

При этом, генерация исполняемого модуля app_main

осуществляется в том же каталоге где располагается файл проекта "app_proj.gpr".

Когда импортируемый файл проекта использует стандартное расширение имени файла (gpr) указание расширение имени файла в предложении with файла проекта может быть опущено (как показано в примере выше).

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

Импортируемый файл проекта располагается в том же каталоге, в котором расположен импортирующий файл проекта.


  • Определена переменная окружения ADA_PROJECT_PATH, которая включает каталог содержащий необходимый файл проекта.

    Следовательно, при наличии переменной окружения ADA_PROJECT_PATH, которая включает каталоги "/gui" и "/comm", файл проекта приложения "app_proj.gpr", может быть написан следующим образом:

    with "gui_proj", "comm_proj"; project App_Proj is

    for Main use ("app_main"); end App_Proj;

    Следует учитывать, что способность импорта других проектов обладает потенциальной двусмысленностью.

    Например, один и тот же модуль может присутствовать в различных импортируемых проектах, или такой модуль может присутствовать как в импортируемом проекте, так и в импортирующем проекте.

    Оба случая являются условием возникновения ошибки.

    Следует заметить, что для текущей версии менеджера проектов GNAT (версия 3.15) наличие двусмысленного модуля является недопустимым даже тогда, когда импортирующий проект не содержит обращений к этому модулю.

    Это строгое правило может быть ослаблено в последующих реализациях менеджера проектов.


    Содержание раздела