Проект библиотеки Ada GPR: почему не работает gprinstall? - PullRequest
0 голосов
/ 21 мая 2018

У меня есть проект библиотеки GPR, который строится успешно (статический или динамический тип здесь не имеет значения).Я знаю, что gprinstall предоставляет средства для управления доставкой библиотеки, например:

  1. готовит файл GPR для использования библиотеки
  2. предоставляет файл библиотеки (.a или.dll) в соответствии с условиями, указанными в исходном GPR (определенные каталоги)
  3. предоставляют файлы интерфейса библиотеки в соответствии с аналогичными условиями

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

Однако мне не удается заставить работать gprinstall.Следующая команда

E:\DEV\Projets\Ada\LibA>gprinstall --dry-run -p -m -f -P LibA.gpr

дает только:

Install project LibA

Опция -v verbose не дает ни единого небольшого фрагмента подсказки.(проект, очевидно, успешно построен, и файлы кода на самом деле не актуальны для понимания)


Вот мои файлы GPR:

with "../Production_Options/Production_Options.gpr";
with "../InterfaceA/InterfaceA.gpr";

library project LibA is
   for Source_Dirs       use ("src") & InterfaceA.Interface_Files;
   for Object_Dir        use "obj";
   for Library_Name      use project'Name;
   for Library_Dir       use "Library";
   for Library_Ali_Dir   use "Library_Ali";
   for Library_Src_Dir   use "Public_Interfaces";
   for Library_Interface use (InterfaceA.Interface_Name);
   for Library_Kind      use "static";

   package Install extends Production_Options.Install is
      for Prefix use Production_Options.Install'Prefix & Production_Options.Install.Install_Libs & project'Name;
      for Mode use "dev";
      for Side_Debug use "true";
   end Install;
   -- various renames of Productions_Options
end LibA;

