如何使 GPR 接受同一项目中具有相同文件名的多个源?

How to make GPR accept multiple sources in the same project having the same file name?

我着手将一个OSS项目用C一段一段改写成Ada。首先停止用 GPR 替换构建系统。这样做时我偶然发现了一个问题:它不允许存储库中的多个源具有相同的名称:

duplicate source file name "slp_debug.h"

文件存在于两个不同的目录中;一个用于实施,一个用于测试(我估计是存根)。这应该没问题,因为预处理器将确定性地选择与包含它的源相关的源,或者根据包含目录的顺序。但 GPR 似乎不喜欢这个想法。

如何让GPR接受?

我试了一下 openslp-2.0.0,并设法制作了一个 GPR 来构建库,另一个 with 是第一个,用于构建测试 - 没有关于重复文件的抱怨。

两个项目文件都在顶层。

对于像 openslp 这样的项目很常见,configure 过程在顶层生成一个冗长的 config.h,具有 #define HAVE_FOO 1 的卸载。

这是 'common' 项目文件 - 我认为那里可能还有一个可执行文件 (slptool),它可能必须是一个单独的 GPR,因为它构建了一个库:

project Openslp is

   for Languages use ("c");

   for Source_Dirs use ("common", "libslp", "libslpattr");
   for Excluded_Source_Files use
     (
      "slp_win32.c",       -- not on Darwin! or Linux, ofc
      "libslpattr_tiny.c"  -- I think this must be an alternate version
     );

   for Library_Name use "slp";
   for Library_Kind use "static";
   for Library_Dir use "lib";

   for Object_Dir use "obj-openslp";
   for Create_Missing_Dirs use "true";

   package Compiler is
      for Switches ("c") use
        (
         "-DDARWIN",
         "-DHAVE_CONFIG_H",
         "-I" & project'Project_Dir,  -- for config.h, created by configure
         "-I" & project'Project_Dir & "/common",
         "-I" & project'Project_Dir & "/libslp",
         "-I" & project'Project_Dir & "/libslpattr",
         "-DETCDIR=""" & project'Project_Dir & "/etc"""
        );
   end Compiler;

end Openslp;

这是 'test' 一个:

with "openslp";
project Openslp_Test is

   for Languages use ("c");

   for Source_Dirs use ("test/**");
   for Object_Dir use "obj-openslp_test";

   for Exec_Dir use "test/bin";
   for Main use ("SLPFindAttrs.c");  -- etc, etc

   for Create_Missing_Dirs use "true";

   package Compiler is
      for Switches ("c") use
        ("-I" & project'Project_Dir & "/test")  -- for the local slp_debug.h
        & Openslp.Compiler'Switches ("c");
   end Compiler;

end Openslp_Test;