Makefile - 1. Makefile 기본 개념 (1-3. 기본적인 Makefile 구조)
2025. 3. 11. 18:57ㆍ개발/개발도구와 환경
📌 1-3. 기본적인 Makefile 구조
Makefile은 특정 목표(Target)을 만들기 위해, 해당 의존성(Dependency)을 확인하고, 필요한 명령어(Command)를 실행하는 구조로 되어 있습니다.
이를 통해 자동화된 빌드 시스템을 구현할 수 있으며, 프로젝트의 크기가 커질수록 더욱 효율적인 빌드를 가능하게 합니다.
1. Makefile 기본 구조
📌 1-1. Makefile의 문법
Makefile은 기본적으로 다음과 같은 3가지 요소로 구성됩니다.
target: dependencies
commands
구성 요소 | 설명 |
Target (목표) | 생성하려는 파일 (예: 실행 파일) |
Dependencies (의존성) | Target을 만들기 위해 필요한 파일 |
Commands (명령어) | Target을 만들기 위한 실행 명령어 (탭 문자로 시작해야 함) |
🔹 주의 사항
- commands 줄의 앞에는 반드시 탭(Tab) 문자가 있어야 합니다.
- commands는 쉘 명령어(Bash 명령어)로 실행됩니다.
- dependencies가 변경되었거나 없으면, commands가 실행됩니다.
2. 목표(Target)
📌 2-1. 목표란?
- make를 실행하면 가장 먼저 Makefile의 첫 번째 Target을 찾습니다.
- 일반적으로 첫 번째 Target은 전체 빌드를 위한 목표(all)로 설정합니다.
🔹 예제 1: 실행 파일 생성
myprogram: main.o utils.o
gcc -o myprogram main.o utils.o
- myprogram은 실행 파일(Target)입니다.
- main.o와 utils.o가 이 실행 파일을 만들기 위한 종속 파일(Dependencies)입니다.
🔹 예제 2: 전체 빌드를 위한 Target (all)
all: myprogram
- all은 실행 가능한 빌드 엔트리 포인트 역할을 합니다.
- make 실행 시 all이 첫 번째 Target이므로, myprogram이 실행됩니다.
🔹 예제 3: 청소(Clean) Target
clean:
rm -f *.o myprogram
- clean은 .o 파일과 실행 파일을 삭제하는 Target입니다.
- make clean을 실행하면 컴파일된 파일들을 정리할 수 있습니다.
3. 의존성(Dependency)
📌 3-1. 의존성이란?
Makefile에서 Target을 만들기 위해 필요한 파일 목록을 의존성(Dependency)이라고 합니다.
만약 Dependency가 변경되면, 해당 Target이 다시 생성됩니다.
📌 3-2. 의존성의 역할
- 변경된 파일만 다시 빌드하여 최적화된 빌드 수행
- 재사용성 향상 (변경되지 않은 파일은 다시 빌드할 필요 없음)
🔹 예제 1: 기본적인 의존성 구조
myprogram: main.o utils.o
gcc -o myprogram main.o utils.o
- myprogram 실행 파일을 만들려면 main.o와 utils.o가 필요합니다.
- main.o 또는 utils.o가 변경되면 myprogram이 다시 빌드됩니다.
🔹 예제 2: 더 세부적인 의존성 관리
main.o: main.c utils.h
gcc -c main.c
utils.o: utils.c utils.h
gcc -c utils.c
- main.o는 main.c와 utils.h에 의존
- utils.o는 utils.c와 utils.h에 의존
- utils.h가 변경되면 main.o와 utils.o 모두 다시 컴파일됩니다.
4. 명령어(Command)
📌 4-1. 명령어란?
- Target을 만들기 위해 실행되는 쉘(Shell) 명령어입니다.
- 탭(Tab) 문자로 시작해야 합니다.
- Linux와 Windows에서 사용하는 쉘 명령어가 다를 수 있습니다.
🔹 예제 1: 오브젝트 파일 컴파일
main.o: main.c
gcc -c main.c
- main.o가 없거나 main.c가 수정되면 gcc -c main.c가 실행됩니다.
🔹 예제 2: 실행 파일 만들기
myprogram: main.o utils.o
gcc -o myprogram main.o utils.o
- gcc -o myprogram main.o utils.o가 실행되어 실행 파일을 만듭니다.
🔹 예제 3: 실행 파일 제거 (make clean)
clean:
rm -f *.o myprogram
- rm -f 명령어를 사용하여 .o 파일과 실행 파일을 삭제합니다.
5. 기본적인 Makefile 예제
CC = gcc
CFLAGS = -Wall -g
all: myprogram
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o myprogram main.o utils.o
main.o: main.c utils.h
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c utils.c
clean:
rm -f *.o myprogram
📌 실행 과정
make
- all 실행 → myprogram을 빌드해야 함.
- myprogram은 main.o와 utils.o를 필요로 함.
- main.o와 utils.o가 존재하지 않거나 변경되었으면 각각 다시 빌드.
- gcc -o myprogram main.o utils.o 명령어로 실행 파일을 생성.
make clean
- .o 파일과 실행 파일 myprogram을 삭제하여 정리.
📌 1-3. 기본적인 Makefile 구조 요약 정리
개념 | 설명 |
Target (목표) | 빌드할 대상(예: 실행 파일, 오브젝트 파일) |
Dependencies (의존성) | Target을 만들기 위해 필요한 파일 목록 |
Command (명령어) | Target을 만들기 위한 실제 명령어 (탭으로 시작해야 함) |
all | 전체 프로젝트를 빌드하는 Target |
clean | 컴파일된 파일을 삭제하는 Target |
증분 빌드 | 변경된 파일만 다시 컴파일하여 빌드 시간을 최적화 |
Make 실행 흐름 | 종속성을 확인 후 필요한 파일만 컴파일하여 실행 파일 생성 |
'개발 > 개발도구와 환경' 카테고리의 다른 글
Makefile - 2. Makefile의 기본 문법 (2-2. 자동 변수 (Automatic Variables)) (0) | 2025.03.11 |
---|---|
Makefile - 2. Makefile의 기본 문법 (2-1. 변수 (Variables)) (0) | 2025.03.11 |
Makefile - 1. Makefile 기본 개념 (1-2. Makefile의 동작 방식) (0) | 2025.03.11 |
Makefile - 1. Makefile 기본 개념 (1-1. Makefile이란?) (0) | 2025.03.11 |
Makefile 기본 사용법 (0) | 2024.08.07 |