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))
我的项目目录结构遵循 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 aTEST/
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))