프로젝트 이름과 버전 설정

CMake 프로젝트는 project() 명령어를 사용하여 시작된다. 이 명령어는 프로젝트의 이름과 선택적으로 버전을 지정한다. 이 프로젝트 이름은 이후 설정에서 여러 번 참조될 수 있다.

project(MyProject VERSION 1.0)

여기서 MyProject는 프로젝트 이름이며, 1.0은 버전 번호이다.

CMake 최소 요구 버전 지정

CMakeLists.txt 파일의 상단에는 일반적으로 cmake_minimum_required() 명령어가 위치한다. 이 명령어는 프로젝트를 빌드하는 데 필요한 CMake의 최소 버전을 지정한다. 이는 CMake의 호환성을 보장하는 데 중요하다.

cmake_minimum_required(VERSION 3.10)

이 명령어는 CMake 3.10 이상의 버전이 필요함을 의미한다.

실행 파일 또는 라이브러리 생성

CMake는 add_executable()add_library() 명령어를 사용하여 실행 파일과 라이브러리를 생성할 수 있다. 이러한 명령어는 빌드할 소스 파일들을 지정한다.

add_executable(MyExecutable main.cpp)
add_library(MyLibrary STATIC library.cpp)

add_executable() 명령어는 main.cpp를 컴파일하여 MyExecutable 실행 파일을 생성한다. add_library() 명령어는 library.cpp를 사용하여 정적 라이브러리 MyLibrary를 생성한다.

타깃 링크 라이브러리 지정

프로그램이 외부 라이브러리를 사용할 경우, target_link_libraries() 명령어를 사용하여 이들을 지정할 수 있다. 이 명령어는 실행 파일 또는 라이브러리와 함께 링크할 라이브러리를 지정한다.

target_link_libraries(MyExecutable PRIVATE MyLibrary)

위의 예에서는 MyExecutableMyLibrary와 링크된다.

타깃 포함 디렉토리 설정

소스 파일이 프로젝트의 다른 디렉토리나 외부 디렉토리에 있는 헤더 파일을 포함해야 할 경우, target_include_directories() 명령어를 사용하여 포함 디렉토리를 설정할 수 있다.

target_include_directories(MyExecutable PRIVATE include/)

이 명령어는 include/ 디렉토리를 MyExecutable의 포함 디렉토리로 설정한다.

컴파일 옵션 설정

target_compile_options() 명령어를 사용하여 특정 타깃에 대해 컴파일러 옵션을 설정할 수 있다. 이 명령어는 컴파일 과정에서 추가적인 플래그를 전달하는 데 유용하다.

target_compile_options(MyExecutable PRIVATE -Wall -Wextra)

위의 예에서는 MyExecutable이 컴파일될 때 경고 메시지를 활성화하는 -Wall-Wextra 플래그가 사용된다.

설치 규칙 지정

프로젝트의 빌드 결과물을 설치하려면 install() 명령어를 사용하여 설치 규칙을 지정할 수 있다. 이 명령어는 파일을 특정 디렉토리에 설치할 수 있도록 한다.

install(TARGETS MyExecutable DESTINATION bin)

이 예에서는 MyExecutablebin 디렉토리에 설치된다.

옵션 설정

option() 명령어를 사용하여 사용자가 빌드 시 선택할 수 있는 옵션을 정의할 수 있다. 이 명령어는 프로젝트에서 특정 기능을 켜거나 끌 수 있게 한다.

option(ENABLE_TESTS "Enable test build" ON)

위의 예에서는 ENABLE_TESTS라는 옵션을 정의하며, 기본값은 ON이다.

조건부 구성

CMake는 if(), elseif(), else() 명령어를 사용하여 조건부 구성을 지원한다. 이 명령어는 특정 조건에 따라 다른 설정을 적용하는 데 사용된다.

if(ENABLE_TESTS)
  add_subdirectory(tests)
endif()

이 예에서는 ENABLE_TESTS 옵션이 켜져 있을 경우 tests 디렉토리를 추가하여 테스트 빌드를 설정한다.


관련 자료: