我正在尝试创建一个Makefile,它将编译驻留在目录中的terminfo文件tic.tic还会将其自动创建的termcap文件复制到系统或用户特定的目标文件夹.对于常规用户,如果terminfo文件是例如screen-256color-bce-s.terminfo,则将其编译并复制到~/.terminfo/s/screen-256color-bce-s.所以它看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
如果我把这样的东西放到我的Makefile中:
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)
Run Code Online (Sandbox Code Playgroud)
有用.但是,我想使它一般,并在目标中使用通配符,即:
$(HOME)/.terminfo/**/%: terminfo/%.terminfo
@echo "$< => $@"
@tic $<
Run Code Online (Sandbox Code Playgroud)
能够将terminfo文件添加到我的本地存储库.但是,上述方法不起作用.如何在模式规则中指定通配符目录?
您可以使用GNU Make Secondary Expansion功能执行此操作:
all : ${HOME}/.terminfo/x/a
all : ${HOME}/.terminfo/y/b
.SECONDEXPANSION:
${HOME}/.terminfo/%: terminfo/$$(notdir $$*).terminfo
@echo "$< ---> $@"
Run Code Online (Sandbox Code Playgroud)
输出:
[~/tmp] $ make
terminfo/a.terminfo ---> /home/max/.terminfo/x/a
terminfo/b.terminfo ---> /home/max/.terminfo/y/b
Run Code Online (Sandbox Code Playgroud)
作为旁注,make提供了一些路径操作函数,因此您不需要为此调用shell.
| 归档时间: |
|
| 查看次数: |
7876 次 |
| 最近记录: |