首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile模式规则中的目录通配符

Makefile模式规则中的目录通配符
EN

Stack Overflow用户
提问于 2013-04-11 20:30:01
回答 2查看 8.9K关注 0票数 3

我正在尝试创建一个Makefile,它将通过tic编译驻留在目录中的terminfo文件。tic还会将它自动创建的termcap文件复制到系统或用户特定的目标文件夹。对于普通用户,如果terminfo文件是screen-256color-bce-s.terminfo,它将被编译并复制到~/.terminfo/s/screen-256color-bce-s。所以它看起来像这样:

代码语言:javascript
复制
terminfo/screen-256color-bce-s.terminfo => /home/user/.terminfo/s/screen-256color-bce-s
terminfo/screen-256color-s.terminfo => /home/user/.terminfo/s/screen-256color-s

如果我在Makefile中放入类似这样的内容:

代码语言:javascript
复制
TISRC = $(wildcard terminfo/*.terminfo)
TIDST = $(foreach x, $(TISRC), $(HOME)/.terminfo/$(shell basename $x|cut -c 1)/$(shell basename $x .terminfo))

$(HOME)/.terminfo/s/%: terminfo/%.terminfo
    @echo "$< => $@"
    @tic $<

install: $(TIDST)

它起作用了。但是,我想让它更通用,并在目标中使用通配符,即:

代码语言:javascript
复制
$(HOME)/.terminfo/**/%: terminfo/%.terminfo
    @echo "$< => $@"
    @tic $<

为了能够将terminfo文件添加到我的本地存储库。然而,上面的方法不起作用。如何在模式规则中指定通配符目录?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-11 22:03:20

您可以使用GNU Make Secondary Expansion feature来做到这一点

代码语言:javascript
复制
all : ${HOME}/.terminfo/x/a
all : ${HOME}/.terminfo/y/b

.SECONDEXPANSION:
${HOME}/.terminfo/%: terminfo/$$(notdir $$*).terminfo
    @echo "$< ---> $@"

输出:

代码语言:javascript
复制
[~/tmp] $ make
terminfo/a.terminfo ---> /home/max/.terminfo/x/a
terminfo/b.terminfo ---> /home/max/.terminfo/y/b

顺便说一句,make提供了some path manipulation functions,因此您实际上不需要为此调用shell。

票数 7
EN

Stack Overflow用户

发布于 2013-04-12 01:02:13

我不认为你可以像你尝试的那样使用通配符,但是如果你不介意使用eval技巧,你可以在不显式拼写所有目录路径的情况下获得你想要的效果:

代码语言:javascript
复制
TISRC = $(wildcard terminfo/*.terminfo)
BASENAMES = $(notdir $(basename ${TISRC}))

MKDST = ${HOME}/.terminfo/$(shell echo $1 | cut -c 1)/$1
TIDST := $(foreach s,${BASENAMES},$(call MKDST,$s))
DIRLTRS = $(notdir $(patsubst %/,%,$(sort $(dir ${TIDST}))))

install: ${TIDST}

# $1 - Directory Name
# $2 - File name
define T
${HOME}/.terminfo/$1/$2 : terminfo/$2.terminfo
    @echo "$$< => $$@"
    tic $$<
endef

# This is the tricky part: use template T to make the rules you need.
$(foreach d,${DIRLTRS},$(foreach f,${BASENAMES},$(eval $(call T,$d,$f))))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15948822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档