본문 바로가기

cdc_quick: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step) 이 코드는 Makefile에서 조건부 의존성을 설정하는 방식입니다. 이를 통해 make cdc_quick 명령어가 특정 키워드(gzip)를 포함하는 경우에만 추가적인 의존 타겟(gzip_step)을 실행하도록 만듭니다.


1. 구성 요소와 역할

1.1 $(MAKECMDGOALS)

  • $(MAKECMDGOALS)는 Make에서 현재 실행 중인 명령어의 타겟 목록을 의미합니다.
    • 예: make cdc_quick gzip을 실행하면 $(MAKECMDGOALS)cdc_quick gzip 값을 가집니다.
    • 예: make cdc_quick만 실행하면 $(MAKECMDGOALS)cdc_quick 값만 가집니다.

1.2 $(findstring gzip,$(MAKECMDGOALS))

  • 이 함수는 문자열 검색 함수입니다.
    • gzip$(MAKECMDGOALS) 안에 포함되어 있는지 확인합니다.
    • 반환값:
      • gzip이 포함되어 있으면 gzip 문자열을 반환합니다.
      • 포함되어 있지 않으면 빈 문자열("")을 반환합니다.
    • 예:
      • $(findstring gzip,cdc_quick gzip)gzip 반환.
      • $(findstring gzip,cdc_quick) → 빈 문자열 반환.

1.3 $(if ...)

  • 이 함수는 Make의 조건부 실행 함수입니다.
    • 구문: $(if <조건>,<참일 때 반환>,<거짓일 때 반환>)
    • $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step):
      • gzip$(MAKECMDGOALS)에 포함되어 있으면 gzip_step 반환.
      • 그렇지 않으면 아무것도 반환하지 않음(빈 문자열).

1.4 cdc_quick: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)

  • cdc_quick 타겟이 실행될 때:
    • gzip이 포함되어 있으면 gzip_step이 의존 타겟으로 추가됩니다.
    • gzip이 포함되지 않으면 gzip_step은 의존 타겟에 포함되지 않습니다.

2. 동작 원리

2.1 make cdc_quick 실행

  • $(MAKECMDGOALS) 값: cdc_quick.
  • $(findstring gzip,$(MAKECMDGOALS)): 빈 문자열 반환.
  • $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step): 빈 문자열 반환.
  • 결과적으로, cdc_quickgzip_step을 의존하지 않습니다.

2.2 make cdc_quick gzip 실행

  • $(MAKECMDGOALS) 값: cdc_quick gzip.
  • $(findstring gzip,$(MAKECMDGOALS)): gzip 반환.
  • $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step): gzip_step 반환.
  • 결과적으로, cdc_quickgzip_step을 의존하게 됩니다.

3. 코드 실행 흐름

Makefile 코드

cdc_quick: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)
    @echo "Running cdc_quick..."
    @echo "QUIT_CDC=true; GUI=false; etc..."
gzip_step:
    @echo "Running gzip_step..."
    -@\gzip -f reports/*
    -@\gzip -f logs/*

명령 실행 예시

  1. make cdc_quick
    • 출력:
    • Running cdc_quick... QUIT_CDC=true; GUI=false; etc...
  2. make cdc_quick gzip
    • 출력:
    • Running gzip_step... Running cdc_quick... QUIT_CDC=true; GUI=false; etc...

4. 장점

  • 유연한 동작: gzip_step을 명시적으로 호출해야만 실행되므로, 상황에 따라 추가 작업을 쉽게 조정할 수 있습니다.
  • 조건부 의존성: 특정 조건(gzip 포함 여부)에 따라 의존 타겟을 동적으로 추가.
  • 명확한 구조: 필요한 경우에만 추가 작업을 실행하도록 설정해 불필요한 작업을 피함.

5. 실행순서 변경

$(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)를 이용하면서 gzip_step이 항상 cdc_quick 이후에 실행되도록 하려면, Makefile의 기본 의존성 처리 방식을 우회할 필요가 있습니다. Make는 의존성 타겟을 먼저 실행한 후 본 타겟의 명령을 실행하기 때문에, 순서를 재정의하려면 의존성 대신 명령 내부에서 타겟을 호출하도록 수정해야 합니다.

cdc_quick:
    @echo "Running cdc_quick..."
    # cdc_quick의 주요 작업 수행
    
    @if [ "$(findstring gzip,$(MAKECMDGOALS))" ]; then \
        echo "gzip option detected, running gzip_step..."; \
        $(MAKE) gzip_step; \
    fi

6. 응용

이 기법은 다양한 조건부 의존성 관리에 사용할 수 있습니다. 예를 들어:

  • 디버그 빌드를 실행할 때만 추가 로그를 출력.
  • 특정 플래그가 포함된 경우에만 테스트 실행.
  • 환경 변수나 명령어 인자에 따라 타겟 동작 조정.

요약

cdc_quick: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)은:

  1. 현재 실행 중인 명령($(MAKECMDGOALS))에 gzip이 포함되어 있는지 확인.
  2. 포함되어 있다면 gzip_step을 의존성 타겟으로 추가.
  3. 이를 통해 Makefile을 유연하게 설계하고, 특정 조건에서만 작업이 실행되도록 제어 가능.

B로그0간

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