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) 쉘 명령어 실행 후 결과를 변수에 저장