2010-07-20 6 views
5

main.c.에있는 char* 글로벌에 버전을 저장하는 C 프로그램이 있다고 가정합니다. 빌드 시스템 (gnu make)은 빌드 타임에이 변수의 값을 추출 할 수 있습니까? 그래서 빌드 된 실행 파일은 프로그램에 나타나는 정확한 버전 이름을 가질 수 있습니까? 내가 달성하고 싶은 무엇makefile 변수에 소스 파일에서 읽은 값을 할당 할 수 있습니까?

소스를 제공한다는 것입니다 :

char g_version[] = "Superprogram 1.32 build 1142"; 

shell function 당신은 할 수 있습니다 sed 등의 외부 응용 프로그램을 호출 할 수 있습니다라는 실행 Superprogram 1.32 build 1142.exe

답변

5

를 생성하는 것 buildsystem 필요한 세부 사항에 대한 소스를 구문 분석하는 데 사용됩니다.

+0

하지만 의심스럽게 손으로 만들어진, 나 또한'what' 도구를 확인하는 것이 좋습니다 것입니다. 그 플러스 쉘은 그가 찾고있는 것일 수 있습니다. – Dummy00001

+0

답장을 보내 주셔서 감사합니다. 실제로는 작동 할 수도 있지만, 내 능력을 sed (그리고 다른 유틸리티들, 아래 mouviciel에 언급 됨)에 맞추기 만하면됩니다. – Manjabes

1

소스 파일에서 해당 정보를 추출하기 위해 Makefile에서 유닉스 텍스트 도구 (grep, sed, awk, perl, tail, ...)의 조합을 사용할 수 있습니다.

5

매크로에서 버전 변수 정의 : 다음

char g_version[] = VERSION; 

당신의 메이크 명령 줄에서 -D 인수를 넣을 수 있도록 귀하의 예를 들어, 사용

gcc hack.c -DVERSION=\"Superprogram\ 1.99\" 

물론 당신이해야 컴파일 sed/grep/awk 등을 사용하여 버전 문자열을 생성하십시오.

+0

-D 옵션을 알고 있지만이 경우에는 적용 할 수 없습니다. 버전 문자열은 그대로 있어야합니다. – Manjabes

0

보통 버전은 여러 #define 값의 구성으로 정의됩니다 (예 : arv library).

그럼 간단하고 작업 예를 들어 가자 : 당신의 메이크 파일에서 다음

// myversion.h 
#define __MY_MAJOR__ 1 
#define __MY_MINOR__ 8 

: 더 그래서 나는 몇 가지 도구를 사용하고 여기

# Makefile 
source_file := myversion.h 
MAJOR_Identifier := __MY_MAJOR__ 
MINOR_Identifier := __MY_MINOR__ 

MAJOR := `cat $(source_file) | tr -s ' ' | grep "\#define $(MAJOR_Identifier)" | cut -d" " -f 3` 
MINOR := `cat $(source_file) | tr -s ' ' | grep '\#define $(MINOR_Identifier)' | cut -d" " -f 3` 

all: 
    @echo "From the Makefile we extract: MAJOR=$(MAJOR) MINOR=$(MINOR)" 

설명 강력한 :

    012 3,516,
  • tr -s ' '은 : 우리의 목적과 일치하는 유일한 행을 선택
  • cut -d" " -f 3는 :
  • grep은 요소들 사이의 추가 공간을 제거하기 위해 타겟 값 선택된 행의 세 번째 요소를 추출!

정의 값은 숫자 일뿐만 아니라 모든 값일 수 있습니다.

은 사용에주의 := (안 =)를 참조하십시오 : https://stackoverflow.com/a/10081105/4716013 자신의 버전 문자열이 보이는

관련 문제