2009-02-05 3 views
1

대부분의 타겟이 일반적인 시퀀스를 통해 생성되는 Makefile이 있습니다. bash 완성은 정상적인 목표에 대한 완료 만 제안합니다.Makefile에 일반 타겟을 사용하여 make를위한 Bash 완성

target_name: 
     #[email protected] 

일반 대상이 아닙니다. 위의 예제처럼 명시 적으로 작성하지는 않았지만 bash 완료를 모든 대상에 완료시키는 방법이 있습니까?

list=target1 target2 
$(list): 
     #[email protected] 

bash는 완성이 목표를 사용할 수 있도록하는 몇 가지 방법이 있나요 : 더 spesific을하기 위해, 내가 대상 이름의 목록을 정의하고,이 같은 일을 말할 수? 또는 두 가지 목록의 요소가 가능한 모든 조합으로 대상을 만들길 원합니다. 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 function (example)을 작성하고 등록하면됩니다.

+0

sed 대체를 약간 수정하면 방법이 효과적입니다. 따라서 나는 당신의 답을 옳다고 표시했습니다. 감사 :) –

1

AFAIK는 작동하지 않습니다.

이 명령을

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

이 메이크 목표를 확장됩니다.

당신은 /etc/bash_competion에 그것을 추가하려고 할 수 있습니다,하지만 더 복잡한 상황에 대처하기 위해서는 더 이상의 디버깅이 필요하다고 생각합니다.

관련 문제