Указание другого пакета для конкретной платформы во время компиляции в Ada (GNAT) - PullRequest
4 голосов
/ 23 июля 2010

Я все еще новичок в мире программирования Ada, так что простите, если этот вопрос очевиден.

Я смотрю на разработку приложения (в Ada, использующего функции версии 2005), которое считывает данные с последовательного порта и в основном выполняет манипуляции со строками и числами, которые оно получает от внешнего устройства.

Теперь я намеревался использовать интерфейсы терминала Florist и POSIX для выполнения всей последовательной работы в Linux в первую очередь ... Я доберусь до Windows / MacOS / etc ... как-нибудь в другой раз, но я хочу уйти эта опция открыта.

Я бы хотел следовать лучшим практикам Ады во всем, что я делаю с этим. Таким образом, вместо условной компиляции под хаком под C (которую, я знаю, у Ады в любом случае нет), я хотел бы выяснить, как вы предполагаете указывать изменение в файлах пакетов из командной строки (например, gnatmake)?

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

Это способ, которым я был показан для GCC с использованием C / C ++ ... это все еще лучший способ для Ada с использованием GNAT?.

Спасибо, -Josh

Ответы [ 3 ]

5 голосов
/ 23 июля 2010

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

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

3 голосов
/ 24 июля 2010

Вы можете использовать файл проекта GNAT package Naming: выдержка из реального примера, где я хотел выбрать между двумя версиями пакета в одном каталоге, одна с дополнениями отладки, это

...
type Debug_Code is ("no", "yes");
Debug : Debug_Code := External ("DEBUG", "no");
...
package Naming is
   case Debug is
      when "yes" =>
         for Spec ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.ads-debug";
         for Body ("BC.Support.Managed_Storage")
           use "bc-support-managed_storage.adb-debug";
      when "no" =>
         null;
   end case;
end Naming;

Чтобы выбрать специальное именование, установите для переменной среды DEBUG значение yes или выполните сборку с помощью gnatmake -XDEBUG=yes.

2 голосов
/ 24 июля 2010

Да, общепринятый способ справиться с этим в Ada - это сделать это с разными файлами, выбранными вашей системой сборки. Gnu make является практически мультиплатформенным и может позволить вам создавать разные файлы (с разными именами и / или каталогами и т. Д.) В разных конфигурациях.

На самом деле, я считаю, что это превосходный способ (более #ifdef с) сделать это и в Си.

...