GNU将转换空间转换为冒号

5go*_*der 18 makefile space path gnu-make colon

给定以冒号分隔的路径列表,使用GNU Make获取以空格分隔的列表非常简单:

CPATHS := /usr/bin/foo:/usr/bin/baz:/usr/bin/baz
SPATHS := $(subst :, ,$(CPATHS))
Run Code Online (Sandbox Code Playgroud)

但是,我找不到朝着相反方向前进的好方法.以下hack确实有效(至少在安装了sed的情况下)但是我很确定只有使用Make的内部函数才能有更好的解决方法.

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

Eld*_*mov 19

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

space :=
space +=

SPATHS := /usr/bin/foo /usr/bin/baz /usr/bin/baz
CPATHS := $(subst $(space),:,$(SPATHS))
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢使用`empty:=`然后`space:= $​​(empty)$(empty)`.只是更清楚,不依赖于副作用.但两者都有效. (7认同)
  • 另一种选择是使用`space:= $​​(subst ,,)`. (5认同)

Rei*_*ica 15

获得文字空间的最短方法是通过$() $(). 因此:

$(subst $() $(),:,$(CPATHS))
Run Code Online (Sandbox Code Playgroud)

或者,为简洁起见:

_=$() $()
$(subst $(_),:,$(CPATHS))
Run Code Online (Sandbox Code Playgroud)

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