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

Compilation 在Adacore';s GPR文件,如何设置编译器以排除具有完整路径的文件,compilation,ada,gprbuild,Compilation,Ada,Gprbuild,我有一个项目,其中包含几个文件有相同的名称,但在不同的文件夹 例: 在我的gprfile中,我将源代码与 for Source_Dirs use ( "sources/**" ) 现在,我想使用原语“Excluded\u Source\u File”忽略src中的文件 不幸的是,这个原语需要一个文件名,而不是一个完整路径,所以当我想忽略a.c时,它会忽略src和stub中的两个文件 for Excluded_Source_Files use ( "sources/src/a.c" ); --

我有一个项目,其中包含几个文件有相同的名称,但在不同的文件夹

例:

在我的gprfile中,我将源代码与

for Source_Dirs use ( "sources/**" )
现在,我想使用原语“Excluded\u Source\u 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;
您可以在我将使用的

中阅读有关项目扩展的更多信息;而且,听起来好像
排除的\u Source\u 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;

无论哪种情况

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

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
gprbuild -P prj -XSOURCES=stubbed