我正在研究一些用于在Ada中编码Arduinos的库。每个库都是自己的项目,我有一个聚合库的聚合项目。我需要为每个项目指定运行时,因为它们在不同的芯片上运行。所以例如我有这样的事情:
aggregate project Agg is
for Project_Files use ("due/arduino_due.gpr",
"uno/arduino_uno.gpr",
"nano/arduino_nano.gpr");
-- ...
end Agg;
library project Arduino_Due is
-- Library_Dir, _Name, and _Kind attributes ...
-- Target attribute ...
for Runtime ("Ada") use "../runtimes/arduino_due_runtime";
package Compiler is
-- Driver and Switches attributes ...
end Compiler;
以及Uno和Nano的类似项目。建设arduino_due.gpr
直接工作正常。它在指定的文件夹中找到我应该的运行时。但是,当我建立agg.gpr
时,我得到了
fatal error, run-time library not installed correctly
cannot locate file system.ads
无论我使用绝对路径还是相对路径,都会发生这种情况,并且当相对路径与Project'Project_Dir
连接时也会发生这种情况。但是,如果不是使用Runtime
属性我使用编译器开关--RTS=...
,那么它可以工作,但前提是我使用前缀为Project'Project_Dir
的相对路径。绝对路径或普通相对路径将导致错误gprbuild: invalid runtime directory runtimes/arduino_due_runtime
。
那么这里发生了什么?这种行为似乎不一致,我在文档中找不到任何关于它的内容,所以我怀疑是一个错误。但我想我先问这里,以防我做错了。也许我应该只使用子项目或项目扩展?
这不是一个错误,它是一个功能:-)。
有两件事:
我的结论是:聚合项目不适合您的用例或我的用例。正如我在上面提到的问题中所说,回到Makefile(或脚本)。
设计意图的一部分是聚合项目应该共享代码和编译:如2.8.4 of the manual says,
聚合项目的加载在GPRbuild中进行了优化,因此所有文件仅在磁盘上搜索一次(从而减少了系统调用次数并缩短了编译时间,尤其是在远程服务器上具有源的系统上)。作为加载的一部分,GPRbuild计算源文件的编译方式和位置,即使它在聚合项目中多次定位,也只编译一次。
由于没有关于应该使用哪些开关的模糊性,文件可以并行编译(通过通常的-j开关),这可以在最大化CPU使用的同时完成(与并行启动多个GPRbuild命令相比)。