标签: gprbuild

多个链接的GPRBuild项目中的相同基础包

使用GPRBuild,我创建了一个名为的库项目Lib.所有包都Lib驻留在包中Base,我将其用作基本包:具有基本包Base.例如,如果我要Apple在我创建的任何库或应用程序中创建包,它将被写为package Base.Apple.

这个问题,使用GPRBuild.为了把东西放在Base包装下面,它需要存在.Lib因此,在GPRBuild库项目中,我有一个base.ads表示包存在的文件Base.然后在我正在使用该库的项目中Lib,让我们将其称为Proj,我也将所有包放在Base包(包内Proj)中.为了做到这一点,我们需要使用包定义来创建一个base.ads文件.ProjBase

我们来看看gpr项目文件:

with "lib.gpr";

project Proj is
   -- ...
end Proj;
Run Code Online (Sandbox Code Playgroud)

通过这个出现了问题; 我们突然有两个文件,都叫做base.ads,都定义了Base包,每个项目一个:库项目Lib,以及Proj使用库的项目Lib.由于我们有两个包(和它们的文件)命名相同的东西,我们得到这个错误,这在编译时完全不奇怪:

unit "base" cannot belong to several projects

问题是:有没有办法在多个项目中拥有相同的基础包?然后通过import(with)链接在一起的项目.如果它应该被证明是可能的,它怎么能实现呢?

ada gnat gprbuild

6
推荐指数
1
解决办法
89
查看次数

gprbuild 项目文件中是否可以有文件通配符?

我有一个项目,我经常在其中的某个目录中创建许多新的主入口点 *.adb 文件。有什么方法可以使用 gprbuild 设置我的项目,以便添加新的主程序不需要编辑 .gpr 项目文件?

目前,我有这个,每次添加新电源时都需要修改电源列表:

project Adabots is

   for Source_Dirs use ("src", "src/examples");
   
   for Main use ("build_wall.adb", "remove_wall.adb", "get_stone.adb", "staircase_down.adb", "josephine.adb", "dig_cavern.adb", "build_maze.adb", "elevator.adb", "lovelace.adb", "dig_hallway.adb", "spiral_staircase.adb", "walk_up_stairs.adb");
Run Code Online (Sandbox Code Playgroud)

但是我想要做的只是说里面的每个 .adb 文件src/examples都应该被视为主文件。

完整的项目在这里,以防万一。

ada gprbuild

4
推荐指数
1
解决办法
83
查看次数

GPRBuild无法编译C文件

我升级到了GNAT社区2018(GNAT GPL 2017一切正常。)我有这个项目文件:

with "opengl";

library project OpenGL.Soil is
   for Library_Name use "SoilAda";

   for Languages use ("ada", "c");

   for Source_Dirs use ("src/soil");

   -- snip compiler config
end OpenGL.Soil;
Run Code Online (Sandbox Code Playgroud)

现在src/soil,中有两个.ads.adb文件以及.h.c文件。以前,该项目文件编译了所有文件,并将它们链接在一起就可以了。从GNAT Community 2018开始,此文件仅编译Ada源,而不编译C源。

我尝试过的事情:

  • 确保GNAT社区随附的GCC仍支持编译C。是的。
  • 明确定义了Naming程序包设置,Spec_SuffixImplementation_Suffix为C指定了相应的文件结尾。
  • 明确指定Source_Files并将所有Ada和C文件放入其中。

无论我做什么,GPRBuild在调用时都不会编译C文件(导致链接器错误)。即使明确指定了C文件,也没有错误或警告输出。

如何使GPRBuild再次编译C文件?

c ada gnat gprbuild

3
推荐指数
1
解决办法
79
查看次数

如何在 gprfile 中指定可执行文件的名称?它可以位于 gprfile 目录之上吗?

这些信息可以在其他地方找到,但没有合并到这个特定的用例中,因此我觉得需要一个我(和其他人)可以参考的 stackoverflow 自我回答。如果我遗漏了什么,请随时添加您自己的答案。

project some_project is
   for Source_Dirs use ("src");
   for Object_Dir use "obj";
   for Main use ("main.adb");

   package Compiler is
      for Default_Switches ("ada") use ("-O1", "-gnatwae");
   end Compiler;
end some_project;
Run Code Online (Sandbox Code Playgroud)

我想让这个生成../some_program_name.exe. 如何指定该 gpr 项目将生成的可执行文件的名称?可以在上面的目录中吗?

ada gprbuild

3
推荐指数
1
解决办法
419
查看次数

gprbuild 可以配置为输出 gnatprep 预处理源吗?

我有一个 gpr 项目,它使用 gnatprep 来预处理源文件。但现在我有一个工具需要已经预处理的源文件。我知道我可以找到每个源文件并通过 gnatprep 运行它:

find . -type f -iname '*.ad[sb]' -exec gnatprep -DSymbol=value {} {}.prep \;
Run Code Online (Sandbox Code Playgroud)

但我想利用项目文件来找到正确的源文件并传递它们。我的项目文件还定义了要使用的各种符号值,我必须将其添加到上面的命令中。是否可以通过 .gpr 文件中的某些参数?例如

   for Object_Dir use 'obj';
   for Preprocessed_Sources_Dir use 'wow_that_was_easy';
