2012-02-02 60 views
2

的Makefile文件:Makefile中尾随空白变量

#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) 

使用GNU使我想到我的$(含)为:

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

然而,如果线路

FOO = "/my/path/to" 

以空白结尾(这是一个常见的“错误”),变量FOO将包含空格,并且生成的INCLUDES将包含三个目录(所述两个第一beeing第一个分裂):

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

我发现的唯一的解决方案是使用带功能:

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

但是不是有更自然的语法,或以任何方式避免这个陷阱?

回答

0

基于埃尔达尔Abusalimov解决方案,这里是可以在循环中使用 检查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"而不是预期的/my/path/to/dir

回答你的问题,一般来说,没有。连接两个值可保留空格,因此如果要编写$(FOO)/$(BAR)则由您自行决定,以确保$(FOO)$(BAR)都是单个单词且没有前导空格或尾随空格。 strip功能足以去除后者(如果有的话)。

但是,您可以将其中一个变量作为列表处理,然后写入类似$(FOO:%=%/$(BAR))的东西,这样可以正常工作。但我个人宁愿检查FOO值(无论是固定或用,如果它是坏的错误而失败),然后使用它像往常一样,例如:

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 2012-02-03 14:17:21