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" )
但是没有更自然的语法,或者有什么方法可以避免这个陷阱?
答案 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)