在gnu make中获取父目录,祖父母dir等等?

时间:2016-02-04 10:36:43

标签: gnu-make

我有一个变量路径,例如来自$(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:)

,如何停止

1 个答案:

答案 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 式的做法!