我有一个Makefile,我的大部分目标都是通过固定序列创建的。似乎bash完成仅建议正常目标的完成,例如
target_name:
#$@
而不是通用目标。有没有办法让bash完成完成所有目标,即使它们没有像上面的例子那样明确?为了更具特色,我们可以说我定义了目标名称列表,并执行以下操作:
list=target1 target2
$(list):
#$@
有没有办法让这些目标可用于bash完成?或者,更高级,说我有两个列表,我希望目标由两个列表的元素的所有可能组合组成。我可以将这些目标用于bash完成吗?
答案 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 function(example)。
答案 1 :(得分:1)
没有可行的解决方案,AFAIK。
此命令:
make -qsp 2>/dev/null | egrep '^[^#%\.=]*:[^=]' | awk -F ': ' '{ print $2}'
将扩展你的makefile目标。
您可以尝试将其添加到/etc/bash_competion
,但我认为需要进一步调试才能应对更复杂的情况。