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

       

Утилита gnatmake и файлы проектов


Рассмотрим два вопроса, которые касаются утилиты gnatmake и файлов проектов: описание опций для утилиты gnatmake и всех инструментальных средств, запуск которых она осуществляет; использование атрибута Main.

Для каждого пакета: Builder, Compiler, Binder и Linker, - можно указать атрибуты Default_Switches и Switches.

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

Ниже будет показано, что эти ориентированные на пакеты опции предшествуют опциям, которые передаются в командную строку запуска утилиты gnatmake.

Атрибут Default_Switches является ассоциативным массивом, который индексируется именем языка программирования (не зависимо от регистра символов) и возвращает значение в виде списка строк. Например:

package Compiler is

for Default_Switches ("Ada") use ("-gnaty", "-v"); end Compiler;

Атрибут Switches также вляется ассоциативным массивом. Он индексируется именем файла (которое зависит или не зависит от регистра символов, в зависимости от используемой операционной системы) и возвращает значение в виде списка строк. Например:

package Builder is

for Switches ("main1.adb") use ("-O2"); for Switches ("main2.adb") use ("-g"); end Builder;



Для пакета Builder, имена файлов должны обозначать исходные файлы головных подпрограмм. Для пакетов Binder и Linker, имена файлов должны обозначать файлы "ALI" или исходные файлы головных подпрограмм. В каждом случае применимо только самостоятельное имя файла (без явного указания расширения имени файла).

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




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

В частности, опции, которые каждый такой пакет определяет для указанного файла F, включают:

  • значение атрибута "Switches (F)", когда он указан в пакете для данного файла

  • в противном случае, значение атрибута "Default_Switches ("Ada")", когда он указан в пакете

    Когда внутри пакета ни один их этих атрибутов не описан. пакет не указывает никаких опций для данного файла.

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


    1. набор опций, которые определены для этого файла в пакете Builder

    2. набор опций, которые были переданы в командной строке


    Когда, для обработки файла, утилита gnatmake осуществляет запуск какого-либо инструментального средства (компилятор, редактор связей, компоновщик) набор опций, которые передаютсяя инструментальному средству, состоит из трех множеств, располагаемых в следующем порядке:

  • набор опций, которые определены для этого файла в пакете Builder

    файла проекта, заданного в командной строке
  • набор опций, которые определены для этого файла внутри пакета соответствующего инструментального средства (в соответствующем файле проекта)
  • набор опций, которые были переданы в командной строке

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

    Утилита gnatmake может осуществлять запуск компилятора для обработки исходных файлов различных проектов. Менеджер проектов GNAT будет использовать соответствующий файл проекта, чтобы определить пакет Compiler

    для каждого исходного файла, который нуждается в компиляции. То же самое справедливо для пакетов Binder (редактор связей) и Linker (компоновщик).

    В качестве примера, рассмотрим пакет Compiler



    в показанном ниже файле проекта:

    project Proj1 is

    package Compiler is

    for Default_Switches ("Ada") use ("-g"); for Switches ("a.adb") use ("-O1"); for Switches ("b.adb") use ("-O2", "-gnaty"); end Compiler; end Proj1;

    В этом случае, при запуске утилиты gnatmake с указанием этого файла проекта, когда необходимо осуществить компиляцию файлов "a.adb", "b.adb" и "c.adb", файл "a.adb" будет компилироваться с опцией "-O1", файл "b.adb" будет компилироваться с опциями "-O2" и "-gnaty", а файл "c.adb" будет компилироваться с опцией "-g".

    Следующий пример демонстрирует упорядочивание опций, которые предоставлены различными пакетами:

    project Proj2 is

    package Builder is

    for Switches ("main.adb") use ("-g", "-O1", "-f"); end Builder;

    packager Compiler is

    for Switches ("main.adb") use ("-O2"); end Compiler; end Proj2;

    При использовании команды:

    gnatmake -PProj2 -O0 main

    Компилятор будет запущен для компиляции "main.adb" с указанием следующей последовательности опций командной строки:

    -g -O1 -O2 -O0

    В этом случае, последняя опция "-O" будет иметь приоритет перед всеми предыдущими опциями "-O". Некоторые другие опции (например, такие как "-c") будут добавлены неявно.

    В рассматриваемом примере, опции "-g" и "-O1" обеспечиваются пакетом Builder, опция "-O2" обеспечена пакетом Compiler, а опция "-O0" была указана в командной строке.

    Следует заметить, что опция "-g" будет также передаваться при запуске gnatlink.

    Заключительный пример демонстрирует предоставление опций из пакетов, которые описаны в различных файлах проектов:

    project Proj3 is

    for Source_Files use ("pack.ads", "pack.adb"); package Compiler is

    for Default_Switches ("Ada") use ("-gnata"); end Compiler; end Proj3;

    with "Proj3"; project Proj4 is

    for Source_Files use ("foo_main.adb", "bar_main.adb"); package Builder is

    for Switches ("foo_main.adb") use ("-s", "-g"); end Builder; end Proj4;

    -- Ada source file: with Pack; procedure Foo_Main is

    ... end Foo_Main;

    <


    При использовании команды:

    gnatmake -PProj4 foo_main.adb -cargs -gnato

    Передаваемыми компилятору опциями, для компиляции "foo_main.adb", являются опция "-g" (обеспечивается пакетом Proj4.Builder) и опция "-gnato" (передается из командной строки).

    При компиляции импортируемого Ада-пакета Pack, будут использоваться опция "-g" (из пакета Proj4.Builder), опция "-gnata" (из пакета Proj3.Compiler) и опция "-gnato" (передается из командной строки).

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

    gnatmake -Pprj main1 main2 main3

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

    В этом случае, полученный результат будет зависесть от наличия описания атрибута Main.

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

    Когда атрибут Main описан в файле проекта как не пустой список строк и в командной строке запуска утилиты gnatmake не указана опция "-u", запуск gnatmake, - с указанием такого файла проекта, но без указания в командной строке какой-либо головной подпрограммы, - является эквивалентным запуску gnatmake с указанием в командной строке всех имен файлов, которые указываются атрибутом Main.

    Например:

    project Prj is

    for Main use ("main1", "main2", "main3"); end Prj;

    Для показанного выше примера, команда "gnatmake -Pprj" будет эквивалентна команде "gnatmake -Pprj main1 main2 main3".

    Когда файл проекта не содержит описание атрибута Main, или этот атрибут описан как пустой список строк, или в командной строке указана опция "-u", и запуск утилиты gnatmake осуществляется без указания в командной строке какой-либо головной подпрограммы, будет осуществлена проверка всех непосредственных исходных файлов проекта и, потенциально, они будут перекомпилированы.

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

    Другими словами, опция "-u" применяется ко всем непосредственным исходным файлам главного файла проекта.


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