我有一个变量路径,例如来自$(shell pwd)的这条路径:
C:\a\b\c\d\e\f
我想要的是将其保存在变量中:
C:\a\b\c\d\e
C:\a\b\c\d
C:\a\b\c
C:\a\b
C:\a
C:\
如何在gnu make中做到这一点?如果没有更多的父母(达到C:)
,如何停止答案 0 :(得分:1)
好的,我要切换到posix路径模式。
没有appologgies。
当cygwin可用时,生命太短暂,无法使用Windows路径。
(我会注意到$(dir)
识别反斜杠。)
所以,一个功能。
你只是吐出了这个论点, 然后再次调用该函数,但这次剪掉了最后一个路径组件。 像
这样的东西parents = $1 $(call parents,$(dir $1))
第一个问题:
$(dir a/b/c/d)
返回a/b/c/
。
精细,
除了$(dir /a/b/c/)
再次给你a/b/c/
。
你需要在调用之前删除最后的斜杠:
parents = $1 $(call parents,$(patsubst %/,%,$(dir $1)))
行。 现在问题是这个递归调用永远不会终止序列。
我们需要在parents
没有斜线时停止调用$1
。
想到几种方法。
一种方法是将/
音译为
(这是
$(subst …)
)的工作,
如果结果字数($(words …)
)为1($(filter …)
):
parents = \
$1 \
$(if $(filter-out,1,$(words $(subst /, ,$1))), \
$(call parents,$(patsubst %/,%,$(dir $1))))
(希望我能够正确嵌套。)给予:
$ cat Makefile
parents = \
$1 \
$(if $(filter-out 1,$(words $(subst /, ,$1))), \
$(call parents,$(patsubst %/,%,$(dir $1))))
$(error [$(call parents,/a/b/c/d/e/f)])
$ make
Makefile:6: *** [/a/b/c/d/e/f /a/b/c/d/e /a/b/c/d /a/b/c /a/b /a ]. Stop.
: - )
脚注:不知道你想要达到的目标, 但我认为可能还有更多 make 式的做法!