Makefile - 3. Makefile의 기능 확장 (3-2. 포함 파일 (Include))

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

📌 3-2. 포함 파일 (Include)

Makefile에서 포함 파일(Include)을 사용하면 외부 설정 파일을 불러와 Makefile을 더 효율적으로 관리할 수 있습니다.
이를 활용하면 설정값을 분리하여 유지보수성을 향상시킬 수 있으며, 다중 Makefile을 관리하는 구조를 구축할 수도 있습니다.


1. 포함 파일(Include)이란?

📌 1-1. 포함 파일(Include)의 개념

  • Makefile에서 include 키워드를 사용하여 외부 설정 파일을 불러올 수 있음.
  • 설정 파일을 분리하여 관리하면 Makefile의 가독성이 높아지고 유지보수가 쉬워짐.
  • 프로젝트가 커질수록 다중 Makefile을 관리하는 구조가 필요해짐.

2. include config.mk로 외부 설정 파일 불러오기

📌 2-1. include 키워드 사용법

  • include 키워드를 사용하여 외부 파일을 불러옵니다.
  • 설정 파일을 별도로 분리하여, Makefile을 더 깔끔하게 유지할 수 있습니다.
include config.mk

➡ config.mk 파일을 불러와서 해당 파일 내의 변수 및 설정을 적용.


📌 2-2. config.mk를 활용한 예제

🔹 프로젝트 구조

project/
├── src/
│   ├── main.c
│   ├── utils.c
│   ├── utils.h
├── config.mk
├── Makefile

🔹 config.mk (설정 파일)

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

➡ CC, CFLAGS, SRC, OBJS, TARGET 등의 변수를 선언.

🔹 Makefile

include config.mk

all: $(TARGET)

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

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

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

이점

  • config.mk에 컴파일러 옵션과 파일 목록을 정의하여 설정을 한 곳에서 쉽게 관리할 수 있음.
  • 새로운 .c 파일을 추가할 때 Makefile이 아니라 config.mk만 수정하면 됨.

📌 2-3. include 사용 시 주의할 점

  1. include할 파일이 없을 경우 make 실행이 실패할 수 있음.
    • 이를 방지하기 위해 -include(또는 .include in BSD) 키워드를 사용하면, 파일이 없어도 오류 없이 진행됨.
-include config.mk

➡ config.mk가 없을 경우에도 make 실행이 중단되지 않음.


3. 다중 Makefile 관리

📌 3-1. 다중 Makefile이 필요한 이유

  • 대규모 프로젝트에서는 단일 Makefile이 너무 커지고 관리가 어려워질 수 있음.
  • 여러 개의 Makefile을 사용하여 각 디렉토리별 빌드를 관리하는 것이 일반적임.

📌 3-2. make -C를 활용한 다중 Makefile 관리

  • make -C 옵션을 사용하면 하위 디렉토리의 Makefile을 실행할 수 있음.
  • 이를 통해 각 모듈별로 독립적인 Makefile을 관리할 수 있음.

🔹 프로젝트 구조

project/
├── src/
│   ├── main.c
│   ├── utils.c
│   ├── Makefile
├── lib/
│   ├── math.c
│   ├── Makefile
├── Makefile (최상위 Makefile)

🔹 project/src/Makefile

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

all: $(OBJS)
	$(CC) $(CFLAGS) -c $^

clean:
	rm -f $(OBJS)

🔹 project/lib/Makefile

CC = gcc
CFLAGS = -Wall -g
SRC = math.c
OBJS = $(SRC:.c=.o)

all: $(OBJS)
	$(CC) $(CFLAGS) -c $^

clean:
	rm -f $(OBJS)

🔹 project/Makefile (최상위 Makefile)

all:
	$(MAKE) -C src
	$(MAKE) -C lib

clean:
	$(MAKE) -C src clean
	$(MAKE) -C lib clean

이점

  • $(MAKE) -C src를 사용하여 하위 디렉토리의 Makefile을 실행할 수 있음.
  • clean 명령어도 각 디렉토리별로 실행 가능함.
  • 모듈화된 프로젝트 관리가 가능하여 유지보수가 쉬워짐.

4. include와 make -C를 함께 활용한 프로젝트 관리

대규모 프로젝트에서는 설정 파일을 포함하는 include 기능과, 서브 디렉토리를 관리하는 make -C를 함께 사용하면 효율적인 Makefile을 만들 수 있습니다.

🔹 예제: 최적화된 다중 Makefile 관리

include config.mk

all:
	$(MAKE) -C src
	$(MAKE) -C lib

clean:
	$(MAKE) -C src clean
	$(MAKE) -C lib clean

이점

  • 설정 값(config.mk)을 포함하여 한 곳에서 관리 가능.
  • 하위 디렉토리의 빌드를 make -C를 사용해 독립적으로 실행 가능.
  • 유지보수성이 뛰어나고, 각 모듈을 개별적으로 빌드 가능.

📌 3-2. 포함 파일(Include) 요약 정리

개념  설명
include 사용 외부 설정 파일을 Makefile에 포함
설정 파일 분리 config.mk 같은 파일을 사용하여 설정값을 분리
make -C 활용 하위 디렉토리의 Makefile을 실행
다중 Makefile 관리 대규모 프로젝트에서 모듈별 Makefile을 유지