2025. 3. 11. 19:01ㆍ개발/개발도구와 환경
📌 2-2. 자동 변수 (Automatic Variables)
Makefile에서는 자동 변수(Automatic Variables)를 사용하여 현재 목표(Target), 의존성(Dependency) 등을 간단하게 참조할 수 있습니다.
자동 변수를 활용하면 더욱 효율적이고 유지보수하기 쉬운 Makefile을 작성할 수 있습니다.
1. 자동 변수란?
자동 변수(Auto Variables)는 Makefile에서 컴파일 또는 빌드 과정에서 자동으로 설정되는 특별한 변수입니다.
자동 변수는 특정 규칙을 작성할 때 유용하며, 특히 패턴 규칙(Implicit Rules)과 함께 사용하면 반복적인 작업을 줄일 수 있습니다.
자동 변수 | 설명 |
$@ | 현재 목표(Target) 파일 이름 |
$< | 첫 번째 의존성(Dependency) 파일 이름 |
$^ | 모든 의존성(Dependency) 파일 목록 |
$? | 현재 타겟보다 최신(새로 수정된) 의존 파일 목록 |
$* | 확장자가 제거된 파일 이름 (패턴 규칙에서 유용) |
2. 자동 변수의 상세 설명 및 활용법
📌 2-1. $@ : 현재 목표(Target) 파일 이름
$@는 현재 생성 중인 목표 파일(Target)의 이름을 참조하는 자동 변수입니다.
즉, Makefile에서 해당 줄이 실행될 때 생성될 파일의 이름을 $@로 참조할 수 있습니다.
🔹 예제 1: 실행 파일을 만들 때 $@ 사용
CC = gcc
CFLAGS = -Wall -g
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o $@ main.o utils.o
➡ make 실행 시
gcc -Wall -g -o myprogram main.o utils.o
가 실행됨.
🔹 예제 2: 오브젝트 파일 생성 시 $@ 사용
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
➡ main.c를 컴파일할 경우:
gcc -Wall -g -c main.c -o main.o
➡ utils.c를 컴파일할 경우:
gcc -Wall -g -c utils.c -o utils.o
➡ $@는 main.o, utils.o로 자동 변환됨.
📌 2-2. $< : 첫 번째 의존 파일(Dependency)
$<는 현재 목표를 만들기 위한 첫 번째 의존성(Dependency) 파일을 참조합니다.
이는 단일 입력 파일을 컴파일하는 경우에 유용합니다.
🔹 예제 1: 오브젝트 파일 생성 ($< 사용)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
➡ make main.o 실행 시
gcc -Wall -g -c main.c -o main.o
➡ $<는 main.c로 변환됨.
📌 2-3. $^ : 모든 의존 파일(Dependency) 목록
$^는 현재 목표를 만들기 위해 필요한 모든 의존성(Dependency) 파일 목록을 참조합니다.
중복이 자동으로 제거되므로, 동일한 파일이 여러 번 포함되는 문제를 방지할 수 있습니다.
🔹 예제 1: 실행 파일 만들기 ($^ 사용)
CC = gcc
CFLAGS = -Wall -g
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o $@ $^
➡ make 실행 시:
gcc -Wall -g -o myprogram main.o utils.o
➡ $^는 main.o utils.o로 변환됨.
🔹 예제 2: 라이브러리 생성
libmylib.a: file1.o file2.o file3.o
ar rcs $@ $^
➡ make 실행 시:
ar rcs libmylib.a file1.o file2.o file3.o
➡ $^는 file1.o file2.o file3.o로 변환됨.
📌 2-4. 기타 자동 변수
1️⃣ $? : 최신 의존 파일 목록
- 현재 목표 파일보다 최근에 변경된 의존 파일 목록을 가져옴.
- 예를 들어, main.o가 main.c보다 최신이라면 make는 main.o를 다시 빌드하지 않음.
- 하지만 main.c가 수정되었다면 main.o는 $? 변수에 포함되어 다시 컴파일됨.
🔹 예제
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o $@ $?
➡ main.o만 새로 수정된 경우:
gcc -Wall -g -o myprogram main.o
➡ $?는 main.o로 변환됨.
2️⃣ $* : 파일 이름(확장자 제외)
- 패턴 규칙에서 확장자를 제외한 파일명을 가져오는 변수입니다.
🔹 예제
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
echo "Compiling $*"
➡ make main.o 실행 시:
gcc -Wall -g -c main.c -o main.o
echo "Compiling main"
➡ $*는 main으로 변환됨.
3. 자동 변수를 활용한 최적화된 Makefile 예제
CC = gcc
CFLAGS = -Wall -g
OBJ = main.o utils.o
TARGET = myprogram
all: $(TARGET)
$(TARGET): $(OBJ)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJ) $(TARGET)
📌 실행 흐름
make
- all → myprogram 실행됨.
- myprogram을 만들기 위해 main.o utils.o가 필요함.
- main.o와 utils.o가 없거나 오래되었으면 각각의 .c 파일을 컴파일.
- gcc -o myprogram main.o utils.o 실행됨.
make clean
➡ main.o, utils.o, myprogram 삭제됨.
📌 2-2. 자동 변수(Automatic Variables) 요약 정리
자동 변수 | 설명 |
$@ | 현재 목표(Target) 파일 이름 |
$< | 첫 번째 의존 파일(Dependency) |
$^ | 모든 의존 파일(Dependency) 목록 |
$? | 목표 파일보다 최신(새로 수정된) 의존 파일 목록 |
$* | 확장자가 제거된 파일 이름 (패턴 규칙에서 유용) |
'개발 > 개발도구와 환경' 카테고리의 다른 글
Makefile - 2. Makefile의 기본 문법 (2-4. 사전 정의된 규칙 (Implicit Rules)) (0) | 2025.03.11 |
---|---|
Makefile - 2. Makefile의 기본 문법 (2-3. 패턴 규칙 (Pattern Rules)) (0) | 2025.03.11 |
Makefile - 2. Makefile의 기본 문법 (2-1. 변수 (Variables)) (0) | 2025.03.11 |
Makefile - 1. Makefile 기본 개념 (1-3. 기본적인 Makefile 구조) (0) | 2025.03.11 |
Makefile - 1. Makefile 기본 개념 (1-2. Makefile의 동작 방식) (0) | 2025.03.11 |