2014-09-25 2 views
1

내 응용 프로그램 makefile에 몇 가지 버전 변수가 있으며 make.html 파일을 사용하여 version.h 파일을 생성하고 싶습니다.makefile을 사용하여 버전 정보 생성

version : 
    @echo "Generating version.h ..." 
    @echo line > version.h 
    @echo etc >> version.h 

debug : blah blah version blah blah 
release : blah blah version blah blah 

.DEFAULT_GOAL := debug release 

응용 프로그램 수준의 메이크 파일은 다음과 같습니다 :이 작동

MAJOR_VERSION = 1 
MINOR_VERSION = 42 

include makefile.common 

하지만 두 버전의 파일을 생성 끝 나는 현재처럼 설정 일반 메이크있다. 어떻게 한 번만 생성 할 수 있습니까? 예 : version은 앱 수준의 메이크 파일 변경에 따라 달라집니다. 그것은 그것을 두 번 생성하는 것이 참기 힘들 정도로 느리다는 것이 아닙니다. 나는 이것을 올바르게하고 싶습니다.

또한 버전 정보를 원하지 않는 앱이있을 수 있습니다.이 파일을 조건부로 생성하려면 어떻게해야합니까?

답변

2

, 하드이기 때문에 모두가 메이크 파일을 포함에 의미있는 조리법 모든 대상을 의존하는 일반적으로 좋은 일반적으로 어떤 메이크 파일 (레서피보다 나중에 포함되어 있음)에 레서피에 영향을 미치는 변수가 포함되어 있는지 확인하십시오.

메이크 :

MAJOR_VERSION := 1 
MINOR_VERSION := 42 

include makefile.common 

염두에두고, 여기에 귀하의 질문에 모두 답이 있다고 베어링 (나는 또한 다른 "모범 사례"당신이 "올바른 방법"을 배우고 싶어하기 때문에 추가)

makefile.common : 나는 이렇게하면 내가 버전 변수를 변경하려면 메이크 파일을 업데이트한다면

.PHONY: all debug release 
all: debug release 

VERSION_FILE := $(if $(filter %OR_VERSION, $(.VARIABLES)), version.h) 
debug : blah blah $(VERSION_FILE) blah blah 
release : blah blah $(VERSION_FILE) blah blah 

.SECONDEXPANSION: 
version.h : $$(MAKEFILE_LIST) 
    @echo "Generating [email protected] ..." 
    @echo line > [email protected] 
    @echo etc >> [email protected] 
+0

왜 SECONDEXPANSION입니까? – Barry

+0

@Barry 그래서 $$ (MAKEFILE_LIST)는이 순간에 포함 된 메이크 파일뿐만 아니라 이후에도 _all_ 메이크 파일을 평가합니다. 레서피의 일부 변수 값은 그 아래의 코드에 의존 할 수 있기 때문에 필요합니다. –

+0

% .d를 필터링하려면 어떻게해야합니까? 나는 $ (filter-out % .d, $ (MAKEFILE_LIST))가 작동하지만 .SECONDEXPANSION ...에서 작동하는 방법을 알아낼 수 없다. – Barry

1

당신은 당신의 메이크업 대상이 파일과 같이되고 싶어요 : 제 생각에는

version.h : 
    @echo "Generating version.h ..." 
    @echo line > version.h 
    @echo etc >> version.h 

debug : blah blah version.h blah blah 
release : blah blah version.h blah blah 
+0

, 다음, version.h가 재건을 얻을 것입니다. 그 의존성을 적용 할 수있는 방법이 있습니까? 이것은 내가 지금 가지고있는 것보다 여전히 낫다. – Barry

+0

version.h는 버전 변수에 따라 달라 지므로 버전 변수가 변경 될 때 다시 빌드되므로 파일 형식으로 명시 적으로 표현해야합니다. "version.h : Makefile" –