make/gmake:给定一个以多个../开头的变量,创建一个少一个../的变量
make/gmake: given a variable starting with multiple ../, create a variable with one less ../
给定一个变量,我如何创建另一个变量,其前导重复次数为第一个变量开头的 ../
,尽管重复次数少了一次?
例如,给定 ../../../foo/bar
,我如何以 ../../
结束?
我试过像 perl -e '$a = "../../../foo/bar"; $a =~ /^\.\.\/((\.\.\/)+)/; print "\n"'
这样的 perl 正则表达式,但无法弄清楚引号、反斜杠、美元符号等需要在 [=15] 内 运行 =].
此外,我怀疑还有更简单的方法。
这将删除前面的一个 ../
:$(patsubst ../%,%,$(ORIGINAL_PATH))
要隔离 ../
的第一连胜,可以按如下方式进行:
space := $(strip) $(strip)#
FIRST_STREAK := $(firstword $(subst $(space)../,../,$(subst ../,../$(space),$(ORIGINAL_PATH))))
让我们把它写成一个函数:
space := $(strip) $(strip)#
UP_PATH = $(patsubst ../%,%,$(firstword $(subst $(space)../,../,$(subst ../,../$(space),))))
测试一下:
ORIGINAL_PATH := ../../../foo/bar/../baz
$(info $(call UP_PATH,$(ORIGINAL_PATH)))
输出:
../../
给定一个变量,我如何创建另一个变量,其前导重复次数为第一个变量开头的 ../
,尽管重复次数少了一次?
例如,给定 ../../../foo/bar
,我如何以 ../../
结束?
我试过像 perl -e '$a = "../../../foo/bar"; $a =~ /^\.\.\/((\.\.\/)+)/; print "\n"'
这样的 perl 正则表达式,但无法弄清楚引号、反斜杠、美元符号等需要在 [=15] 内 运行 =].
此外,我怀疑还有更简单的方法。
这将删除前面的一个 ../
:$(patsubst ../%,%,$(ORIGINAL_PATH))
要隔离 ../
的第一连胜,可以按如下方式进行:
space := $(strip) $(strip)#
FIRST_STREAK := $(firstword $(subst $(space)../,../,$(subst ../,../$(space),$(ORIGINAL_PATH))))
让我们把它写成一个函数:
space := $(strip) $(strip)#
UP_PATH = $(patsubst ../%,%,$(firstword $(subst $(space)../,../,$(subst ../,../$(space),))))
测试一下:
ORIGINAL_PATH := ../../../foo/bar/../baz
$(info $(call UP_PATH,$(ORIGINAL_PATH)))
输出:
../../