CMake 개요
C/C++ 개발자라면 한 번쯤 겪어봤을 것이다. 오픈소스 라이브러리를 직접 빌드하려 할 때, Visual Studio 버전 차이로 인해 무수한 오류에 마주치고, 결국 포기하는 경험. 이런 문제는 프로젝트의 확산에도 큰 장애물이 된다.
특히 크로스플랫폼 개발 환경에서는 더욱 심각하다. Windows에서 개발한 후 Ubuntu 서버로 배포할 때, 플랫폼별로 별도의 빌드 스크립트를 작성해야 하는 번거로움이 존재한다. CMake는 이러한 문제를 해결하기 위한 빌드 시스템 생성 도구다.
간단한 예제로 살펴보기
다음은 가장 기본적인 프로젝트 구조다.
demo_project/
├── CMakeLists.txt
└── main.cpp
CMakeLists.txt 구성
# 최소 필요 CMake 버전 명시
cmake_minimum_required(VERSION 3.10)
# 프로젝트 식별자 설정
project(DemoApp VERSION 1.0 LANGUAGES CXX)
# 현재 디렉터리의 소스 파일을 목록으로 수집
file(GLOB_RECURSE SOURCES "src/*.cpp")
# 실행 파일 생성 규칙 정의
add_executable(${PROJECT_NAME} ${SOURCES})
main.cpp
#include <iostream>
int main() {
std::cout << "CMake 빌드 성공!" << std::endl;
return 0;
}
Visual Studio 프로젝트 생성
CMake를 실행할 때 Specify the generator for this project 단계에서 타겟 아키텍처를 주의 깊게 선택해야 한다. x86과 x64는 서로 다른 솔루션으로 분리하여 생성하는 것이 권장된다.
장단점 분석
한계점
- 새로운 구문 체계에 대한 학습 필요
- 파일 추가 시 IDE 대신 직접
CMakeLists.txt수정 필요 file(GLOB...)패턴은 헤더 파일 미포함으로 인텔리센스에 불리- 빌드 구성 변경 시 재생성 과정 필수
강점
- 단일 설정으로 다양한 플랫폼의 빌드 환경 자동 생성
- IDE 종속 설정 파일을 버전 관리에서 제외하여 저장소 깔끔화
- CI/CD 파이프라인과의 높은 통합성
실무 활용 팁
헤더 파일을 명시적으로 나열하는 것이 GLOB 패턴보다 안정적이다. target_include_directories와 함께 사용하면 IDE에서도 원활한 코드 탐색이 가능하다.
cmake_minimum_required(VERSION 3.15)
project(AdvancedDemo)
set(HEADERS
include/utils.h
include/config.h
)
set(CPP_FILES
src/main.cpp
src/utils.cpp
)
add_executable(${PROJECT_NAME} ${CPP_FILES} ${HEADERS})
target_include_directories(${PROJECT_NAME}
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
)