2014-08-10 1 views
2

을 수행하는 동안 나는 내가 작업 오전 기존 프로젝트가 현재 메이크 파일문자열 교체는 MAKE

VERSION := $(shell ${GIT} describe --tags --always) 

그것은 VERSIONv2.3-9-gcdf3820 유사한 문자열을 저장 끝에서 선이있다 변하기 쉬운. 이 변수는 결국 패키지 프로세스 중에 파일의 이름을 지정하는 데 사용됩니다.

내가하고 싶은 것은 Example.version 파일을 다음과 같은 형식으로 작성해야합니다.

{ 
    "NAME":"Examle", 
    "VERSION": 
    { 
     "MAJOR":2, 
     "MINOR":3, 
     "PATCH":0, 
     "BUILD":0 
    } 
} 

그래서 그 다음 공의와 나머지를 채우는 첫 -까지의 버전 번호에 걸립니다. describe의 결과에는 1-4 개의 버전 번호가있을 수 있으므로 유연 해지고 싶습니다.

문제는 지금 어떻게 진행해야하는지에 달려 있습니다. 나는

{ 
    "NAME":"Examle", 
    "VERSION": 
    { 
     "MAJOR":{MAJOR}, 
     "MINOR":{MINOR}, 
     "PATCH":{PATCH}, 
     "BUILD":{BUILD} 
    } 
} 

내가 파일에 읽고 메이크 내부에서 파일을 작성하는 방법을 알고있는 Example.version.template 파일을했고, 나는 내 각 변수를 일단 텍스트를 교체하는 방법을 알고있다. 내가 할 방법을 모르는 내가 make 내에서 그 선도 v의 I가 내 문자열을 분할하려면 어떻게

MAJOR := 2 
MINOR := 3 
PATCH := 0 
BUILD := 0 

및 스트립의 동등한에 v2.3-9-gcdf3820을 설정하는 방법입니까?

+1

문자열 조작 이런 종류의 혼자하게 사용 정말 수 없습니다 : @laune에서 약간의 영리함이 정리 마지막 몇 줄을 가져옵니다. 버전 문자열이 입력 된 파일을 생성 할 작은 쉘 스크립트를 작성한 다음 쉘 스크립트를 호출하는 make 규칙을 작성하는 것이 좋습니다. – MadScientist

답변

2

@MadScientist와 완전히 동의하지만 make는이 작업에 가장 적합하지 않으며 작은 쉘 스크립트가 더 나은 옵션이 될 수 있습니다 (입력 값에 대한 가정하에) make 자체를 사용하여이 조작을 수행 할 수 있습니다 .

$ cat desc.mk 
define p 
$(info $1:$($(1)):) 
endef 
raw := v2.3-9-gcdf3820 
$(call p,raw) 
split := $(subst -, ,$(raw)) 
$(call p,split) 
ver := $(subst v,,$(word 1,$(split))) 
$(call p,ver) 
versplit := $(subst ., ,$(ver)) 
$(call p,versplit) 
MAJOR := $(or $(word 1,$(versplit)),0) 
$(call p,MAJOR) 
MINOR := $(or $(word 2,$(versplit)),0) 
$(call p,MINOR) 
PATCH := $(or $(word 3,$(versplit)),0) 
$(call p,PATCH) 
BUILD := $(or $(word 4,$(versplit)),0) 
$(call p,BUILD) 

all: ; 
$ make -qf desc.mk 
raw:v2.3-9-gcdf3820: 
split:v2.3 9 gcdf3820: 
ver:2.3: 
versplit:2 3: 
MAJOR:2: 
MINOR:3: 
PATCH:0: 
BUILD:0: 

또한 감각이 필요한 작업의 좋은 금액을 제거하기 때문에 자식이 (적어도이 사용을 위해) 처음부터 당신을 위해 -9-gcdf3820 (또는 무엇이든)을 드롭하도록 git describe --tags --always --abbrev=0를 사용할 수 있도록 할 수 있습니다.

편집 :

versplit := $(subst ., ,$(ver)) 0 0 0 0 
MAJOR := $(word 1,$(versplit)) 
$(call p,MAJOR) 
MINOR := $(word 2,$(versplit)) 
$(call p,MINOR) 
PATCH := $(word 3,$(versplit)) 
$(call p,PATCH) 
BUILD := $(word 4,$(versplit)) 
$(call p,BUILD) 
+1

좋아요! 'versplit : = $ (subst.,, $ (ver)) 0 0 0 0'을 사용하고'$ (or)': MAJOR : = $ (word 1, $ (versplit)) 등. – laune

관련 문제