Makefile make/gmake:给定一个以多个../开头的变量,创建一个少一个..的变量/

Makefile make/gmake:给定一个以多个../开头的变量,创建一个少一个..的变量/,makefile,gnu-make,Makefile,Gnu Make,给定一个变量,如何创建另一个前面重复。/的变量,第一个变量以该变量开头,尽管重复次数少了一次 例如,给定。/../../foo/bar,如何以。/../../code>结束 我尝试了一个perl regexp,比如perl-e'$a=“../../../../foo/bar”$a=~/^\.\.\.\/((\.\.\./)+)/;打印“$1\n”,但无法理解在$(shell)中运行它所需的引号、反斜杠、美元符号等魔法咒语 此外,我怀疑还有一种更简单的方法。这将删除前面的一个。/:$(patsub

给定一个变量,如何创建另一个前面重复
。/
的变量,第一个变量以该变量开头,尽管重复次数少了一次

例如,给定
。/../../foo/bar
,如何以
。/../../code>结束

我尝试了一个perl regexp,比如
perl-e'$a=“../../../../foo/bar”$a=~/^\.\.\.\/((\.\.\./)+)/;打印“$1\n”
,但无法理解在
$(shell)
中运行它所需的引号、反斜杠、美元符号等魔法咒语


此外,我怀疑还有一种更简单的方法。

这将删除前面的一个
。/
$(patsubst../%,%,$(原始路径))

要分离出
。/
的第一条条纹,可以按以下步骤进行:

space := $(strip) $(strip)#
FIRST_STREAK := $(firstword $(subst $(space)../,../,$(subst ../,../$(space),$(ORIGINAL_PATH))))
让我们把它写成一个函数:

space := $(strip) $(strip)#
UP_PATH = $(patsubst ../%,%,$(firstword $(subst $(space)../,../,$(subst ../,../$(space),$1))))
测试它:

ORIGINAL_PATH := ../../../foo/bar/../baz
$(info $(call UP_PATH,$(ORIGINAL_PATH)))
输出:

../../

你说的“变量”是什么意思?
make
变量所需的长度缩短为一个
。/
可以通过以下方式构造:
$(patsubst../%,%,$(原始路径))
。很好,现在如何将foo/bar部分从末端取下?说清楚,从../../../foo/bar开始,我需要以../../foo/bar结束,你能接受吗?还是你失败了?@Vroomfondel-thx。当我完成复杂的make系统设计时,我最终不需要这个功能,所以我没有测试您的响应,但它看起来很棒,谢谢!