2011-08-18 2 views
2

Makefile에 문자열이 있으면 Makefile 구문을 사용하여 (쉘 호출을 사용하지 않고) 알려지지 않은 문자열의 처음 두 문자를 추출 할 수 있습니까? 예를 들어Makefile : 문자열의 처음 두 문자를 반환하십시오.

,

VAR := UnKnown 
VAR_TERSE = $(call get_first_two_chars, $(VAR)) 

define get_first_two_char 
... 
endef 

답변

3

글쎄, 그것은 할 수 있지만, 손으로 구현하는 매우 지저분합니다. 가장 쉬운 방법은 substr 기능이 내장 된 GNU Make Standard Library을 얻는 것입니다. 그것이 잔인한 것이라면 라이브러리에서 그 기능을 추출 할 수는 있지만, 내가 말한 것처럼 놀랍도록 지저분합니다.

EMPTY:= 
SPACE:=$(EMPTY) $(EMPTY) 
VAR := UnKnown 
TMP:=$(subst a,a ,$(subst b,b ,$(subst c,c ,.........$(VAR))))) 
# TMP now has "U n K n o w n" 

다음은 중간 결과의 첫 번째 두 개의 "단어"를 잡기 위해 $(wordlist) 기능을 사용할 수 있습니다 : 기본적으로

당신은 각 문자 뒤에 공백을 삽입 할 문자열을 대체하는 일련의 작업을 수행

VAR_TERSE := $(subst $(SPACE),,$(TMP2)) 
# VAR_TERSE now has "Un" 
:
TMP2:=$(wordlist 1,2,$(TMP)) 
# TMP2 now has "U n" 

마지막으로, 당신은 당신이 원래 주입 된 공간을 제거하는 지금, 다시 $(subst)를 사용

1

나는 정말로 Make가 그것을하고 싶지 않은 일을하도록 강요하지 않지만, 나는 ... 좋은 퍼즐에 저항 할 수 없다.

$(eval FOO := $$$(VAR)) 
$(eval FOO := $$$(FOO)) 
VAR_TERSE:= $(VAR:$(FOO)=) 
+2

실제로 수수께끼입니다. 모든 논평? –

+0

독창적 인 트릭이지만 원래 변수 값의 시작 부분에있는 문자와 일치하거나 _those_ 변수 값의 시작 부분에있는 문자와 일치하는 단일 문자 변수를 사용하면 실제로 예측할 수없는 방식으로 중단됩니다. 예를 들어, 예제 메이크 파일의 시작 부분에 "U : = XXX"를 추가하십시오. –

관련 문제