在Makefile变量中尾随空格

时间:2012-02-02 16:46:53

标签: 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 make我希望我的$(INCLUDES)为:

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

但是,如果该行

FOO = "/my/path/to"

以空格结尾(这是一个常见的“错误”),变量FOO将包含空格,结果INCLUDES将包含三个目录(第一个分裂的两个第一个):

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

我找到的唯一解决方案是使用条带函数:

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

但是没有更自然的语法,或者有什么方法可以避免这个陷阱?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

基于Eldar Abusalimov解决方案,这里有一个可以在循环中使用的函数 检查空格的多个目录:

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)