我继承了一个Ada / C ++项目,我正在尝试使用gprbuild来自动化构建过程(之前使用一组约12个.bat文件完成)。我对Ada和gprbuild完全不熟悉,但实际上取得了很好的进展。我可以编译我需要的.exe文件,但不能编译库。我不能完全共享.gpr文件,但相关部分看起来像这样:
[snip]
for Source_Dirs use (
"c_plus_plus_files",
"ada_files",
"..\another_project\some_other_ada_files",
"..\another_project\even_more_ada_files"
);
[snip]
for Source_Files use (
"my_ada_file.ads",
"another_ada_file.ads",
"one_more_ada_file.adb",
"c_plus_plus_file.cpp"
);
[snip]
当我运行“gprbuild -P my_project.gpr”时,它依次运行“gcc -c gnat5 one_more_ada_file.adb”并抱怨它无法找到one_more_ada_file.adb所依赖的某个文件。依赖是在.. \ another_project \ even_more_ada_files中,所以我希望它能被找到。但是如果我将依赖项复制到one_more_ada_file.adb所在的文件夹中,那么错误就会消失。
由于VCS的设置方式以及我们如何在两个项目之间共享代码,我更愿意弄清楚我使用“for source_dirs”的方式有什么问题,而不是保留所有ada的多个副本文件。
同样,我是Ada / GPS newb,所以如果我遗漏相关信息,请告诉我。
更新:看来具体问题不是source_dirs根本没有做任何事情,而是它没有处理两个源目录,其中一个目录中的.ads文件依赖于另一个目录中的.ads文件。也就是说,即使在上面的“其他”项目中,依赖于even_more_ada_files中的.ads文件的some_other_ada_files中的.ads文件在运行gprbuild时也不会使用gcc -c -gnat05命令进行编译(错误:文件在找不到even_more_ada_files),但如果我手动(或在.bat脚本中)运行带有两个-I标志的gcc命令,它会被编译,每个目录一个。
答案 0 :(得分:2)
在处理多个项目时,通常应为每个项目创建一个.gpr文件,并让您的项目根据需要依赖其他项目。
因此:
project another_project is
for Source_Dirs use
("some_other_ada_files",
"even_more_ada_files");
end another_project;
然后:
with "..\another_project\another_project.gpr"
project The_Project is
for Source_Dirs use
("c_plus_plus_files",
"ada_files");
end The_Project;