본문 바로가기

.PHONY가상 타겟(Phony Target)을 선언하기 위해 사용하는 키워드입니다. 이름의 유래와 사용하는 이유를 아래에 설명하겠습니다.


1. .PHONY의 의미와 유래

  • "Phony"라는 단어는 영어로 "가짜의" 또는 "허구의"라는 뜻을 가지고 있습니다.
  • Makefile에서 .PHONY실제로 존재하지 않는 가상 타겟을 의미하며, 파일 시스템의 상태와 관계없이 항상 실행되도록 만듭니다.
  • 이 이름은 make 도구가 초기 설계될 때부터 사용되었으며, 의미를 직관적으로 전달하기 위해 선택된 것으로 보입니다.

2. .PHONY가 필요한 이유

Makefile은 파일 기반 빌드 시스템으로 설계되었습니다. 이는 타겟 이름과 동일한 파일이 있으면 해당 타겟이 "최신 상태(up-to-date)"라고 간주되고, 다시 실행하지 않는 방식으로 동작합니다.

.PHONY는 이 기본 동작을 무시하고 타겟을 항상 실행하도록 하기 위해 사용됩니다.

예제: .PHONY가 없는 경우

clean:
    rm -rf logs reports
  • make clean을 실행하면 logsreports 디렉토리를 삭제합니다.
  • 그러나 이후 파일 이름이 clean인 파일이 생성되면, make는 이를 "최신 상태"라고 간주하고 clean 타겟을 실행하지 않습니다.

.PHONY를 사용하는 경우

.PHONY: clean
clean:
    rm -rf logs reports
  • .PHONY를 선언하면 makeclean 타겟을 항상 실행합니다.
  • 파일 이름과 상관없이 "가상 타겟"으로 처리되기 때문입니다.

3. .PHONY를 사용하는 타겟의 특징

  • 파일과 독립적: 타겟 이름과 동일한 파일이 존재하더라도 항상 실행됩니다.
  • 명령 중심: 파일 생성이 목적이 아니라 특정 명령 실행이 목적일 때 주로 사용됩니다.
  • 빌드 과정 최적화: 불필요한 파일 기반 상태 검사를 건너뛰어 실행 속도를 높입니다.

4. .PHONY를 사용하는 타겟의 예

.PHONY는 아래와 같은 경우에 자주 사용됩니다:

1) 클린업(clean)

.PHONY: clean
clean:
    rm -rf logs reports
  • 빌드 결과물을 삭제하는 타겟.

2) 헬프(help)

.PHONY: help
help:
    @echo "Available targets:"
    @echo "  build    - Build the project"
    @echo "  clean    - Remove build artifacts"
  • Makefile 사용법을 출력하는 타겟.

3) 조건부 실행(gzip_step 같은 경우)

.PHONY: gzip_step
gzip_step:
    -@\gzip -f reports/*
  • 파일 생성과 관계없이 항상 실행해야 하는 명령.

5. .PHONY라는 이름의 적합성

.PHONY는 타겟이 파일 시스템 상태에 의존하지 않는 "가상"이라는 특성을 직관적으로 나타냅니다.

  • 다른 이름을 사용할 수도 있었겠지만, "가짜 타겟"이라는 의미가 명확하게 전달되는 PHONY가 적합한 이름으로 선택된 것입니다.
  • 이 이름은 Make의 철학과 설계 원칙에 잘 맞기 때문에 널리 사용되고 있습니다.

6. 요약

  • .PHONY는 Makefile에서 타겟을 파일과 독립적으로 항상 실행되게 만듭니다.
  • 이름의 유래는 "가짜 타겟"을 의미하는 영어 단어 "Phony"에서 왔습니다.
  • 파일 생성이 목적이 아닌 명령 실행 중심의 타겟에 반드시 사용하는 것이 좋습니다.

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.