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)
이 명령어는 MyExecutable
이 MyStaticLib
정적 라이브러리에 링크되도록 설정한다. PRIVATE
키워드는 링크 설정이 타겟 내에서만 사용됨을 의미한다. PUBLIC
또는 INTERFACE
를 사용할 수도 있다.
- 컴파일 옵션 설정
target_compile_options(MyExecutable PRIVATE -Wall -Wextra)
이 명령어는 MyExecutable
을 컴파일할 때 경고 메시지를 표시하는 -Wall
및 -Wextra
옵션을 추가로 설정한다.
파일 및 디렉터리 구조 관리
CMake는 소스 파일이 위치한 디렉터리를 관리할 수 있는 기능도 제공한다. 프로젝트가 여러 디렉터리로 나뉘어 있는 경우, 각 디렉터리에 별도의 CMakeLists.txt 파일을 두고, 이를 상위 디렉터리의 CMakeLists.txt에서 포함시킬 수 있다.
- 서브 디렉터리 추가
add_subdirectory(src)
add_subdirectory(lib)
이 명령어는 src
및 lib
디렉터리에 있는 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