我试图让gprbuild在我的源代码中自动设置一些变量的值 - 不管怎样。特别是我希望可以从代码中访问某些命令的输出。在带有Makefile的C中,这很简单:
资源:
#include <stdio.h>
int main() { printf("%s\n", COMMAND_OUTPUT); return 0; }
使:
result : source.c
$(CC) -DCOMMAND_OUTPUT=`command -with -options`
但是我不知道如何用gprbuild和Ada做这样的事情。 (没有抛弃gprbuild而只是使用make - 但我更喜欢gprbuild)
我通过在构建之前从makefile生成Ada文件来解决这个问题。
一个例子:
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)
Ada不使用像C这样的预处理器。你不能指望Ada编译器修改代码中的字符串。使用这种内联编辑很容易违反Ada强类型,这很难诊断,并且对源代码静态分析完全不可见。