在 Adacore 的 GPR 文件中,如何设置编译器以排除具有完整路径的文件

In Adacore's GPR file, how can I set the compiler to exclude file with full path

我有一个项目,其中包含多个同名但位于不同文件夹中的文件。

例如:

 ->sources
    ->src 
      - a.c
      - b.c
    ->stub
      - a.c
      - z.c

在我的 gprfile 中,我将源代码包含在

for Source_Dirs use ( "sources/**" )

现在,我想使用原语 "Excluded_Source_File" 忽略 src 中的文件。

不幸的是,这个原语需要一个文件名,而不是完整路径,所以当我想忽略a.c时,它忽略了 src 和 stub 中的两个文件。

for Excluded_Source_Files use ( "sources/src/a.c" ); -- KO by gprbuild
for Excluded_Source_Files use ( "a.c" ); -- OK but ignore both

有谁知道如何在不改变当前文件夹架构和不重命名文件的情况下执行此操作?

听起来您想要的是项目扩展,即。创建第二个项目文件,它扩展了第一个。在这秒项目文件中,您可以覆盖 a.c

project Stubbed extends "my_project.gpr" is
   for Source_Dirs use ("stub");
end Stubbed;

您可以在 GPRBuild User Guide

中阅读有关项目扩展的更多信息

我会用scenario variables;另外,听起来好像 Excluded_Source_Dirs 会有用。

type Source_T is ("normal", "stubbed");
Sources : Source_T := external ("SOURCES", "normal");

然后

for Source_Dirs use ("sources/**");
case Sources is
   when "normal" =>
      for Excluded_Source_Dirs use ("sources/stub");
   when "stubbed" =>
      for Excluded_Source_Dirs use ("sources/src");
end case;

for Source_Dirs use ("sources");
case Sources is
   when "normal" =>
      for Source_Dirs use project'Source_Dirs & "sources/src";
   when "stubbed" =>
      for Source_Dirs use project'Source_Dirs & "sources/stub";
end case;

无论哪种情况,

gprbuild -P prj

(您可以添加默认的-XSOURCES=normal)或

gprbuild -P prj -XSOURCES=stubbed