Makefile에서 @ :( 기호 콜론)는 무엇을 의미합니까?


155

Makefile에서 다음은 무엇을합니까?

rule: $(deps)
    @:

make 매뉴얼에서 이것을 찾을 수없는 것 같습니다.

답변:


206

"출력에서이 명령을 에코하지 마십시오"를 의미합니다. 따라서이 규칙은 "쉘 명령을 실행 :하고 출력을 에코하지 않습니다 "라고 말합니다 .

물론 쉘 명령 :은 작동하지 않기 때문에 "아무것도하지 말고 말하지 마라"라고 말하는 것입니다.

왜?

여기서 중요한 것은 두 가지 다른 구문을 모호하게 조합 한 것입니다. 메이크업 (1) 구문 명령을 에코하지 단순히 @로 시작 동작의 사용이다. 그래서 같은 규칙

always:
       @echo this always happens

방출하지 않습니다

   echo this always happens
   this always happens

이제 규칙의 작업 부분은을 포함한 모든 셸 명령이 될 수 있습니다 :. Bash 도움말은 이뿐 만 아니라 어디서나 설명합니다.

$ help :
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

21
내 타이핑을 즐기지 마십시오. 언젠가는 나이가들 것입니다.
Charlie Martin

4
이것은 이것이하는 일에 대한 훌륭한 설명이지만, 왜 당신이 makefile에서 이것을 할 것인지 아십니까?
Charles Keepax

8
가장 안개가 심하지 않습니다.
Charlie Martin

2
그것은 외부 프로그램을 많이 전화 메이크에 유용하고 사용할 곳이처럼 좋은 보이게하기 위해 많은 반향 수 이 한
dwcoder

1
@ Charles-keepax @:()뿐만 아니라 @@guestolio의 답변 외에도 특별히 언급하면 개발에서 남은 스텁이 될 수 있습니다. 파이썬 만 포함하는 함수를 작성하는 것과 같습니다 pass. 복사 / 붙여 넣기를 위해 코드 블록을 스터 빙하는 데 유용 할 수 있지만 일반적으로 오랫동안 존재하지 않아야합니다. 등의 파일이 여전히 컴파일 것이다 이런 식으로, 패스 linting, 스텁 때
boweeb

40

왜 이런 일을하는지 궁금해하는 사람들에게, 마치 무언가가 행한 것처럼 만들어서 Make가 대상에 대해 "Nothing to be done"을 출력하지 않도록하는 것이 유용합니다.

예를 들어 항상 실행하는 가짜 대상이 있고 명령에 여러 조건이 있습니다. 그러한 조건이 잘못되어 아무 일도 일어나지 않을 경우를 대비하여 최소한 무언가를 갖고 싶을 것입니다.

예를 들어 (Linux의 스크립트 /Makefile.clean에서) :

__clean: $(subdir-ymn)
ifneq ($(strip $(__clean-files)),)
    +$(call cmd,clean)
endif
ifneq ($(strip $(__clean-dirs)),)
    +$(call cmd,cleandir)
endif
ifneq ($(strip $(clean-rule)),)
    +$(clean-rule)
endif
    @:
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.