0

我正在开发一些用于在 Ada 中对 Arduino 进行编码的库。每个库都是它自己的项目,我有一个聚合库的聚合项目。我需要为每个项目指定运行时,因为它们在不同的芯片上运行。所以例如我有这样的事情:

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

那么这里发生了什么?这种行为似乎不一致,我在文档中找不到任何关于它的内容,所以我怀疑是一个错误。但我想我会先在这里问,以防我做错了什么。也许我应该只使用子项目或项目扩展?

4

1 回答 1

3

这不是一个错误,它是一个功能:-)。

请参阅这个被拒绝的问题

有两件事:

  • 几个选项仅在主项目中被识别,并且如果您使用作为主项目的聚合项目

  • Package Builder 在聚合项目中被忽略。

我的结论是:聚合项目不适合您或我的用例。正如我在上面提到的问题中所说,回到 Makefile(或脚本)。


设计意图的一部分是聚合项目应该共享代码和编译:正如手册的 2.8.4 所说

聚合项目的加载在 GPRbuild 中进行了优化,因此所有文件在磁盘上只搜索一次(从而减少了系统调用的数量并产生了更快的编译时间,尤其是在具有远程服务器源的系统上)。作为加载的一部分,GPRbuild 计算源文件的编译方式和位置,即使它在聚合项目中多次定位,也只会编译一次。

由于应该使用哪些开关没有歧义,因此可以并行编译文件(通过通常的 -j 开关),并且可以在最大限度地利用 CPU 的同时完成编译(与并行启动多个 GPRbuild 命令相比)。

于 2019-03-13T07:17:07.927 回答