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_quick
은gzip_step
을 의존하지 않습니다.
2.2 make cdc_quick gzip
실행
$(MAKECMDGOALS)
값:cdc_quick gzip
.$(findstring gzip,$(MAKECMDGOALS))
:gzip
반환.$(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step)
:gzip_step
반환.- 결과적으로,
cdc_quick
은gzip_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/*
명령 실행 예시
make cdc_quick
- 출력:
Running cdc_quick... QUIT_CDC=true; GUI=false; etc...
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)
은:
- 현재 실행 중인 명령(
$(MAKECMDGOALS)
)에gzip
이 포함되어 있는지 확인. - 포함되어 있다면
gzip_step
을 의존성 타겟으로 추가. - 이를 통해 Makefile을 유연하게 설계하고, 특정 조건에서만 작업이 실행되도록 제어 가능.
'IT > Software' 카테고리의 다른 글
Makefile - `gzip`을 유연하게 다루는 방법: `@`와 `-` 옵션의 역할 (0) | 2024.11.22 |
---|---|
Makefile - 예약 및 특수 변수 정리: 효율적인 Makefile 작성 가이드 (0) | 2024.11.22 |
Makefile 내에 .PHONY 의미 (0) | 2024.11.22 |
Marp for VS Code - 커스텀 테마 경로 설정 (0) | 2024.06.18 |
Makefile 의 대입 연산자 - ?= vs = (1) | 2024.06.04 |