GPRbuild:聚合项目中忽略`runtime`属性

问题描述 投票:0回答:1

我正在研究一些用于在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

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

runtime project ada gnat gprbuild
1个回答
3
投票

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

this rejected issue

有两件事:

  • 有几个选项只能在主项目中识别,如果使用的是作为主项目的聚合项目。
  • 在聚合项目中忽略包构建器。

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


设计意图的一部分是聚合项目应该共享代码和编译:如2.8.4 of the manual says

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

由于没有关于应该使用哪些开关的模糊性,文件可以并行编译(通过通常的-j开关),这可以在最大化CPU使用的同时完成(与并行启动多个GPRbuild命令相比)。

© www.soinside.com 2019 - 2024. All rights reserved.