Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Path GNU使空格转换为冒号_Path_Makefile_Gnu Make_Space_Colon - Fatal编程技术网

Path GNU使空格转换为冒号

Path GNU使空格转换为冒号,path,makefile,gnu-make,space,colon,Path,Makefile,Gnu Make,Space,Colon,给定以冒号分隔的路径列表,使用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/ba

给定以冒号分隔的路径列表,使用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)

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

space := $(subst ,, )

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

获取文本空间的最短方法是通过
$()$()
。因此:

$(subst $() $(),:,$(CPATHS))
或者,为了简洁起见:

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

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

我更喜欢使用
empty:=
然后使用
空格:=$(empty)$(empty)
。只是稍微清楚一点,不依赖副作用。但两者都会起作用。很酷,谢谢。我想我将使用
SPACE:=$(eval)$(eval)
获得一个空间令牌。我认为
subst
单独对单词进行操作,因此看不到它们之间的空格。另一种选择是使用
space:=$(subst,,)
。最好的答案是:space:=$()(),因为它适用于make的每个版本,并且只占用一行:)。您的答案在Make4.2.x上运行良好,但在Make4.3上不起作用:*警告:向后不兼容!先前使用“+=”将值追加到空变量将导致值以空格开头。现在,只有当变量已经包含一些值时,才会添加初始空间。同样,追加空字符串也不会添加尾随空格。@jakson谢谢,我不知道。我将答案更新为使用
$(subst,,)
。虽然您的代码段也能正常工作,但我怀疑当启动带有
--warn undefined variables
make
时,它可能会导致警告。