CMake
CMake
개요
CMake(Cross-platform Make)는 소프트웨어 빌드 프로세스를 자동화하기 위한 크로스플랫폼 빌드 시스템 관리 도구입니다. CMake 소스 코드를 기반으로 플랫폼별 빌드 시스템(예: Makefile, Ninja, Visual Studio 프로젝트 등)을 생성하는 역할을 하며, C, C++, Fortran, CUDA 등 다양한 프로그래밍 언어를 지원합니다. CMake는 원래 2000년대 초반에 Kitware에서 ITK(Image ToolKit) 프로젝트의 빌드 자동화를 위해 개발되었으며, 이후 오픈소스 및 상용 소프트웨어 개발 전반에서 널리 사용되고 있습니다.
CMake는 빌드 스크립트를 작성하는 언어인 CMake 언어를 제공하며, 사용자는 [CMakeLists.txt](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B9%8C%EB%93%9C%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8/CMakeLists.txt)라는 텍스트 파일에 프로젝트 구조, 소스 파일, 의존성, 컴파일러 옵션 등을 정의합니다. 이 파일을 기반으로 CMake는 사용자의 운영체제와 개발 환경에 맞는 빌드 파일을 생성합니다.
주요 특징
크로스플랫폼 지원
CMake는 Windows, Linux, macOS, Unix 계열 등 다양한 운영체제에서 동일한 방식으로 빌드 설정을 관리할 수 있습니다. 예를 들어, 하나의 CMakeLists.txt 파일로 Windows에서는 Visual Studio 프로젝트를, Linux에서는 Makefile을 생성할 수 있습니다.
다양한 빌드 시스템 생성
CMake는 아래와 같은 다양한 빌드 시스템을 생성할 수 있습니다: - Unix Makefiles - Ninja (고속 빌드용) - Visual Studio (여러 버전 지원) - Xcode (macOS 전용) - Eclipse CDT4
이로 인해 개발팀은 동일한 설정으로 다양한 개발 환경을 지원할 수 있습니다.
모듈화 및 재사용성
CMake는 [find_package](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%9D%98%EC%A1%B4%EC%84%B1%20%EA%B4%80%EB%A6%AC/find_package)()를 통해 외부 라이브러리(예: Boost, OpenCV, Qt 등)를 쉽게 찾고 연결할 수 있습니다. 또한, 사용자 정의 모듈(*.cmake 파일)을 작성하여 반복적인 설정을 재사용할 수 있습니다.
GUI 및 CLI 지원
CMake는 명령줄 도구(cmake) 외에도 그래픽 인터페이스인 CMake-GUI와 대화형 구성 도구 ccmake(Curses 기반)를 제공하여 설정을 쉽게 조정할 수 있습니다.
기본 사용법
CMakeLists.txt 작성
CMake 기반 프로젝트는 반드시 루트 디렉터리에 CMakeLists.txt 파일을 포함해야 합니다. 아래는 간단한 예시입니다:
cmake_minimum_required(VERSION 3.10)
project(MyProject)
# C++ 표준 설정
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 소스 파일 목록
set(SOURCES
src/main.cpp
src/utils.cpp
)
# 실행 파일 생성
add_executable(myapp ${SOURCES})
빌드 프로세스
-
빌드 디렉터리 생성 (권장: out-of-source 빌드)
mkdir build cd build -
빌드 시스템 생성
또는 Ninja 사용:cmake ..cmake -G "Ninja" .. -
빌드 실행
make # Makefile 사용 시 ninja # Ninja 사용 시
고급 기능
조건부 설정
플랫폼이나 컴파일러에 따라 조건부로 설정을 변경할 수 있습니다:
if(WIN32)
target_compile_definitions(myapp PRIVATE PLATFORM_WIN)
elseif(UNIX)
target_compile_definitions(myapp PRIVATE PLATFORM_UNIX)
endif()
외부 라이브러리 연결
예: OpenCV 사용
find_package(OpenCV REQUIRED)
target_link_libraries(myapp ${OpenCV_LIBS})
서브디렉터리 및 모듈화
대규모 프로젝트에서는 [add_subdirectory](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%AA%A8%EB%93%88%ED%99%94/add_subdirectory)()를 사용해 모듈별로 관리:
add_subdirectory(src/lib)
add_subdirectory(src/app)
관련 도구 및 생태계
- CPM.cmake: CMake 기반의 패키지 매니저로,
FetchContent를 쉽게 사용할 수 있게 해줍니다. - CTest: CMake와 통합된 테스트 실행 도구.
- CPack: 소프트웨어 배포 패키지 생성 도구 (ZIP, DEB, RPM 등).
- CMake Presets:
[CMakePresets.json](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%B9%8C%EB%93%9C%20%EC%84%A4%EC%A0%95/CMakePresets.json)을 통해 빌드 설정을 공유하고 일관성 있게 유지.
참고 자료
- 공식 CMake 문서
- Kitware CMake GitHub 저장소
- "Professional CMake: A Practical Guide", Craig Scott, 2021
CMake는 현대 C++ 개발에서 표준 빌드 도구로 자리 잡았으며, 특히 크로스플랫폼 라이브러리 및 프레임워크 개발에 필수적인 역할을 하고 있습니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.