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
  1. all 실행 → myprogram을 빌드해야 함.
  2. myprogram은 main.o와 utils.o를 필요로 함.
  3. main.o와 utils.o가 존재하지 않거나 변경되었으면 각각 다시 빌드.
  4. gcc -o myprogram main.o utils.o 명령어로 실행 파일을 생성.
make clean
  1. .o 파일과 실행 파일 myprogram을 삭제하여 정리.

📌 1-3. 기본적인 Makefile 구조 요약 정리

개념  설명
Target (목표) 빌드할 대상(예: 실행 파일, 오브젝트 파일)
Dependencies (의존성) Target을 만들기 위해 필요한 파일 목록
Command (명령어) Target을 만들기 위한 실제 명령어 (탭으로 시작해야 함)
all 전체 프로젝트를 빌드하는 Target
clean 컴파일된 파일을 삭제하는 Target
증분 빌드 변경된 파일만 다시 컴파일하여 빌드 시간을 최적화
Make 실행 흐름 종속성을 확인 후 필요한 파일만 컴파일하여 실행 파일 생성