GPRbuild:聚合项目中忽略了“runtime”属性
GPRbuild: `runtime` attribute ignored in aggregated project
我正在开发一些用于在 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 的类似项目。 Building arduino_due.gpr
直接工作正常。它应该在指定的文件夹中找到我的运行时。但是,当我构建 agg.gpr
时,我得到
fatal error, run-time library not installed correctly
cannot locate file system.ads
无论我使用绝对路径还是相对路径都会出现这种情况,当相对路径与Project'Project_Dir
连接时也会出现这种情况。但是,如果我使用编译器开关 --RTS=...
而不是使用 Runtime
属性,那么它就可以工作, 但前提是我使用以 Project'Project_Dir
为前缀的相对路径. 绝对路径或普通相对路径将导致错误 gprbuild: invalid runtime directory runtimes/arduino_due_runtime
。
这是怎么回事?这种行为似乎不一致,我在文档中找不到任何关于它的信息,所以我怀疑是一个错误。但我想我会先在这里问,以防我做错了什么。也许我应该只使用子项目或项目扩展?
这不是错误,这是一个功能:-)。
有两件事:
几个选项只能在主项目中识别,如果使用聚合项目就是主项目。
Package Builder 在聚合项目中被忽略。
我的结论:聚合项目不适合你的用例,也不适合我的。正如我在上述问题中所说,回到 Makefile(或脚本)。
部分设计意图是聚合项目应该共享代码和编译:如 2.8.4 of the manual says、
The loading of aggregate projects is optimized in GPRbuild, so that all files are searched for only once on the disk (thus reducing the number of system calls and yielding faster compilation times, especially on systems with sources on remote servers). As part of the loading, GPRbuild computes how and where a source file should be compiled, and even if it is located several times in the aggregated projects it will be compiled only once.
Since there is no ambiguity as to which switches should be used, files can be compiled in parallel (through the usual -j switch) and this can be done while maximizing the use of CPUs (compared to launching multiple GPRbuild commands in parallel).
我正在开发一些用于在 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 的类似项目。 Building arduino_due.gpr
直接工作正常。它应该在指定的文件夹中找到我的运行时。但是,当我构建 agg.gpr
时,我得到
fatal error, run-time library not installed correctly
cannot locate file system.ads
无论我使用绝对路径还是相对路径都会出现这种情况,当相对路径与Project'Project_Dir
连接时也会出现这种情况。但是,如果我使用编译器开关 --RTS=...
而不是使用 Runtime
属性,那么它就可以工作, 但前提是我使用以 Project'Project_Dir
为前缀的相对路径. 绝对路径或普通相对路径将导致错误 gprbuild: invalid runtime directory runtimes/arduino_due_runtime
。
这是怎么回事?这种行为似乎不一致,我在文档中找不到任何关于它的信息,所以我怀疑是一个错误。但我想我会先在这里问,以防我做错了什么。也许我应该只使用子项目或项目扩展?
这不是错误,这是一个功能:-)。
有两件事:
几个选项只能在主项目中识别,如果使用聚合项目就是主项目。
Package Builder 在聚合项目中被忽略。
我的结论:聚合项目不适合你的用例,也不适合我的。正如我在上述问题中所说,回到 Makefile(或脚本)。
部分设计意图是聚合项目应该共享代码和编译:如 2.8.4 of the manual says、
The loading of aggregate projects is optimized in GPRbuild, so that all files are searched for only once on the disk (thus reducing the number of system calls and yielding faster compilation times, especially on systems with sources on remote servers). As part of the loading, GPRbuild computes how and where a source file should be compiled, and even if it is located several times in the aggregated projects it will be compiled only once.
Since there is no ambiguity as to which switches should be used, files can be compiled in parallel (through the usual -j switch) and this can be done while maximizing the use of CPUs (compared to launching multiple GPRbuild commands in parallel).