2017-12-18 2 views
0

gprbuild에서 일부 변수의 값을 내 소스 코드에 자동으로 설정하려고합니다. 특히 코드 내에서 특정 명령의 출력에 액세스 할 수 있어야합니다. 메이크와 C 이것은 쉽게 :gprbuild는 외부 정보를 소스로 가져옵니다.

소스 :

#include <stdio.h> 
int main() { printf("%s\n", COMMAND_OUTPUT); return 0; } 

메이크업 : 나는 어떻게 gprbuild와 에이다와 같은 일을 할 생각이 없다 그러나

result : source.c 
    $(CC) -DCOMMAND_OUTPUT=`command -with -options` 

. (gprbuild를 버리고 그냥 make를 사용하는 것보다는 짧다.하지만 gprbuild를 좋아한다.)

+0

당신은 [gnatprep] 사용할 수 있습니다 (https://gcc.gnu.org/onlinedocs/gnat_ugn/Preprocessing-with-gnatprep.html#Preprocessing-with-gnatprep), 특히 [통합 전처리] (https://gcc.gnu.org/onlinedocs/gnat_ugn/Integrated-Preprocessing.html) 모드에서. gnatprep을 사용했지만 통합 된 전처리는 사용하지 않았습니다. –

+0

왜 정보가 출처에 있어야합니까? 일반적으로 정보를 파일에 넣고 프로그램에서 해당 파일을 읽을 수 있습니다. –

답변

2

건물을 만들기 전에 메이크 파일에서 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) 
+0

gprbuild를 사용하여 통과 할 수있는 방법이 있다면 완벽하게 작동하지만, 항상 make에서 gprbuild를 래핑 할 수 있습니다. gprbuild를 사용하여 기본적으로 수행 할 수 없다면 올바른 답을 수락합니다. – LambdaBeta

+0

Simon Wright의 제안을 본 후에 gnatprep이 외부 명령을 실행하여 해당 내용을 생성 할 수있을 때까지이 대답을 올바르게 수락합니다. – LambdaBeta

+0

즐거운 해결책은 아닙니다. 나는 어딘가에서 깔끔한 사람이있다. –

2

Ada는 C와 같은 전 처리기를 사용하지 않는다. Ada 컴파일러가 코드의 문자열을 수정할 것으로 예상 할 수 없다. 그런 인라인 편집을 사용하면 Ada 강력한 타이핑이 쉽게 위반 될 수 있습니다.이 타이핑은 진단하기가 매우 어려우며 소스 코드 정적 분석에 완전히 보이지 않습니다.

+0

Jacob Sparre Andersen의 응답과 같은 문자열을 어떻게 든 초기화 할 수 있어야합니다. 그렇지 않다면 나는 그 솔루션을 사용해야 만한다고 생각합니다. – LambdaBeta

+0

이것은 사실이 아닙니다. [gnatprep] (https://gcc.gnu.org/onlinedocs/gnat_ugn/Preprocessing-with-gnatprep.html#Preprocessing-with-gnatprep), 다소 우아하고 다소 제한적일 수는 있지만 (설계 상으로는) 소스를 사전 처리합니다. –

+2

그리고 gnatprep은 Ada 언어의 일부가 아닙니다. 이는 한 공급 업체가 제공하는 도구입니다. –

관련 문제