2012-02-02 3 views
2

Makefile을 :은 GNU와후행 공백

#there is a whitespace after "/my/path/to" 
FOO = "/my/path/to" 
BAR = "dir" 

INCLUDE_DIRS = $(FOO)/$(BAR) "/another/path" 

INCLUDES = $(foreach dir,$(INCLUDE_DIRS),-I$(dir)) 

all: 
    @echo $(INCLUDES) 

내가 내 $이 (를 포함합니다)가 될 것으로 예상합니다,

-I/my/path/to/dir -I/another/path 

그러나 라인

FOO = "/my/path/to" 

경우 (일반적으로 "실수"인) 공백 문자로 끝나고, 변수 FOO는 공백 문자를 포함 할 것이며 결과 INCLUDES는 세 개의 디렉토리 (스플릿 첫번째 beeing는 두 최초) I 발견

-I/my/path/to -I/dir -I/another/path 

유일한 해결책 스트립 기능을 사용하는 것이다

FOO = $(strip "/my/path/to") 

을하지만 자연 구가없는, 또는 임의의 방법으로 이 함정을 피하려면?

답변

0

는 여기 공백에 대한 체크 multilple 디렉토리에 루프에서 사용할 수있는 기능 :

FOO = /my/path 
BAR = to # <- a space! 
BAZ = dir 

# $(call assert-no-whitespace,DIRECTORY) 
define assert-no-whitespace 
    $(if $(word 2,[$($1)]),$(error There is a whitesapce inside variable '$(1)', please correct it),) 
endef 

CHECK_FOR_WHITESPACE = \ 
    FOO \ 
    BAR 

$(foreach dir,$(CHECK_FOR_WHITESPACE),$(call assert-no-whitespace,$(dir))) 

all: 
    @echo $(FOO)/$(BAR)/$(BAZ) 
2

우선 경로 주변에 큰 따옴표가 없어야합니다. 귀하의 예제에서 $(FOO)/$(BAR)의 값은 대신에 "/my/path/to"/"dir"이 될 것이라고 추측합니다.

귀하의 질문에 대한 대답은 일반적으로 아니오입니다. 두 값을 연결하면 공백이 유지되므로 $(FOO)/$(BAR)을 쓰려면 $(FOO)$(BAR)이 모두 공백 또는 공백이없는 단일 단어라는 것을 보증해야합니다. strip 기능은 후자를 제거 할만큼 충분합니다 (있는 경우).

그러나 이러한 변수 중 하나를 목록으로 처리하고 $(FOO:%=%/$(BAR))과 같은 것을 쓸 수 있으며 정상적으로 작동합니다. 그러나 개인적으로는, 예를 들어, (중 하나를 수정하거나 잘못된 경우 오류와 함께 실패) FOO의 값을 확인하고 평소와 같이 사용하는 것을 선호 : 엘다 Abusalimov 솔루션을 기반으로

FOO = /my/path/to # <- a space! 
BAR = dir 

... 

ifneq ($(word 2,[$(FOO)]),) 
    $(error There is a whitespace inside the value of 'FOO') 
endif 
+0

나는이 솔루션을 좋아하고 그것을 사용합니다, 감사합니다! – user744629

관련 문제