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

Lnl*_*nlB 0 compilation ada gprbuild

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

例如:

 ->sources
    ->src 
      - a.c
      - b.c
    ->stub
      - a.c
      - z.c
Run Code Online (Sandbox Code Playgroud)

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

for Source_Dirs use ( "sources/**" )
Run Code Online (Sandbox Code Playgroud)

现在,我想通过使用原语"Excluded_Source_File"来忽略src中的文件.

不幸的是,这个原语需要一个文件名,而不是一个完整的路径,所以当我想忽略ac时,它会忽略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
Run Code Online (Sandbox Code Playgroud)

有没有人知道我怎么能这样做,而不改变当前的文件夹架构和没有重命名文件?

egi*_*lhh 6

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

project Stubbed extends "my_project.gpr" is
   for Source_Dirs use ("stub");
end Stubbed;
Run Code Online (Sandbox Code Playgroud)

您可以在GPRBuild用户指南中阅读有关项目扩展的更多信息


Sim*_*ght 6

我会使用场景变量 ; 而且,听起来好像Excluded_Source_Dirs很有用.

type Source_T is ("normal", "stubbed");
Sources : Source_T := external ("SOURCES", "normal");
Run Code Online (Sandbox Code Playgroud)

那么

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;
Run Code Online (Sandbox Code Playgroud)

要么

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;
Run Code Online (Sandbox Code Playgroud)

在任一情况下,

gprbuild -P prj
Run Code Online (Sandbox Code Playgroud)

(你可以添加默认值-XSOURCES=normal)或

gprbuild -P prj -XSOURCES=stubbed
Run Code Online (Sandbox Code Playgroud)