2009-02-05 31 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中,但我認爲它需要進一步調試以應付更復雜的情況。