2

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

target_name:
        #$@

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

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

有什么方法可以使这些目标可用于 bash 完成?或者,甚至更高级,假设我有两个列表,并且我希望目标由两个列表中元素的所有可能组合组成。我也可以将这些目标用于 bash 完成吗?

4

2 回答 2

4
$ 制作-qp | grep '^[^.#].*:'
全部:bin1 bin2 bin3
bin1: obj1.o obj2.o obj3.o
obj1.o:obj1.c obj1.h
...
$ 制作-qp | sed -n -e 's/^\([^.#[:space:]][^:[:space:]]*\): .*/\1/p'
全部
bin1
对象1.o
...

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

然后您需要做的就是编写并注册一个完成函数示例)。

于 2009-02-05T16:09:54.207 回答
1

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

这个命令:

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

将扩展您的 makefile 目标。

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

于 2009-02-05T16:04:37.807 回答