project InterfaceA is

   Interface_Files := (project'Project_Dir & "src");
   Interface_Name  := "InterfaceA";

   for Source_Dirs use ();

end InterfaceA;

Мои параметры GPR:

project Production_Options is
   for Source_Dirs use ();
   -- various switches for compiler, builder, clean, binder, ide, linker, namling, pretty printer ...
   package Install is
      Install_Root := "../INSTALL_BUILDS/";
      Install_Exe  := "EXECUTABLES/";
      Install_Libs := "LIBS/";
      Install_Root_Exe  := Install_Root & Install_Exe;
      Install_Root_Libs := Install_Root & Install_Libs;
      for Prefix         use Install_Root;
      for Lib_Subdir     use "BIN";
      for Ali_Subdir     use "ALI";
      for Sources_Subdir use "SRC";
      for Project_Subdir use "GPR";
   end Install;
end Production_Options;

1 Ответ

0 голосов
/ 21 мая 2018

Поэкспериментировав с параметрами пакета Install и командной строкой, я наконец понял несколько вещей:

  1. Опция for Mode use "dev" в файле GPR делает инструмент gprinstall полностьюонемение.Во-первых, я не смог найти надежную документацию для этого на Adacore (http://docs.adacore.com/gprbuild-docs/html/gprbuild_ug/gnat_project_manager.html#installing-a-library-with-project-files), но здесь было немного яснее https://docs.adacore.com/gprbuild-docs/html/gprbuild_ug/companion_tools.html#installing-with-gprinstall
  2. gprinstall копирует ВСЕ источники по умолчанию (-a активирован по умолчанию)). Вы можете изменить это, используя ключ командной строки -m.
  3. папка, указанная в Install_Root := "../INSTALL_BUILDS/";, вычисляется, начиная с пути бина GNAT (из-за переменной среды: PATH=E:\DEV\GNAT\2017\bin;...)
  4. Иерархия папок, вызванная параметрами пакета Install, предназначена для нескольких доставок gprinstall. Я указал это ниже в части комментариев GPR Production_Options.

С этими GPR:

library project LibA is
   for Source_Dirs       use ("src") & InterfaceA.Interface_Files;
   for Object_Dir        use "obj";
   for Library_Name      use project'Name;
   for Library_Dir       use "Library";
   for Library_Ali_Dir   use "Library_Ali";
   for Library_Src_Dir   use "Public_Interfaces";
   for Library_Interface use (InterfaceA.Interface_Name);
   for Library_Kind      use "static";

   package Install extends Production_Options.Install is
      for Prefix use Production_Options.Install.Install_Root_Libs;

      -- makes gprinstall silent and numb in --dry-run mode ?!
      -- for Mode use "dev";
      for Side_Debug use "true";
   end Install;
   -- various renames of Productions_Options
end LibA;

project Production_Options is
   package Install is
      Install_Root := project'Project_Dir & "../INSTALL_BUILDS/";
      Install_Exe  := "EXECUTABLES/";
      Install_Libs := "LIBS/";
      Install_Root_Exe  := Install_Root & Install_Exe;
      Install_Root_Libs := Install_Root & Install_Libs;
      for Prefix         use Install_Root;
      for Exec_Subdir    use "EXE";
      for Lib_Subdir     use "BIN";
      for Ali_Subdir     use "ALI";
      for Sources_Subdir use "SRC";
      for Project_Subdir use "GPR";
      --
      -- |                      with my settings: |_INSTALL_BUILDS
      -- |_Prefix                                   |_LIBS
      --      |_Exec_Subdir                           |_Exec_Subdir
      --        |_liba                                  |_liba would contain exe if it was an exe project
      --      |_Lib_Subdir                            |_Lib_Subdir
      --         |_liba                                 |_liba contains the .a file
      --      |_Ali_Subdir                            |_Ali_Subdir
      --        |_liba                                  |_liba contains the ali files
      --      |_Sources_Subdir                        |_Sources_Subdir
      --         |_liba                                 |_liba contains the src files
   end Install;
end Production_Options;

Команда gprinstall -m --dry-run -p -f -P LibA.gpr теперь работает правильно.

Вот вывод, который вы можете получить:

E:\DEV\Projets\Ada\LibA>gprinstall -d -m -p -f -P LibA.gpr
Install project LibA
cp E:\DEV\Projets\Ada\InterfaceA\src\InterfaceA.ads E:\DEV\GNAT\INSTALL_BUILDS\LIBS\SRC\liba\interfacea.ads
cp E:\DEV\Projets\Ada\LibA\Library_Ali\interfacea.ali E:\DEV\GNAT\INSTALL_BUILDS\LIBS\ALI\liba\interfacea.ali
cp E:\DEV\Projets\Ada\LibA\Library\libliba.a E:\DEV\GNAT\INSTALL_BUILDS\LIBS\BIN\liba\libliba.a

Project E:\DEV\GNAT\INSTALL_BUILDS\LIBS\GPR\liba\LibA.gpr would be installed

--  This project has been generated by GPRINSTALL GPL 2017 (20170515) (i686-pc-mingw32)
library project LibA is
   type BUILD_KIND is ("default");
   BUILD : BUILD_KIND := external("LIBA_BUILD", "default");
   for Languages use ("Ada");
   case BUILD is
      when "default" =>
         for Source_Dirs use ("../SRC/");
         for Library_Dir use "../BIN/";
         for Library_ALI_Dir use "../ALI/";
         for Library_Kind use "static";
         for Library_Interface use ("interfacea");
   end case;
   for Library_Name use "liba";
   package Naming is
      for dot_replacement use "-";
      for casing use "MixedCase";
      case BUILD is
         when "default" =>
            for body_suffix ("ada") use ".adb";
            for spec_suffix ("ada") use ".ads";
      end case;
   end Naming;
   package Linker is
      case BUILD is
         when "default" =>
            null;
      end case;
   end Linker;
   package Install is
      for Active use "False";
   end Install;
   for Externally_Built use "True";
end LibA;

Здесь можно найти полные источники: https://github.com/LoneWanderer-GH/Samples-GPR-Aggregate-Libs

...