쉘 조건문 내에서 $(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..."
동작 원리
- 쉘 조건문
[ "$(findstring gzip,$(MAKECMDGOALS))" ]
:gzip
이$(MAKECMDGOALS)
에 포함되어 있는지 확인합니다.
$(MAKE) gzip_step
:- 조건이 참이면
gzip_step
타겟을 호출합니다.
- 조건이 참이면
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))
동작 원리
cdc_quick_setup
실행 시:$(findstring gzip,$(MAKECMDGOALS))
로gzip
키워드를 검색.EXTRA_TARGET
변수에gzip_step
값을 설정.
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..."
동작 원리
make gzip_step
명령을 직접 실행합니다.- 조건문에 따라 실행 여부를 제어합니다.
실행 결과
명령:
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의 복잡도에 따라 선택하면 됩니다!
'IT > Software' 카테고리의 다른 글
리그레션 테스트 - Regression test 의미 (0) | 2024.11.26 |
---|---|
Makefile - -@[ -n "$(wildcard reports/*)" ]의 상세 설명 (0) | 2024.11.22 |
Makefile - `gzip`을 유연하게 다루는 방법: `@`와 `-` 옵션의 역할 (0) | 2024.11.22 |
Makefile - 예약 및 특수 변수 정리: 효율적인 Makefile 작성 가이드 (0) | 2024.11.22 |
Makefile - target: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step) (0) | 2024.11.22 |