Makefile - 6. Makefile과 CMake 비교 (6-1. Makefile vs CMake)

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

📌 6-1. Makefile vs CMake

Makefile과 CMake는 소프트웨어 빌드를 자동화하는 도구입니다.
Makefile은 로컬 환경에서 직접 컴파일 명령을 작성하는 방식,
CMake는 다양한 플랫폼에서 Makefile 또는 다른 빌드 시스템을 자동 생성하는 방식입니다.

이 섹션에서는 Makefile과 CMake의 차이점, CMake가 필요한 경우, 그리고 CMakeLists.txt의 기본 구조를 설명합니다.


1. Makefile과 CMake의 차이점

📌 1-1. Makefile과 CMake의 개념

빌드 시스템 개념
Makefile 직접 컴파일 및 빌드 명령을 작성하는 스크립트
CMake 크로스 플랫폼 빌드를 지원하며 다양한 빌드 시스템을 자동 생성하는 도구

📌 1-2. Makefile vs CMake 비교표

항목  Makefile  CMake
설정 방식 직접 작성 CMakeLists.txt를 작성하고 자동 생성
사용 환경 Unix/Linux 중심 크로스 플랫폼 지원 (Windows, macOS, Linux 등)
의존성 관리 수동 설정 find_package()를 사용하여 자동 탐색 가능
빌드 시스템 GNU Make 전용 Make, Ninja, Visual Studio 등 다양한 빌드 시스템 지원
확장성 프로젝트별 Makefile을 개별 작성 add_subdirectory()로 다중 디렉토리 프로젝트 관리 가능
C++ 프로젝트 지원 가능하지만 복잡함 target_link_libraries() 등으로 손쉽게 설정 가능

Makefile은 단순한 프로젝트나 특정 플랫폼에서 빌드할 때 적합
CMake는 크로스 플랫폼 지원 및 대규모 프로젝트에서 유용


2. CMake를 사용해야 하는 경우

📌 2-1. CMake가 필요한 상황

CMake는 다음과 같은 경우에 매우 유용합니다.

상황  Makefile CMake
윈도우 + 리눅스 + 맥OS 지원 필요 ❌ 직접 OS별 Makefile 작성 필요 ✅ CMakeLists.txt 하나로 여러 OS 지원 가능
빌드 시스템 변경 (Make → Ninja 등) ❌ Makefile을 직접 수정해야 함 ✅ cmake -G "Ninja" 한 줄로 변경 가능
라이브러리 의존성 자동 탐색 ❌ 직접 경로를 지정해야 함 ✅ find_package()로 자동 탐색 가능
다중 디렉토리 프로젝트 관리 ❌ 디렉토리별 Makefile 작성 필요 ✅ add_subdirectory()로 손쉽게 구조화 가능
C++ 프로젝트 관리 ❌ 직접 파일을 관리해야 함 ✅ target_include_directories() 등으로 손쉽게 설정

결론:

  • 작은 프로젝트Makefile
  • 대형 프로젝트 & 크로스 플랫폼CMake

3. CMakeLists.txt의 기본 구조 소개

CMake는 CMakeLists.txt 파일을 통해 프로젝트 빌드를 자동화합니다.

📌 3-1. CMakeLists.txt 기본 구조

🔹 기본적인 CMakeLists.txt 예제

# 최소 요구 CMake 버전 설정
cmake_minimum_required(VERSION 3.10)

# 프로젝트 이름 및 사용 언어 지정
project(MyProject C)

# 소스 코드 목록 지정
set(SRC_FILES src/main.c src/utils.c)

# 실행 파일 생성
add_executable(myprogram ${SRC_FILES})

# include 디렉토리 추가
target_include_directories(myprogram PRIVATE include)

📌 3-2. CMakeLists.txt 주요 명령어 설명

명령어  설명
cmake_minimum_required(VERSION 3.10) 최소 CMake 버전을 지정
project(MyProject C) 프로젝트 이름을 MyProject로 설정하고 C 언어 사용
set(SRC_FILES src/main.c src/utils.c) SRC_FILES 변수에 소스 코드 파일 목록을 저장
add_executable(myprogram ${SRC_FILES}) myprogram이라는 실행 파일을 생성
target_include_directories(myprogram PRIVATE include) include/ 디렉토리를 헤더 파일 경로로 추가

이점

  • CMake는 소스 파일이 추가되면 자동으로 프로젝트에 포함 가능.
  • target_include_directories를 사용하면 헤더 파일 위치를 명확히 설정 가능.

4. CMake 빌드 과정

CMake 프로젝트를 빌드하려면 다음과 같은 과정을 거칩니다.

📌 4-1. CMake 빌드 실행 방법

mkdir build
cd build
cmake ..
make

➡ cmake .. 실행 시, CMakeLists.txt를 읽고 Makefile을 자동 생성
➡ make 실행 시, Makefile을 기반으로 실제 빌드 진행

빌드 디렉토리를 분리하면 소스 코드와 빌드 결과물이 깔끔하게 분리됨.


📌 4-2. 다른 빌드 시스템 사용 (Ninja, Visual Studio 등)

CMake는 다양한 빌드 시스템을 지원합니다.

🔹 Ninja 빌드 시스템 사용

cmake -G "Ninja" ..
ninja

➡ Ninja는 Make보다 빠른 병렬 빌드를 지원함.

🔹 Visual Studio 프로젝트 생성

cmake -G "Visual Studio 16 2019" ..
cmake -G "Visual Studio 17 2022" ..

➡ Windows에서 Visual Studio 2019 또는 2022용 프로젝트를 자동 생성.

CMake는 단순한 Makefile 생성 도구가 아니라 다양한 빌드 시스템을 지원하는 강력한 도구


📌 6-1. Makefile vs CMake 요약 정리

항목  Makefile  CMake
설정 방식 직접 작성 CMakeLists.txt를 작성하고 자동 생성
사용 환경 Unix/Linux 중심 크로스 플랫폼 지원 (Windows, macOS, Linux 등)
빌드 시스템 GNU Make 전용 Make, Ninja, Visual Studio 등 지원
의존성 관리 수동 설정 find_package()로 자동 관리
다중 디렉토리 프로젝트 디렉토리별 Makefile 필요 add_subdirectory()로 구조화 가능
C++ 프로젝트 지원 가능하지만 복잡함 target_link_libraries() 등으로 쉽게 설정 가능