覆盖带有.gpr项目的adb包体

时间:2015-06-30 11:22:25

标签: build-process ada gnat

我正在使用GNAT gprbuild。

我有一个项目文件 A.gpr ,项目文件 B.gpr

B.gpr 项目文件有可能是 A.gpr

B.gpr 的源文件 X.adb X.ads

A.gpr 定义主文件 Y.adb ,其中包含 X.ads

要求 A.gpr 必须与 B.gpr

仅扩展或修改 A.gpr ,我想使用其他 X.adb

我该怎么做?

到目前为止,我发现的最接近的是https://gcc.gnu.org/onlinedocs/gnat_ugn/Project-Extension.html

但是我仍然遇到错误:

unit "X" cannot belong to several projects

project "A" {overriding X.adb file path}

unit "X" already belongs to project "B" 

project "B" {original x.adb filepath}

2 个答案:

答案 0 :(得分:0)

如果文件(在这种情况下是不同的x.adb)位于不同的目录中,则可以使用case语句。 例如,在我的一些gpr文件中,我有以下几行:

  type OS_Type is ("Unix", "Windows");
  OS: OS_Type := external ("OS", "Unix");

  case OS is
  when "Unix"    =>
    for Source_Dirs use ("src", "src/unix");
  when "Windows" =>
    for Source_Dirs use ("src", "src/windows");
  end case;

如您所见,根据变量使用不同的源目录。

(操作系统默认为" Unix",设置您添加的变量 -Xvariable=value给你gprbuild调用[在这个例子中将是 -XOS=Windows])。

答案 1 :(得分:0)

这是一个根据项目变量使用路径和正文选择的示例:

project Example is

   for Object_Dir use "obj";
   for Exec_Dir use ".";
   type Language_Type is
      ("Spanish", "English");
   Language : Language_Type := external ("Language", "English");
   for Source_Dirs use ("src", "src/" & Language);
   for Main use ("testbed.adb");
   type Starts_Week_Type is
      ("mon", "tue", "wed", "thu", "fri", "sat", "sun");
   Starts_Week : Starts_Week_Type := external ("Starts_Week", "sun");

   package Ide is
      for Documentation_Dir use "doc";
   end Ide;

   package Prove is
      for Switches use ("-j4");
   end Prove;

   package Builder is
      for Default_Switches ("ada") use ("-j4", "-C", "-g");
   end Builder;

   package Compiler is
      for Default_Switches ("ada") use
        ("-gnato", "-fstack-check", "-gnatE", "-gnata", "-gnat12", "-g", "-gnatf");
   end Compiler;

   package Binder is
      for Default_Switches ("ada") use ("-shared");
   end Binder;

   package Linker is
      for Default_Switches ("ada") use ("-g");
   end Linker;

   package Naming is
      for Specification("Example.Types.Week") use
        "Example-types-"&Starts_Week&"_week.ada";
   end Naming;

end Example;

正如您所看到的,for Source_Dirs use ("src", "src/" & Language);行使srcsrc/Englishsrc/Spanish成为查找源文件时搜索/使用的目录。

稍后,在Naming中,我们有一个文件,其名称取决于被选为指定文件正文的项目变量。 - 即文件types-XXX_week.ada,其中XXXStarts_Week场景变量可能采用的三字母日缩写之一。