从 gnu make 中的列表中删除带图案的前缀
remove patterned prefix from list in gnu make
如果我有文件列表:
files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c
有没有办法从列表中删除直到最后一个下划线的所有内容以获得 foo1.c foo2.c bar1.c bar2.c
?
我正在考虑使用 patsubst
,但我需要两个 %
-- 一个用于忽略第一部分,一个用于保留最后一部分。
使用外部程序 — sed
— 享受它的全部功能
files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c
f := `echo $(files) | sed -e "s/[[:alnum:]]*_//g"`
all:
echo $(f)
可以做,就是有点恶心。你想要这样的东西:
final := $(foreach F,$(files),$(word $(words $(subst _, ,$F)),$(subst _, ,$F)))
这表示,对于 files
中的每个元素,我们将 _
转换为 space,现在我们可以使用我们的逐字函数来操作它:提取最后一个字在单词列表中。
预计到达时间
ReAl 在下面指出,这可以使用 lastword
来简化:
final := $(foreach F,$(files),$(lastword $(subst _, ,$F)))
据我所知,您使用下划线作为分层名称之间的分隔符。如果字符是 /
: 文件名函数,GNUmake 可以很好地处理这样的方案。
所以你的例子应该简单地归结为
$(notdir $(subst _,/,$(files))
如果我有文件列表:
files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c
有没有办法从列表中删除直到最后一个下划线的所有内容以获得 foo1.c foo2.c bar1.c bar2.c
?
我正在考虑使用 patsubst
,但我需要两个 %
-- 一个用于忽略第一部分,一个用于保留最后一部分。
使用外部程序 — sed
— 享受它的全部功能
files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c
f := `echo $(files) | sed -e "s/[[:alnum:]]*_//g"`
all:
echo $(f)
可以做,就是有点恶心。你想要这样的东西:
final := $(foreach F,$(files),$(word $(words $(subst _, ,$F)),$(subst _, ,$F)))
这表示,对于 files
中的每个元素,我们将 _
转换为 space,现在我们可以使用我们的逐字函数来操作它:提取最后一个字在单词列表中。
预计到达时间
ReAl 在下面指出,这可以使用 lastword
来简化:
final := $(foreach F,$(files),$(lastword $(subst _, ,$F)))
据我所知,您使用下划线作为分层名称之间的分隔符。如果字符是 /
: 文件名函数,GNUmake 可以很好地处理这样的方案。
所以你的例子应该简单地归结为
$(notdir $(subst _,/,$(files))