본문 바로가기

쉘 조건문 내에서 $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)처럼 다른 타겟을 호출하는 것은 직접적으로는 불가능합니다. 쉘 조건문([ -n "" ])은 Makefile의 실행 단계에서 동작하며, 이 단계에서는 Makefile 자체의 타겟 호출(예: make target)을 수행할 수 없습니다. 하지만 우회 방법을 통해 쉘 조건문을 사용해 다른 타겟을 호출하는 효과를 낼 수 있습니다.


우회 방법 1: $(MAKE)를 사용한 재귀 호출

$(MAKE) 변수는 현재 실행 중인 make 명령을 나타냅니다. 이를 활용해 쉘 조건문 내부에서 다른 타겟을 호출할 수 있습니다.

예제

cdc_quick:
    @echo "Running cdc_quick..."
    @[ "$(findstring gzip,$(MAKECMDGOALS))" ] && $(MAKE) gzip_step || echo "Skipping gzip_step"

gzip_step:
    @echo "Running gzip_step..."

동작 원리

  1. 쉘 조건문 [ "$(findstring gzip,$(MAKECMDGOALS))" ]:
    • gzip$(MAKECMDGOALS)에 포함되어 있는지 확인합니다.
  2. $(MAKE) gzip_step:
    • 조건이 참이면 gzip_step 타겟을 호출합니다.
  3. echo "Skipping gzip_step":
    • 조건이 거짓이면 gzip_step을 호출하지 않고 메시지만 출력합니다.

실행 결과

  • 명령: make cdc_quick

    Running cdc_quick...
    Skipping gzip_step
  • 명령: make cdc_quick gzip

    Running cdc_quick...
    Running gzip_step...

우회 방법 2: 타겟 호출을 위한 의존성 변수 사용

쉘 조건문이 아닌 Makefile의 의존성을 활용해 간접적으로 타겟 호출을 수행할 수도 있습니다.

예제

cdc_quick: $(EXTRA_TARGET)
    @echo "Running cdc_quick..."

gzip_step:
    @echo "Running gzip_step..."

# 쉘 조건문을 활용해 $(EXTRA_TARGET) 변수 설정
cdc_quick_setup:
    $(eval EXTRA_TARGET := $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step))

동작 원리

  1. cdc_quick_setup 실행 시:
    • $(findstring gzip,$(MAKECMDGOALS))gzip 키워드를 검색.
    • EXTRA_TARGET 변수에 gzip_step 값을 설정.
  2. cdc_quick 타겟 실행 시:
    • EXTRA_TARGET에 설정된 타겟(여기서는 gzip_step)이 의존성으로 추가되어 실행됩니다.

실행 결과

  • 명령: make cdc_quick_setup cdc_quick

    Running cdc_quick...
  • 명령: make cdc_quick_setup cdc_quick gzip

    Running cdc_quick...
    Running gzip_step...

우회 방법 3: 쉘 명령으로 Make 재호출

쉘 명령 내에서 다른 타겟을 호출하려면 make <target> 명령을 직접 실행합니다.

예제

cdc_quick:
    @echo "Running cdc_quick..."
    @[ "$(findstring gzip,$(MAKECMDGOALS))" ] && make gzip_step || echo "Skipping gzip_step"

gzip_step:
    @echo "Running gzip_step..."

동작 원리

  1. make gzip_step 명령을 직접 실행합니다.
  2. 조건문에 따라 실행 여부를 제어합니다.

실행 결과

  • 명령: make cdc_quick

    Running cdc_quick...
    Skipping gzip_step
  • 명령: make cdc_quick gzip

    Running cdc_quick...
    make[1]: Entering directory ...
    Running gzip_step...
    make[1]: Leaving directory ...

비교 및 선택

방법 장점 단점
1. $(MAKE) 사용 Make의 내장 재귀 호출 기능을 활용, 간단하고 효율적 Make를 다시 호출하므로 오버헤드가 발생할 수 있음
2. 의존성 변수 사용 Makefile 구조를 유지하며 조건부 의존성 추가 초기 설정을 위한 별도 타겟 필요
3. 쉘 명령 호출 단순히 쉘에서 Make 명령을 실행, 유연한 조건 처리 가능 Make가 쉘을 통해 다시 호출되므로 디버깅이 복잡해질 수 있음

결론

  • Makefile 의존성을 활용하고 싶다면: 방법 2를 추천합니다. 의존성 변수(EXTRA_TARGET)로 타겟 간의 관계를 동적으로 설정할 수 있습니다.
  • 단순한 조건부 호출이 필요하다면: 방법 1방법 3이 적합합니다. 특히 $(MAKE)를 활용한 재귀 호출은 Makefile 표준에 더 가까운 방식입니다.

각 방법은 프로젝트의 요구사항과 Makefile의 복잡도에 따라 선택하면 됩니다!

B로그0간

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