MAKE:makefile 中的路径操作

MAKE: Path manipulation in makefile

我的项目目录结构遵循 foo/bar/baz/boo/ 的模式 我想找到所有 foo 的 boo=TEST mylist=$(dir $(shell find $(PRJPATH) -name TEST)) 给我一个 $(PRJPATH)/foo/bar/baz/

的列表

除此之外我无法取得任何进展。如何从 mylist 的每个元素中删除最后两个文件夹名称?

注意我的最终目标是:每个 foo 文件夹都包含一个 makefile,我只想 运行 make -C $(FOO folder) 那些有 // 的文件夹TEST 子文件夹

$(mylist):
         make -C $@
verify: $(mylist)
         junit ....

EDIT1

可能是一个典型的文件夹结构

uart/basic/verif/TEST spi/feature1/rtl_sim/TEST pcie/dma/regression/TEST

mylist 然后将评估列表 (uart spi pcie)

不要认为 $(patsubst pattern,replacement,text) 不能在这里使用,因为它需要文本中的空格分隔的单词。因此使用 make 的 shell 命令并调用 sed 删除最后两个路径组件。

mypath=$(PRJPATH)/foo/bar/baz/
twodirsabove=$(shell echo "$(mypath)" | sed -E 's/[^/]+\/[^/]+\/$///')

我想你要问的是给出了一个路径列表,你如何删除每个路径中的最后三个路径元素?

你可以用 GNU make 做到这一点,但它很烦人,因为 make 的 dir 函数的工作方式:它留下尾部的斜杠,这意味着后续的 dir 函数作为空操作。您可以使用 patsubst 来解决这个问题。一个方便的事情是为此制作你自己的小功能:

mydir = $(patsubst %/,%,$(dir ))

现在您可以使用:

mylist := $(call mydir,$(call mydir,$(call mydir $(shell find $(PRJPATH) -name TEST))))

这里使用:=,会快很多。 (注:未经测试)。

I want to run make -C $(FOO folder) only for those folders which have a TEST/ sub folder

找到所有 TEST/ 个文件夹:

testdirs := $(shell find $(PRJPATH) -type d -name TEST)

这给出了一个类似于 a/b/TEST c/TEST ./TEST(比方说)的列表。

现在将尾随 /TEST 替换为 /Makefile:

possible := ${testdirs:%/TEST=%/Makefile}

剩下 a/b/Makefile c/Makefile ./Makefile。把这个交给 $(wildcard):

actual := $(wildcard ${possible})

给出了 c/Makefile ./Makefile 的最终答案(a/b/Makefile 不存在)。工作完成。

.PHONY: ${actual}
${actual}: ; ${MAKE} -C ${@D}

或类似的。

编辑

啊,错过了子文件夹位。好吧,如果你只想要 Makefile 3 个目录在 TEST/ 文件夹之上,只需执行

possible := ${testdirs:%/TEST=%/../../../Makefile}

How do I chop off the last two folder names from each element of mylist?

PRJPATH := /abs/path/to/project/root
mylist := $(PRJPATH)/foo1/bar1/baz1/ $(PRJPATH)/foo2/bar2/baz2/

# use abspath for dirty work
mychop2abs := $(abspath $(addsuffix /../..,$(mylist)))

# could transform to relative paths if needed
mychop2rel := $(patsubst $(PRJPATH)/%,%,$(mychop2abs))