CMakeLists.txt 파일은 프로젝트의 소스 파일, 헤더 파일, 라이브러리, 타겟 등을 정의하고, 이들을 빌드하고 관리하는 방식을 지정한다. 또한, CMakeLists.txt 파일은 다른 CMake 모듈과의 상호작용을 관리하며, 빌드 옵션, 컴파일러 설정 등을 지정할 수 있다.

프로젝트 설정

CMakeLists.txt 파일의 시작 부분에서 프로젝트를 정의한다. 이를 위해 project() 명령어를 사용하며, 프로젝트의 이름과 버전을 명시할 수 있다.

cmake_minimum_required(VERSION 3.10)
project(MyProject VERSION 1.0)

cmake_minimum_required() 명령어는 CMake의 최소 버전을 지정하며, 이 버전보다 낮은 CMake를 사용할 경우 오류를 발생시킨다.

소스 파일 설정

소스 파일을 지정하는 것은 CMake에서 매우 중요한 단계이다. 소스 파일들은 일반적으로 변수에 저장되며, 이를 통해 나중에 간단하게 참조할 수 있다. set() 명령어를 사용하여 소스 파일을 변수에 정의한다.

set(SOURCES
    main.cpp
    file1.cpp
    file2.cpp
)

이 예에서는 SOURCES라는 변수에 프로젝트의 주요 소스 파일들을 나열하고 있다. 이렇게 정의된 변수는 이후에 타겟을 생성할 때 사용된다.

타겟 설정

CMake에서 타겟(target)은 빌드할 결과물(예: 실행 파일, 라이브러리)을 의미한다. 타겟은 add_executable() 또는 add_library() 명령어를 사용하여 생성할 수 있다.

add_executable(MyExecutable ${SOURCES})

이 명령어는 MyExecutable이라는 실행 파일을 생성하며, 앞서 정의한 소스 파일들을 사용하여 빌드한다.

add_library(MyStaticLib STATIC ${SOURCES})

이 명령어는 정적 라이브러리(.a 또는 .lib)를 생성하며, 소스 파일들을 정적으로 링크하여 라이브러리를 만든다.

add_library(MySharedLib SHARED ${SOURCES})

이 명령어는 동적 라이브러리(.so 또는 .dll)를 생성하며, 빌드 시에 동적으로 링크되는 라이브러리를 만든다.

타겟 속성 설정

타겟을 생성한 후에는 해당 타겟의 속성을 설정할 수 있다. 예를 들어, 타겟이 특정 라이브러리에 링크되도록 하거나, 타겟의 컴파일 옵션을 지정할 수 있다.

target_link_libraries(MyExecutable PRIVATE MyStaticLib)

이 명령어는 MyExecutableMyStaticLib 정적 라이브러리에 링크되도록 설정한다. PRIVATE 키워드는 링크 설정이 타겟 내에서만 사용됨을 의미한다. PUBLIC 또는 INTERFACE를 사용할 수도 있다.

target_compile_options(MyExecutable PRIVATE -Wall -Wextra)

이 명령어는 MyExecutable을 컴파일할 때 경고 메시지를 표시하는 -Wall-Wextra 옵션을 추가로 설정한다.

파일 및 디렉터리 구조 관리

CMake는 소스 파일이 위치한 디렉터리를 관리할 수 있는 기능도 제공한다. 프로젝트가 여러 디렉터리로 나뉘어 있는 경우, 각 디렉터리에 별도의 CMakeLists.txt 파일을 두고, 이를 상위 디렉터리의 CMakeLists.txt에서 포함시킬 수 있다.

add_subdirectory(src)
add_subdirectory(lib)

이 명령어는 srclib 디렉터리에 있는 CMakeLists.txt 파일을 포함시켜, 해당 디렉터리의 설정이 상위 디렉터리의 빌드 프로세스에 통합되도록 한다.

CMake 변수 및 조건부 설정

CMake에서는 다양한 변수와 조건문을 사용하여 빌드 설정을 동적으로 관리할 수 있다.

set(CMAKE_CXX_STANDARD 17)

이 명령어는 C++ 표준 버전을 C++17로 설정한다. 이후 모든 타겟은 C++17 표준을 따르게 된다.

if(WIN32)
    message(STATUS "Building for Windows")
elseif(UNIX)
    message(STATUS "Building for Unix-like OS")
endif()

이 예에서는 운영 체제에 따라 다른 메시지를 출력하도록 조건부 설정을 적용 하였다.


관련 자료: - CMake 공식 문서: https://cmake.org/documentation/ - Mastering CMake by Ken Martin and Bill Hoffman