在我的 makefile 中,我有一个包含目录列表的变量,就像这样:
DIRS = /usr /usr/share/ /lib
现在,我需要从中创建PATH变量,这基本上是相同的,但使用分号作为分隔符:
PATH = /usr:/usr/share/:/lib
我该怎么做呢?我的意思是,如何使用分号而不是空格连接DIRS列表中的元素?
DIRS = /usr /usr/share/ /lib
现在,我需要从中创建PATH变量,这基本上是相同的,但使用分号作为分隔符:
PATH = /usr:/usr/share/:/lib
我该怎么做呢?我的意思是,如何使用分号而不是空格连接DIRS列表中的元素?
$(subst)
命令,结合一点技巧获取一个值为单个空格的变量:p = /usr /usr/share /lib
noop=
space = $(noop) $(noop)
all:
@echo $(subst $(space),:,$(p))
$(eval)
而不是 $(noop)
,从而消除定义 noop 的需要。 - Ivan Tarasov最简洁的表达方式(我能找到的):
classpathify = $(subst $(eval ) ,:,$(wildcard $1))
cp = a b c d/*.jar
target:
echo $(call classpathify,$(cp))
# prints a:b:c:d/1.jar:d/2.jar
注意:
eval
后面有一个空格:$(eval )
。没有这个空格,make解释为$(eval)
是一个变量而不是调用eval
函数。如果省略尾随空格,你可以用some_undefined_variable
替换eval
并且文本替换仍然会发生。但是,如果你使用--warn-undefined-variable
标志运行make,你会收到警告,提示eval
或some_undefined_variable
未定义。$(wildcard)
函数,因为当指定classpath时,几乎总是同时使用这两个函数。PATH := $(shell echo $(DIRS) | sed "s/ \+/:/g")