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() 등으로 쉽게 설정 가능 |