从 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))