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가 자동 실행 |
'개발 > 개발도구와 환경' 카테고리의 다른 글
Makefile - 3. Makefile의 기능 확장 (3-2. 포함 파일 (Include)) (0) | 2025.03.11 |
---|---|
Makefile - 3. Makefile의 기능 확장 (3-1. Makefile에서 함수 사용하기) (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 |
Makefile - 2. Makefile의 기본 문법 (2-1. 변수 (Variables)) (0) | 2025.03.11 |