Makefile - 3. Makefile의 기능 확장 (3-1. Makefile에서 함수 사용하기)
2025. 3. 11. 19:05ㆍ개발/개발도구와 환경
📌 3-1. Makefile에서 함수 사용하기
Makefile에서는 함수(Function)를 사용하여 파일 목록을 자동으로 가져오거나, 특정 문자열을 변환하거나, 쉘 명령을 실행할 수 있습니다.
이를 활용하면 보다 동적인 Makefile을 작성할 수 있으며, 빌드 자동화를 보다 효과적으로 수행할 수 있습니다.
1. Makefile에서 함수(Function)란?
📌 1-1. Makefile 함수의 역할
- 자동화된 파일 관리: 특정 확장자를 가진 파일 목록을 가져오거나 변환할 수 있음.
- 동적인 빌드 시스템 구성: 변수와 함수를 조합하여 실행 파일을 자동 생성할 수 있음.
- 쉘 명령어 실행: 시스템 명령어를 Makefile 내에서 실행할 수 있음.
📌 1-2. Makefile에서 함수의 기본 형식
Makefile 함수는 다음과 같이 사용됩니다.
$(함수이름 arguments)
📌 $(...) 안에 함수명을 입력하고, 함수의 인자를 공백으로 구분하여 전달합니다.
2. $(wildcard *.c): 특정 패턴의 파일 목록 가져오기
📌 2-1. wildcard 함수란?
- 특정 패턴(와일드카드, *)을 사용하여 파일 목록을 가져오는 함수입니다.
- 파일이 추가되거나 삭제될 경우 Makefile을 수정할 필요 없이 자동으로 목록이 업데이트됩니다.
📌 2-2. wildcard 사용법
SRC = $(wildcard *.c)
➡ 현재 디렉토리의 모든 .c 파일을 SRC 변수에 저장.
SRC = $(wildcard src/*.c)
➡ src/ 디렉토리 내의 모든 .c 파일을 SRC 변수에 저장.
📌 2-3. wildcard 예제
🔹 예제 1: 모든 .c 파일 자동 검색
SRC = $(wildcard *.c)
OBJS = $(SRC:.c=.o)
all: myprogram
myprogram: $(OBJS)
gcc -o myprogram $(OBJS)
%.o: %.c
gcc -c $< -o $@
clean:
rm -f $(OBJS) myprogram
✅ 이점
- SRC = $(wildcard *.c)를 사용하여 .c 파일이 추가되더라도 자동으로 포함됨.
- 새로운 .c 파일을 추가할 때 Makefile을 수정할 필요 없음.
3. $(patsubst %.c, %.o, $(wildcard *.c)): 변환 규칙 적용
📌 3-1. patsubst 함수란?
- patsubst(pattern, replacement, text)
- text에서 특정 패턴을 찾아 replacement로 변환하는 함수입니다.
- 주로 .c → .o 변환 시 유용합니다.
📌 3-2. patsubst 사용법
SRC = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRC))
➡ 현재 디렉토리의 .c 파일 목록을 가져와 .o로 변환.
📌 3-3. patsubst 예제
🔹 예제 1: wildcard와 patsubst를 활용한 자동 파일 변환
CC = gcc
CFLAGS = -Wall -g
SRC = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRC))
TARGET = myprogram
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
✅ 이점
- patsubst를 사용하여 .c → .o 변환을 자동화.
- 새로운 .c 파일을 추가하면 .o 목록도 자동으로 업데이트됨.
4. $(shell cmd): 쉘 명령 실행
📌 4-1. shell 함수란?
- Makefile 내에서 쉘 명령어를 실행하는 함수입니다.
- 쉘 명령어의 실행 결과를 Makefile 변수에 저장할 수 있습니다.
📌 4-2. shell 사용법
FILES = $(shell ls *.c)
➡ 현재 디렉토리의 .c 파일 목록을 FILES 변수에 저장.
CURRENT_DIR = $(shell pwd)
➡ 현재 디렉토리 경로를 CURRENT_DIR 변수에 저장.
📌 4-3. shell 예제
🔹 예제 1: ls 명령을 사용하여 파일 목록 가져오기
SRC = $(shell ls *.c)
OBJS = $(patsubst %.c, %.o, $(SRC))
all: $(OBJS)
➡ ls *.c 명령을 실행하여 .c 파일 목록을 SRC 변수에 저장.
🔹 예제 2: find 명령을 사용하여 특정 폴더 내 파일 검색
SRC = $(shell find src -name "*.c")
OBJS = $(patsubst %.c, %.o, $(SRC))
➡ find src -name "*.c"를 실행하여 src/ 폴더 내의 모든 .c 파일을 SRC 변수에 저장.
🔹 예제 3: Git 브랜치 정보 가져오기
GIT_BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
all:
echo "현재 Git 브랜치: $(GIT_BRANCH)"
➡ git rev-parse --abbrev-ref HEAD 명령을 실행하여 현재 Git 브랜치를 출력.
📌 3-1. Makefile 함수 사용하기 요약 정리
함수 | 설명 |
$(wildcard pattern) | 특정 패턴을 가진 파일 목록을 가져옴 (*.c 등) |
$(patsubst pattern, replacement, text) | 문자열을 변환 (예: .c → .o) |
$(shell cmd) | 쉘 명령어 실행 후 결과를 변수에 저장 |
'개발 > 개발도구와 환경' 카테고리의 다른 글
Makefile - 3. Makefile의 기능 확장 (3-3. 조건문 활용 (Conditional Statements)) (0) | 2025.03.11 |
---|---|
Makefile - 3. Makefile의 기능 확장 (3-2. 포함 파일 (Include)) (0) | 2025.03.11 |
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-2. 자동 변수 (Automatic Variables)) (0) | 2025.03.11 |