사용자가 bash에서 자동 완성할 때 셸에서 make 대상 숨기기

사용자가 bash에서 자동 완성할 때 셸에서 make 대상 숨기기

Makefile사용자가 입력한 다음 누를 때 셸에 전혀 나타나지 않도록 특정 대상을 표시하는 방법이 있습니까 ? 레시피가 너무 많아서 사용자가 찾기 대상을 누를 때 레시피가 모두 쉘 자동 완성에 표시되는 것을 원하지 않습니다.makeTabMakefileTab

답변1

이 문제를 연구하고 첫 번째 답변에 쓴 해결책을 생각해낸 후에 또 다른 문제가 있다는 것을 깨달았습니다.매우 간단하다방법.

표시하고 싶지 않은 대상 이름으로 시작하세요.가리키다.

예:

.PHONY: foo .hiddentarget
foo: foo.x .hiddentarget
foo.x: foo.c
        touch foo.x
.hiddentarget: foo.x
        echo foo.x ok, I believe

그게 당신이 필요한 전부입니다!

라는 타겟을 차단하는 방법을 고민하다가 이 아이디어를 생각해냈습니다..숨겨진 표적잘못 호출되어 모든 숨겨진 대상을 실행합니다. :)

경고하다이런 대상 이름을 사용하는 데 부작용이 있는지는 모르겠지만, 본 적은 없습니다.".대상 이름"(점으로 시작).

답변2

특정 대상을 숨기려면 셸의 자동 완성 기능을 해킹해야 합니다. bash용도 /etc/bash_completion/etc/bash_completion.d/*목적.

tcsh가 어떻게 하는지 기억하지 마세요.

답변3

나는 이것이 밑줄로 대상을 시작함으로써 달성될 수도 있다는 것을 발견했습니다

_hiddentarget:
    @echo "Running hidden target" 

답변4

편집하다다른 답변을 읽는 것이 좋습니다(대상 이름은 점으로 시작함). 하지만 프로그래밍 부분이 다른 유사한 질문에 도움이 될 수 있으므로 여기서 이 질문에 대답하겠습니다.

글쎄, 해결책을 찾는 데 시간이 좀 걸렸습니다. 이것은 (좋은) 초안이며 작업이 완료되기를 바랍니다.

이 파일을 편집해야 합니다. /usr/share/bash-완성/완성/make (Debian Wheezy 또는 귀하와 유사한 것의 경우)

현재 버전에서 70~73행은 다음과 같습니다.

70         COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
71             awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
72             {split($1,A,/ /);for(i in A)print A[i]}' )" \
73             -- "$cur" ) )

그런 다음 다음 코드로 바꿉니다.

 70         HIDDENGOALS="$(make -qp | grep '^\.HIDDENGOALS:' | cut -d' ' -f2- | sed 's/ /\\|/g')"
 71         if [[ "$HIDDENGOALS" == "" || "$HIDDENGOALS" == ".HIDDENGOALS:" ]]; then
 72             COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
 73                 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
 74                 {split($1,A,/ /);for(i in A)print A[i]}' )" \
 75                 -- "$cur" ) )
 76         else
 77             COMPREPLY=( $( compgen -W "$( make -qp $makef $makef_dir 2>/dev/null | \
 78                 awk -F':' '/^[a-zA-Z0-9][^$#\/\t=]*:([^=]|$)/ \
 79                 {split($1,A,/ /);for(i in A)print A[i]}' \
 80                 | grep -ve "$HIDDENGOALS" )" \
 81                 -- "$cur" ) )

이제 makefile다음을 사용할 수 있습니다특별한 목표Bash 자동 완성 대상 숨기기:

 .HIDDENGOALS: somegoal anothergoal goalstohide

특별한 목표 와 매우 유사합니다 .PHONY(약간의 차이점이 있음).

주의 깊은:

(나)이 솔루션은 를 통해 작동하므로 grep -ev특수 대상은 정확하게는 아닙니다. 정규식의 방식과 일치하도록 라인에 있는 모든 것을 사용합니다.

copy2따라서 하나의 목표가 있고 또 다른 목표가 있다면 다음과 같이 copy작성하십시오.

 .HIDDENGOALS: copy

두 개의 목표가 숨겨집니다!

나는 독자에게 연습으로 이 동작에 대한 해결책을 제공합니다! ;)

(둘)주목해야 할 또 다른 점은 :가 옆에 위치하도록 하드코딩되어 있다는 것 입니다 .HIDDENGOALS:. 이는 대상이 허용하더라도공간처럼 .PHONY :, 이 특정 해커는 그렇지 않았습니다.

(삼)내 생각에는 로컬 파일을 편집하는 것보다/usr/share/bash-완성/완성/make, 업그레이드 중 정보 손실을 방지합니다. 그러나 나는 어떤 옵션도 테스트하지 않았습니다. 알고 계시다면 댓글을 달아 주시면 이 답변을 업데이트하겠습니다.

(4)약간의 가능성이 있습니다궁금한목표를 실행.숨겨진 표적을 사용하면 make .HIDDENGOALS모든 숨겨진 목표를 달성할 수 있습니다. 그리고 이름을 자동 완성하는 것은 불가능합니다. 이는 또 다른 매우 간단한 대답으로 이어집니다!

관련 정보