使用Makefile中的通用目标进行make的Bash完成

时间:2009-02-05 15:15:38

标签: bash makefile gnu-make bash-completion

我有一个Makefile,我的大部分目标都是通过固定序列创建的。似乎bash完成仅建议正常目标的完成,例如

target_name:
        #$@

而不是通用目标。有没有办法让bash完成完成所有目标,即使它们没有像上面的例子那样明确?为了更具特色,我们可以说我定义了目标名称列表,并执行以下操作:

list=target1 target2
$(list):
        #$@

有没有办法让这些目标可用于bash完成?或者,更高级,说我有两个列表,我希望目标由两个列表的元素的所有可能组合组成。我可以将这些目标用于bash完成吗?

2 个答案:

答案 0 :(得分:4)

$ make -qp | grep '^[^.#].*: '
all: bin1 bin2 bin3
bin1: obj1.o obj2.o obj3.o
obj1.o: obj1.c obj1.h
...
$ make -qp | sed -n -e 's/^\([^.#[:space:]][^:[:space:]]*\): .*/\1/p'
all
bin1
obj1.o
...

-q阻止Make实际运行任何内容,-p要求它转储其数据库。

然后您需要做的就是编写并注册completion functionexample)。

答案 1 :(得分:1)

没有可行的解决方案,AFAIK。

此命令:

make -qsp 2>/dev/null | egrep '^[^#%\.=]*:[^=]' | awk -F ': ' '{ print $2}'

将扩展你的makefile目标。

您可以尝试将其添加到/etc/bash_competion,但我认为需要进一步调试才能应对更复杂的情况。