Завершение Bash для make с общими целями в Makefile - PullRequest
1 голос
/ 05 февраля 2009

У меня есть Makefile, где большинство моих целей создаются в общем виде через постоянную последовательность. Кажется, что завершение bash предлагает только завершения для нормальных целей, например

target_name:
        #$@

и не для общих целей. Есть ли способ заставить bash завершить все задачи, даже если они не указаны явно, как в примере выше? Чтобы быть более конкретным, допустим, я определил список целевых имен и сделал что-то вроде этого:

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

Есть ли способ сделать эти цели доступными для завершения bash? Или, еще более продвинутый, скажем, у меня есть два списка, и я хочу, чтобы цели были сделаны из всех возможных комбинаций элементов этих двух списков. Могу ли я также иметь эти цели для завершения bash?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2009
$ 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 просит его сбросить свою базу данных.

Тогда все, что вам нужно сделать, это написать и зарегистрировать функцию завершения ( пример ).

1 голос
/ 05 февраля 2009

Нет рабочего решения, AFAIK.

Эта команда:

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

расширит ваши цели в Makefile.

Вы можете попытаться добавить его в свой /etc/bash_competion, но я думаю, что потребуется дальнейшая отладка, чтобы справиться с более сложными ситуациями.

...