Path GNU使空格转换为冒号
给定以冒号分隔的路径列表,使用GNU Make获取以空格分隔的列表非常简单: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
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
时,它可能会导致警告。