首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gprbuild将外部信息获取到源代码中

gprbuild将外部信息获取到源代码中
EN

Stack Overflow用户
提问于 2017-12-19 00:36:01
回答 3查看 136关注 0票数 1

我正在尝试让gprbuild在我的源代码中自动设置一些变量的值-以某种方式。特别是,我希望可以从代码中访问某些命令的输出。在带有Makefiles的C中,这很简单:

来源:

代码语言:javascript
复制
#include <stdio.h>
int main() { printf("%s\n", COMMAND_OUTPUT); return 0; }

制作:

代码语言:javascript
复制
result : source.c
    $(CC) -DCOMMAND_OUTPUT=`command -with -options`

然而,我不知道如何使用gprbuild和Ada来做这样的事情。(不是抛弃gprbuild而只是使用make --但我更喜欢gprbuild)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-09 14:43:48

是的,gnatprep预处理器允许与C代码中的完全相同:

main.adb:

代码语言:javascript
复制
with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin
   Put_Line ($Command_Output);
end Main;

simple_gnatprep.gpr:

代码语言:javascript
复制
project simple_gnatprep is

   for Create_Missing_Dirs use "True";

   Command_Output := external ("Command_Output");

   for Source_Dirs use (".");
   for Exec_Dir use ".";
   for Main use ("main.adb");

   for Object_Dir use "obj/" & "CommandOutput_" & Command_Output;

   package Compiler is
      for Switches ("Ada") use ("-gnateDCommand_Output=""" & Command_Output & """");
   end Compiler;
end simple_gnatprep;

Makefile:

代码语言:javascript
复制
COMMAND_OUTPUT=$(shell echo hello there)

all:
    gprbuild -d -p -g -XCommand_Output='${COMMAND_OUTPUT}'

clean:
    rm -rf obj/ *.exe

注意,我已经将命令输出包含在所使用的obj/目录中,如果命令输出的任何符号不能出现在目录名称中,则该命令将失败。但是,如果您省略了它,那么gprbuild将显示您的可执行文件是最新的,而除了命令的输出之外,没有任何更改。

另一种选择是在编译前始终删除对象目录,但如果可能,最好在对象路径中包含任何预处理器符号的值,以便从一种配置(例如Debug / Release)切换到另一种配置,然后再切换回来,不会丢弃中间结果并减慢开发过程。

Gnatprep只包含在GNAT编译器中,因为Ada标准中还没有任何预处理的规定。对于其他编译器,您需要在Makefile中通过gnatprep单独运行每个文件,然后将其传递给编译器。在这种情况下,不需要摆弄对象目录名,因为源文件总是新的,编译器总是必须重新编译所有内容。

票数 1
EN

Stack Overflow用户

发布于 2017-12-19 03:24:57

Ada不使用像C这样的预处理器,does.You不能期望Ada编译器修改代码中的字符串。使用这种内联编辑很容易违反Ada强类型,这将非常难以诊断,并且对于源代码静态分析是完全不可见的。

票数 2
EN

Stack Overflow用户

发布于 2017-12-19 04:08:55

我通过在构建之前从makefile生成一个Ada文件来解决这个问题。

举个例子:

代码语言:javascript
复制
HG_STATE_SOURCE     = src/mercurial.ads
HG_MODIFIER         = `test $$(hg status | wc -c || echo 0) -gt 0 && echo "plus changes" || echo "as committed"`
HG_REVISION         = `hg tip --template '{node}' 2>/dev/null || echo N/A_____________________________________`

[...]

$(HG_STATE_SOURCE): Makefile $(REPOSITORY_CONFIG) $(REPOSITORY_STATE) $(PROJECT_ROOT_SOURCE)
    @mkdir -p src
    @echo 'package 'Mercurial is'                                >  $(HG_STATE_SOURCE)
    @echo '   Revision : constant String (1 .. 53) :='           >> $(HG_STATE_SOURCE)
    @echo '                "'$(HG_REVISION)' '$(HG_MODIFIER)'";' >> $(HG_STATE_SOURCE)
    @echo 'end 'Mercurial;'                                      >> $(HG_STATE_SOURCE)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47872699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档