2

ほとんどのターゲットが既定のシーケンスによって一般的に作成される Makefile があります。bash の補完は、通常のターゲットの補完のみを示唆しているようです。

target_name:
        #$@

一般的なターゲットではありません。上記の例のように明示的に作成されていなくても、bash の完了をすべてのターゲットで完了する方法はありますか? より具体的に言うと、ターゲット名のリストを定義し、次のようにするとします。

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

これらのターゲットを bash の完了に使用できるようにする方法はありますか? または、さらに高度な例として、2 つのリストがあり、2 つのリストの要素のすべての可能な組み合わせでターゲットを作成したいとします。これらのターゲットを bash の完了にも使用できますか?

4

2 に答える 2

4
$ make -qp | grep '^[^.#].*:'
すべて: bin1 bin2 bin3
bin1: obj1.o obj2.o obj3.o
obj1.o: obj1.c obj1.h
...
$ make -qp | sed -n -e 's/^\([^.#[:スペース:]][^:[:スペース:]]*\): .*/\1/p'
全て
ビン1
obj1.o
...

-q、Make が実際に何かを実行するのを防ぎ-p、データベースをダンプするように要求します。

あとは、完了関数を作成して登録するだけです( example )。

于 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 に答える