Makefile은 빌드 자동화를 위한 강력한 도구이며, Makefile 내에서 사용되는 특수 변수(reserved variables)는 빌드 과정을 동적으로 제어하고 유연하게 만듭니다. 이 글에서는 Makefile에서 자주 사용되는 예약 변수와 특수 변수를 정리하고, 각 변수의 역할과 활용 예제를 제공합니다.
예약 변수 총정리
변수 이름 | 설명 | 예제 |
---|---|---|
$(MAKECMDGOALS) |
실행 중인 타겟 목록 | cdc_quick gzip |
$@ |
현재 타겟 이름 | gcc -o $@ |
$< |
첫 번째 의존성 | gcc -c $< -o $@ |
$^ |
모든 의존성 목록 | gcc $^ -o program |
$? |
수정된 의존성 목록 | gcc -c $? -o $@ |
$* |
타겟 이름에서 확장자 제거 | file.c -> file |
$(MAKE) |
현재 Make 명령어 | $(MAKE) -C subdir |
$(CURDIR) |
현재 디렉토리 | /path/to/current/dir |
$(wildcard) |
파일 패턴 검색 | $(wildcard *.c) |
$(filter) |
패턴 필터링 | $(filter %.o,files) |
$(addprefix) |
접두사 추가 | $(addprefix /build/,main.o) |
$(addsuffix) |
접미사 추가 | $(addsuffix .o,main utils) |
1. $(MAKECMDGOALS)
설명: 현재
make
명령어에서 호출된 목표(Target) 목록을 포함합니다.주요 용도: 실행된 타겟에 따라 동적으로 다른 작업을 수행.
예제:
all: @echo "Targets: $(MAKECMDGOALS)" clean: rm -rf *.o *.log
- 실행:
make clean all
- 출력:
Targets: clean all
- 실행:
2. $@
- 설명: 현재 타겟(Target)의 이름을 나타냅니다.
- 주요 용도: 타겟 이름 기반으로 파일 생성 또는 로그 기록.
- 예제:
build: @echo "Building target: $@"
- 실행:
make build
- 출력:
Building target: build
- 실행:
3. $<
- 설명: 첫 번째 의존성(Dependency)의 이름을 나타냅니다.
- 주요 용도: 의존성을 기반으로 파일 처리.
- 예제:
output.o: input.c gcc -c $< -o $@
- 실행:
make output.o
- 동작:
gcc -c input.c -o output.o
- 실행:
4. $^
- 설명: 모든 의존성의 이름 목록을 공백으로 구분하여 제공합니다.
- 주요 용도: 다중 파일 컴파일 또는 링크.
- 예제:
program: file1.o file2.o gcc $^ -o $@
- 실행:
make program
- 동작:
gcc file1.o file2.o -o program
- 실행:
5. $?
- 설명: 의존성 중 수정된 파일 목록만 반환합니다.
- 주요 용도: 변경된 파일만 업데이트.
- 예제:
output.o: input.c gcc -c $? -o $@
- 만약
input.c
가 수정되었으면 컴파일이 실행됩니다.
- 만약
6. $*
- 설명: 타겟 이름에서 확장자(확장자를 포함한 가장 오른쪽 부분)를 제거한 이름을 반환.
- 주요 용도: 다중 파일 패턴 매칭.
- 예제:
%.o: %.c gcc -c $< -o $@
- 실행:
make file.o
- 동작:
gcc -c file.c -o file.o
- 실행:
7. $(MAKE)
- 설명: 현재 실행 중인 Make 명령어의 경로를 나타냅니다.
- 주요 용도: Make 재귀 호출.
- 예제:
subdir: $(MAKE) -C subdirectory
- 실행:
make subdir
- 동작: 하위 디렉토리로 이동하여 Makefile 실행.
- 실행:
8. $(CURDIR)
- 설명: 현재 디렉토리의 절대 경로를 반환.
- 주요 용도: 파일 경로 지정 또는 디렉토리 이동.
- 예제:
current: @echo "Current Directory: $(CURDIR)"
- 실행:
make current
- 출력:
Current Directory: /path/to/current/directory
- 실행:
9. $(wildcard pattern)
설명: 주어진 패턴에 맞는 파일 목록을 반환.
주요 용도: 파일 목록 생성.
예제:
sources := $(wildcard *.c) objects := $(sources:.c=.o) all: $(objects) gcc $^ -o program
sources
는 현재 디렉토리의.c
파일 목록.objects
는 대응하는.o
파일 목록.
10. $(filter pattern,text)
설명: 주어진 텍스트에서 패턴에 맞는 항목만 필터링.
주요 용도: 조건부 처리.
예제:
files := file1.o file2.o file3.c objs := $(filter %.o,$(files)) all: @echo "Object files: $(objs)"
- 출력:
Object files: file1.o file2.o
- 출력:
11. $(addprefix prefix,names)
설명: 각 항목에 접두사를 추가.
주요 용도: 파일 경로 지정.
예제:
files := main.o utils.o full_paths := $(addprefix /build/,$(files)) all: @echo "Paths: $(full_paths)"
- 출력:
Paths: /build/main.o /build/utils.o
- 출력:
12. $(addsuffix suffix,names)
설명: 각 항목에 접미사를 추가.
주요 용도: 파일 확장자 변경.
예제:
files := main utils objects := $(addsuffix .o,$(files)) all: @echo "Object files: $(objects)"
- 출력:
Object files: main.o utils.o
- 출력:
결론
Makefile의 특수 변수는 간단한 빌드 스크립트를 복잡한 빌드 자동화 시스템으로 발전시킬 수 있는 강력한 도구입니다. 이 글에서 소개한 변수들을 이해하고 활용하면 Makefile 작성의 효율성과 유연성을 극대화할 수 있습니다. 프로젝트에 맞는 특수 변수를 적절히 사용해 보세요!
'IT > Software' 카테고리의 다른 글
Makefile - -@[ -n "$(wildcard reports/*)" ]의 상세 설명 (0) | 2024.11.22 |
---|---|
Makefile - `gzip`을 유연하게 다루는 방법: `@`와 `-` 옵션의 역할 (0) | 2024.11.22 |
Makefile - target: $(if $(findstring gzip,$(MAKECMDGOALS)),gzip_step) (0) | 2024.11.22 |
Makefile 내에 .PHONY 의미 (0) | 2024.11.22 |
Marp for VS Code - 커스텀 테마 경로 설정 (0) | 2024.06.18 |