CMakeLists.txt 파일은 CMake에서 프로젝트를 정의하고 구성하는 데 사용되는 주요 구성 파일이다. 이 파일은 프로젝트의 구조, 빌드 설정, 종속성 등을 정의한다. 다음은 CMakeLists.txt에서 프로젝트를 정의하는 방법에 대한 자세한 설명이다.

프로젝트 이름 정의

CMake에서 프로젝트를 정의할 때 가장 먼저 해야 할 일은 프로젝트의 이름을 설정하는 것이다. 이는 project() 명령어를 통해 이루어진다.

project(MyProject)

project() 명령어는 CMake에게 현재 디렉터리와 하위 디렉터리에서 빌드되는 코드가 하나의 프로젝트에 속함을 알려준다. 이 명령어는 기본적으로 다음의 요소들을 정의한다:

언어를 명시적으로 설정하고자 한다면 다음과 같이 사용할 수 있다:

project(MyProject CXX C)

위의 예에서는 C++ (CXX)와 C (C)를 프로젝트의 언어로 설정 하였다.

프로젝트 버전과 설명

CMake는 프로젝트의 버전과 설명을 추가로 정의할 수 있다. 이는 project() 명령어의 옵션으로 제공된다.

project(MyProject VERSION 1.0 DESCRIPTION "This is my project")

여기서 VERSION 옵션은 프로젝트의 버전을 지정하고, DESCRIPTION 옵션은 프로젝트에 대한 설명을 추가한다. 이 정보는 다른 CMake 명령어에서 사용될 수 있다.

패키지 관리 및 종속성 설정

CMake는 프로젝트의 종속성을 관리하기 위해 여러 명령어를 제공한다. 가장 일반적으로 사용되는 것은 find_package()이다.

find_package(SomeLibrary REQUIRED)

find_package() 명령어는 외부 라이브러리나 패키지를 검색하여 프로젝트에 추가한다. REQUIRED 옵션을 사용하면 해당 패키지가 필수임을 나타내며, 찾지 못할 경우 CMake는 오류를 발생시킨다.

또한 find_package()는 선택적으로 컴포넌트를 지정할 수도 있다.

find_package(SomeLibrary COMPONENTS component1 component2 REQUIRED)

이 경우 component1component2가 포함된 SomeLibrary 패키지를 찾아야 한다.

빌드 구성 설정

CMakeLists.txt는 프로젝트의 빌드 설정을 정의하는 데 사용된다. add_executable()add_library() 명령어가 이에 해당한다.

add_executable(MyExecutable main.cpp)

이 명령어는 main.cpp 파일을 기반으로 MyExecutable이라는 실행 파일을 생성한다.

add_library(MyLibrary STATIC lib.cpp)

이 명령어는 lib.cpp 파일을 기반으로 MyLibrary라는 정적 라이브러리를 생성한다. 라이브러리는 정적(STATIC), 동적(SHARED), 또는 모듈(MODULE)로 생성될 수 있다.

타겟 설정

CMake에서 타겟(target)은 빌드의 최종 산출물이다. add_executable()이나 add_library()로 생성된 타겟은 추가 설정이 가능한다. target_include_directories(), target_link_libraries() 등의 명령어가 사용된다.

target_include_directories(MyExecutable PRIVATE include/)
target_link_libraries(MyExecutable MyLibrary)

위의 예에서는 MyExecutable 타겟에 대해 include/ 디렉터리를 포함 디렉터리로 추가하고, MyLibrary를 링크 라이브러리로 추가 하였다.

사용자 정의 옵션 및 설정

CMake는 option() 명령어를 사용하여 사용자 정의 옵션을 만들 수 있다. 이는 프로젝트 빌드 시 사용자가 특정 기능을 활성화하거나 비활성화할 수 있도록 한다.

option(ENABLE_FEATURE "Enable this feature" ON)

이 명령어는 ENABLE_FEATURE라는 옵션을 생성하며, 기본값은 ON이다. 이 옵션의 값은 사용자가 빌드 시에 변경할 수 있다.


관련 자료: