26

给定一个以冒号分隔的路径列表,使用GNU Make获得一个以空格分隔的列表很简单:

CPATHS := /usr/bin/foo:/usr/bin/baz:/usr/bin/baz
SPATHS := $(subst :, ,$(CPATHS))

但是,我找不到一个好的方法去相反的方向。以下 hack 确实有效(至少在安装sed的情况下),但我很确定使用Make的内部函数会有更好的方法来解决这个问题。

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(shell echo $(SPATHS) > tmp; sed 's/ \+/:/g' tmp; rm tmp)
4

2 回答 2

30

这里唯一棘手的部分是定义一个文字空间:

space := $(subst ,, )

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(subst $(space),:,$(SPATHS))
于 2012-05-13T12:55:44.320 回答
18

获得文字空间的最短方法是 via $() $()。因此:

$(subst $() $(),:,$(CPATHS))

或者,为简洁起见:

_=$() $()
$(subst $(_),:,$(CPATHS))

有趣的是,同样的技巧适用于 cmake 的宏,即它${}是一个分隔符,但它本身不引入空格。

于 2018-08-16T10:23:37.233 回答