Makefile - 2. Makefile의 기본 문법 (2-4. 사전 정의된 규칙 (Implicit Rules))

2025. 3. 11. 19:04개발/개발도구와 환경

📌 2-4. 사전 정의된 규칙 (Implicit Rules)

Makefile에는 특정 작업을 자동화하는 사전 정의된 규칙(Implicit Rules)이 포함되어 있습니다.
이 규칙들은 make가 내부적으로 제공하는 기능으로, 개발자가 직접 정의하지 않아도 자동으로 컴파일 과정이 수행됩니다.
특히 C/C++ 프로그램의 컴파일을 자동화하는 데 유용합니다.


1. 사전 정의된 규칙(Implicit Rules)이란?

📌 1-1. 사전 정의된 규칙의 개념

  • Makefile에서 규칙을 직접 정의하지 않아도 자동으로 실행되는 규칙을 의미합니다.
  • make는 특정한 파일 확장자(예: .c, .cpp, .o 등)를 기반으로 자동으로 적절한 명령어를 실행합니다.

📌 1-2. 사전 정의된 규칙의 동작 방식

  • make는 파일 확장자와 관련된 기본 규칙을 내부적으로 보유하고 있습니다.
  • 예를 들어, .c 파일이 있다면 자동으로 .o 파일을 생성하는 규칙이 적용됩니다.

2. C/C++ 자동 컴파일 규칙

📌 2-1. C 파일에서 오브젝트 파일(.o) 자동 생성

  • 기본적으로 make는 .c 파일이 .o 파일로 변환될 때 다음과 같은 명령어를 자동으로 실행합니다.
gcc -c source.c -o source.o
  • 따라서 Makefile에서 아무 규칙도 정의하지 않아도 make는 .c → .o 변환을 자동으로 수행할 수 있습니다.

🔹 예제 1: 명시적인 규칙 없이도 작동하는 Makefile

CC = gcc
CFLAGS = -Wall -g

all: myprogram

myprogram: main.o utils.o
	$(CC) $(CFLAGS) -o myprogram main.o utils.o

➡ make 실행 시 자동으로 다음과 같은 명령이 실행됨:

gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
gcc -o myprogram main.o utils.o

➡ main.o, utils.o 규칙을 직접 정의하지 않아도 자동으로 컴파일됨.


📌 2-2. C++ 파일에서 오브젝트 파일(.o) 자동 생성

  • make는 C++ 파일(.cpp)도 자동으로 컴파일하는 사전 정의된 규칙을 포함하고 있습니다.
g++ -c source.cpp -o source.o

🔹 예제 2: C++ 파일을 자동으로 빌드하는 Makefile

CXX = g++
CXXFLAGS = -Wall -g

all: myprogram

myprogram: main.o utils.o
	$(CXX) $(CXXFLAGS) -o myprogram main.o utils.o

➡ make 실행 시:

g++ -c main.cpp -o main.o
g++ -c utils.cpp -o utils.o
g++ -o myprogram main.o utils.o

➡ C++의 .cpp 파일도 자동으로 .o 파일로 변환됨.


3. make가 내부적으로 지원하는 규칙 활용

📌 3-1. 사전 정의된 규칙 목록

  • make -p 명령어를 실행하면 make가 자동으로 사용하는 사전 정의된 규칙 목록을 확인할 수 있습니다.
make -p | less

📌 3-2. 사전 정의된 규칙 예제

규칙  자동 실행되는 명령어
%.o: %.c gcc -c $< -o $@
%.o: %.cpp g++ -c $< -o $@
%.o: %.s as $< -o $@
%.c: %.y yacc $< -o $@ (Yacc 파서 생성)
%.c: %.l lex $< -o $@ (Lex 어휘 분석기 생성)

🔹 예제 3: 사전 정의된 규칙을 활용하는 Makefile

CC = gcc
CFLAGS = -Wall -g
SRC = main.c utils.c
OBJS = $(SRC:.c=.o)
TARGET = myprogram

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^

clean:
	rm -f $(OBJS) $(TARGET)

이점

  • .c → .o 변환을 사전 정의된 규칙을 활용하여 자동으로 수행.
  • .o 파일을 명시적으로 정의하지 않아도 make가 알아서 처리.

4. 사전 정의된 규칙을 활용한 최적화된 Makefile

사전 정의된 규칙을 적극 활용하면 Makefile을 더욱 간결하게 정리할 수 있습니다.

🔹 예제 4: 최적화된 Makefile

CC = gcc
CFLAGS = -Wall -g
SRC = main.c utils.c
OBJS = $(SRC:.c=.o)
TARGET = myprogram

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^

clean:
	rm -f $(OBJS) $(TARGET)

이점

  • main.o와 utils.o에 대한 규칙을 명시적으로 작성하지 않아도 자동으로 컴파일됨.
  • make clean을 통해 불필요한 파일을 쉽게 삭제할 수 있음.
make

➡ make 실행 시 내부적으로:

gcc -c main.c -o main.o
gcc -c utils.c -o utils.o
gcc -o myprogram main.o utils.o

자동 실행됨.


📌 2-4. 사전 정의된 규칙 (Implicit Rules) 요약 정리

개념 설명
사전 정의된 규칙 make가 내부적으로 제공하는 자동 빌드 규칙
C 파일 자동 컴파일 .c → .o 변환 (gcc -c source.c -o source.o)
C++ 파일 자동 컴파일 .cpp → .o 변환 (g++ -c source.cpp -o source.o)
명령어 확인 make -p 명령어로 자동 규칙 확인 가능
Makefile 최적화 직접 규칙을 정의하지 않아도 make가 자동 실행