2009-02-05 30 views
1

我有一个Makefile,其中大部分目标是通过一个固定序列创建的。看来bash的完成只能提示正常目标的完成,例如使用Makefile中的通用目标执行Bash完成

target_name: 
     #[email protected] 

而不是通用目标。有没有办法让bash完成完成所有的目标,即使它们没有像上面的例子那样明确?更spesific,可以说我定义的目标名称列表,做这样的事情:

list=target1 target2 
$(list): 
     #[email protected] 

有一些方法,使可用于bash补全这些目标?或者,更高级的说,我有两个列表,我希望目标是由两个列表的元素的所有可能的组合组成。我是否也可以使用这些目标来完成bash?

回答

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防止实际运行任何厂名,以及-p要求它转储其数据库。

然后,您只需编写并注册一个completion functionexample)。

+0

通过对sed替换进行一些修改,您的方法就可以工作。因此,我已将您的答案标明为正确。谢谢 :) – 2009-02-06 10:16:41

1

没有工作解决方案,AFAIK。

此命令:

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

将扩大你的makefile目标。

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