Run Code Online (Sandbox Code Playgroud)

ada gprbuild

3
推荐指数
1
解决办法
392
查看次数

如何使用 .gpr 项目文件和 gprbuild 进行交叉编译?

我正在尝试从 Linux ( Fedora 29 )交叉编译一个以 Windows 为目标的 Ada 程序。我对编译一无所知,Gnat 项目经理文档无法帮助我这个菜鸟。我更喜欢在项目文件中使用开关,并使命令尽可能简单。我该怎么办?

我试过gprbuild -P logfilter.gpr --target=Windows导致

Error: no compiler found for language 'c', target = Windows, default runtime
Error: no compiler found for language 'ada', target = Windows, default runtime
logfilter.gpr:3:09: warning: no compiler specified for language "Ada", ignoring all its sources
logfilter.gpr:7:19: "log_filter_main.adb" is not a source of project "logfilter"
gprbuild: problems with main sources

Run Code Online (Sandbox Code Playgroud)

这是我的gprconfig

prconfig has found the following compilers on your …
Run Code Online (Sandbox Code Playgroud)

compilation ada cross-compiling gnat gprbuild

2
推荐指数
1
解决办法
1204
查看次数

Ada Gnat 项目,其中包含用于不同构建配置的不同名称的文件

我有一个带有多个构建配置的 Gnat/Gprbuild 项目。我有一个主源文件和一个辅助广告文件,其中主源文件包括:

with Secondary_File; use Secondary_File;
Run Code Online (Sandbox Code Playgroud)

问题是在每个配置中,辅助文件都有不同的名称。例如,一个配置的名称可能为Secondary_File_1.ads,另一配置的名称可能为Secondary_File_2.ads。这使得上面的with语句无法使用。

在C中,我会做这样的事情:

#ifdef BUILD_CFG_1
#include "secondary_file_1.h"
#else
#include "secondary_file_2.h"
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一种聪明的方法可以使用 Gprbuild 系统在 ADA 中执行此类操作?

ada gnat gprbuild

2
推荐指数
3
解决办法
623
查看次数

分析 GPRBuild

我有一个基于 GPR 的大型项目,编译可能需要 30 多分钟。

在分析了构建过程后,我注意到许多明显的低效率(多次调用 gprbuild 而不是聚合、过度使用替代文件而不是配置等)。我想知道是否有一些方法可以“分析”构建过程以查看需要这么长时间。

特别是即使是单个文件发生变化并且出现错误时,重新编译也需要大约5分钟。从理论上讲,应该很快意识到必须重新编译该文件(这是唯一一个这样做的)并开始编译过程,迅速发现错误。

从详细的输出来看,解析用于定义构建的大量 gpr 文件网络似乎需要相当长的时间,但我想知道它大部分时间都花在了哪里。

因此我的问题是:是否可以分析由 gprbuild 完成的构建?如果是这样,如何?

ada gprbuild

1
推荐指数
1
解决办法
108
查看次数

Shell命令在Gprbuild中编译C

使用GtkAda,我尝试使用资源API在代码中直接包含Glade文件。

为此,我们可以使用glib-compile-resources从一组资源中生成C代码,然后可以将其链接到Ada代码。

问题在于,此C代码需要Gtk包含,我们通常从Linux下的pkg-config命令获得该包含,例如

gcc -c -x c `pkg-config --cflags gio-2.0` myglade.gresource.c
Run Code Online (Sandbox Code Playgroud)

我想知道如何在GPRBuild项目文件中提供相同类型的信息。

仅供参考,我已经尝试在C语言的编译器软件包中使用pkg-config命令,但没有成功。当然,我设法手工建造,但这有点长:)

c ada gprbuild

1
推荐指数
1
解决办法
69
查看次数

在Adacore的GPR文件中,如何设置编译器以使用完整路径排除文件

我有一个项目,其中包含几个具有相同名称但在不同文件夹中的文件.

例如:

 ->sources
    ->src 
      - a.c
      - b.c
    ->stub
      - a.c
      - z.c
Run Code Online (Sandbox Code Playgroud)

在我的gprfile中,我包含了源代码

for Source_Dirs use ( "sources/**" )
Run Code Online (Sandbox Code Playgroud)

现在,我想通过使用原语"Excluded_Source_File"来忽略src中的文件.

不幸的是,这个原语需要一个文件名,而不是一个完整的路径,所以当我想忽略ac时,它会忽略src和stub中的两个文件.

for Excluded_Source_Files use ( "sources/src/a.c" ); -- KO by gprbuild
for Excluded_Source_Files use ( "a.c" ); -- OK but ignore both
Run Code Online (Sandbox Code Playgroud)

有没有人知道我怎么能这样做,而不改变当前的文件夹架构和没有重命名文件?

compilation ada gprbuild

0
推荐指数
2
解决办法
132
查看次数

标签 统计

ada ×10

gprbuild ×10

gnat ×4

c ×2

compilation ×2

cross-compiling ×1