본문 바로가기
시스템 프로그래밍

makefile GNU Make의 패턴 규칙

by pedro1798 2025. 6. 20.
# Simple Makefile with use of gcc
.PHONY: all clean run test install uninstall debug

CC=gcc
# -g: 디버그 정보 추가, -Wall: 모든 경고 메시지 표시
CFLAGS=-g -Wall

SRC_DIR=src
OBJ_DIR=build
BIN_DIR=bin

# $(wildcard ...) : 해당 디렉토리의 모든 파일 가져오기
# $(patsubst A, B, C) 문자열 패턴 치환 (경로 대응)
EXEC=$(BIN_DIR)/c_study
SOURCES=$(wildcard $(SRC_DIR)/*.c)
OBJECTS=$(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SOURCES))

# 기본 빌드
all: $(EXEC)

clean:
	rm -rf $(OBJ_DIR) $(BIN_DIR)

# 최종 실행 파일 생성
# 디렉토리가 없다면 생성, 쉘스크립트 앞에 @를 붙이면 명령어 출력 생략
# %는 패턴 규칙에서 자리를 지정하는 와일드 카드
# $*는 그 %에 실제로 들어온 값을 의미한다. 
# $@은 타겟 이름, $<은 첫 번째 디펜던시, $^는 모든 디펜던시를 의미한다.
$(EXEC): $(OBJECTS)
	@mkdir -p $(BIN_DIR)
	$(CC) $^ -o $@

# 단일 실행 파일 생성
$(BIN_DIR)/%: $(OBJ_DIR)/%.o
	@mkdir -p $(BIN_DIR)
	$(CC) $< -o $@

# OBJ_DIR에 오브젝트 파일 생성
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	@mkdir -p $(OBJ_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

 

 

GNU Make의 패턴 규칙 (Pattern Rules) 은 Makefile을 강력하고 재사용 가능하게 만들어 주는 핵심 기능 중 하나입니다.

📌 패턴 규칙이란?

패턴 규칙은 비슷한 작업을 반복적으로 수행해야 할 때, 그 규칙을 일반화하는 방법입니다.

이를 통해 각 파일에 대해 같은 명령을 여러 번 반복해서 쓰지 않아도 됩니다.

 

🧱 기본 형태

TARGET_PATTERN: DEPENDENCY_PATTERN
	COMMANDS

 

예:

%.o: %.c
	gcc -c $< -o $@

요소의미

%.o “확장자가 .o인 모든 파일”을 타겟으로 함
%.c 대응되는 .c 파일이 의존성
% 파일명 공통 부분 (stem)
$< 첫 번째 의존성 (예: main.c)
$@ 타겟 이름 (예: main.o)
$* stem (예: main)

 

🔁 내부적으로는 이렇게 해석된다:

SRC = main foo bar
OBJ = $(SRC:%=%.o)
%.o: %.c
	gcc -c $< -o $@

이렇게 정의해 놓고 make main.o를 실행하면 실제로는 다음과 같이 동작합니다:

main.o: main.c
	gcc -c main.c -o main.o

🧠 주요 자동 변수 요약

변수의미

$@ 타겟 파일 이름
$< 첫 번째 디펜던시
$^ 모든 디펜던시 (중복 제거)
$* %에 해당하는 stem 부분

 

🧩 활용 예시들

1. 오브젝트 파일 자동 생성

%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

2. 실행 파일 생성 (1:1 대응)

%: %.o
	$(CC) $< -o $@

make hello 라고 하면 hello.o가 필요하고,

hello.ohello.c에서 생성되며, 이 전체 과정이 자동화됩니다.

3. 패턴 규칙과 디렉터리 활용

build/%.o: src/%.c
	$(CC) -c $< -o $@

src/foo.cbuild/foo.o로 변환

→ 서로 다른 디렉터리를 자동 매핑해서 사용할 수 있음

4. 다중 의존성도 가능

%.o: %.c %.h
	$(CC) -c $< -o $@

foo.o를 만들려면 foo.c뿐만 아니라 foo.h도 있어야 함

 

✨ 패턴 규칙을 잘 쓰면 좋은 이유

장점설명

유지 보수 쉬움 파일이 늘어나도 규칙은 그대로 사용 가능
DRY 원칙 Don’t Repeat Yourself — 반복 제거
확장성 대형 프로젝트에서도 깔끔하게 구조화 가능

 

📚 마무리 팁

  • .PHONYall, clean 등의 명령은 파일 이름이 아님을 명시해주는 것이 좋습니다.
  • make -n 또는 make --dry-run으로 실제 어떤 명령이 실행되는지 확인하면 패턴 규칙을 더 잘 이해할 수 있습니다.

'시스템 프로그래밍' 카테고리의 다른 글

오브젝트 파일(.o) 분석  (0) 2025.06.20
C 프로젝트의 폴더 구조  (0) 2025.06.20
문자열 패턴 치환  (0) 2025.06.20