
CMake의 캐시(Cache)는 프로젝트 구성 시 사용되는 중요한 메커니즘으로, 설정된 값들을 저장하고 유지하는 기능을 한다.
cache는 특히 여러 번 빌드해야 하는 큰 프로젝트에서 유용하며, 사용자가 특정 값을 설정하거나 수정할 때 반복적으로 설정하지 않아도 되도록 한다.
값 유지CMakeCache.txt 파일에 기록되며, 이후 CMake를 다시 실행하더라도 계속 유지된다.사용자 정의 변수 설정ccmake같은 인터페이스를 통해 캐시에 저장된 변수를 변경할 수 있으며, 이 값들은 강제로 덮어쓰지 않는 한 CMakeLists.txt 파일에서 다시 덮어쓰이지 않는다.빌드 설정 관리CMake가 프로젝트 디렉토리에서 실행되면, CMakeCache.txt 파일이 생성된다. 이 파일은 프로젝트의 root 디렉토리에 위치하며, 캐시에 저장된 변수들의 값이 여기에 기록된다.
CMake는 이 파일을 참조하여 이전에 설정된 값을 유지하거나 필요시 사용자가 지정한 값을 덮어쓴다.
소스 트리로부터 빌드 트리를 만들면, 빌드 트리에는 CMakeCache.txt 라는 파일이 생성된다. 이런 파일이 존재하는 이유는 CMakeLists.txt 파일을 수정할 때마다 다시 CMake를 통해 빌드 트리를 재구성하는 불필요한 반복 작업을 막기 위함이다.
Persistent (지속성)CMake를 다시 실행하더라도 유지된다.Override (덮어쓰기)FORCE 옵션을 사용하면 이미 캐시에 존재하는 값을 덮어쓸 수 있다.변수 관리CMake는 기본값을 사용하거나 값을 자동으로 설정한다.set(<variable> <value>... CACHE <type> <docstring> [FORCE])
<type>은 CMake GUI에 알려 줄 타입 힌트이다. <type>으로 들어갈 수 있는 것들을 다음과 같다.
BOOLFILEPATHPATHSTRINGINTERNAL[FORCE] 인자와 관련이 있다.<docstring>은 캐시 변수에 대한 설명이다.
[FORCE] 선택적 인자는 CMakeLists.txt를 실행하면서 강제로 캐시 값을 변경하기 위해서 사용한다.
또 다른 하나의 캐시 변수 생성 명령은 option() 이다. 이것은 Boolean 종류의 캐시 변수를 쉽게 만들기 위한 명령이다. 이것의 시그니처는 다음과 같다.
option(<variable> "<help_text>" [value])
<variable>은 변수명이고, "<help_text>"는 변수에 대한 설명이다. 그리고 [value]는 ON, OFF 중 하나의 값이다.
캐시 변수는 일반적으로 CMakeLists.txt를 실행하면서 변경하기 위해서 존재하는 것이 아니라, CMakeCache.txt에 기록하기 위해서 존재한다. 따라서 한 번 등록되면 변경되지 않는다. 즉 동일 변수에 대해 여러 번 set()을 하거나 option()을 해도 첫 번째 값으로만 설정된다.
빌드 트리를 만들 때, -D 옵션을 부여함으로써 값을 변경하는 것은 가능하다.
cmake -S . -B ./build -DVAR="VAR is changed"
cmake --build ./build
다음은 CMake 캐시에 변수를 설정하는 예이다.
set(my_option "default_value" CACHE STRING "A custom string option")
my_option 변수를 캐시에 저장하고, 타입을 STRING으로 지정하며, 기본값으로 "default value"를 설정한다.my_option이 존재한다면, 기존 값이 유지된다.CMakeCache.txt 파일을 편집하거나 CMake GUI 도구에서 값을 수정할 수 있다.set(library_path "/usr/local/lib" CACHE PATH "path to the library")
library_path는 경로 값을 가지고 있으며, PATH 타입으로 캐시에 저장된다.set(enable_feature ON CACHE BOOL "Enable the special feature")
enable_feature는 ON 또는 OFF로 설정 가능한 BOOL 타입의 변수이다.ON)하거나 비활성화(OFF) 할 수 있다.set(my_option "new_value" CACHE STRING "Override the custom string option FORCE")
FORCE를 사용하면, 이미 캐시에 존재하는 값을 강제로 덮어쓸 수 있다.변경하고 싶을 때 유용하다.캐시에서 변수를 삭제하려면 CMake의 캐시 파일을 직접 삭제하거나, 다음 명령어를 사용하여 빌드 디렉토리에서 캐시를 초기화할 수 있다.
rm -rf CMakeCache.txt CMakeFiles/
이 명령을 실행하면, CMakeCache.txt 파일이 삭제되어 다음 번 CMake 실행 시 캐시가 재생성된다.
다음은 실제 프로젝트에서 CMake 캐시가 어떻게 사용되는지 보여주는 예이다.
project(MyProject)
// 설정을 캐시에 저장
set(MY_PROJECT_ROOT_DIR "${CMAKE_SOURCE_DIR}" CACHE PATH "Root directory of the project")
// 옵션을 캐시에 저장
set(BUILD_TESTS ON CACHE BOOL "Build unit tests")
// 특정 라이브러리 경로 캐시에 저장
find_library(MY_LIBRARY libmy_library.so PATHS ${MY_PROJECT_ROOT_DIR}/lib CACHE)
// 테스트 빌드를 활성화한 경우에만 테스트 코드 빌드
if(BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
MY_PROJECT_ROOT_DIR에 프로젝트의 루트 경로가 저장된다.BUILD_TESTS라는 옵션이 ON으로 설정되어 있으면, 테스트 코드를 빌드한다.find_library 함수로 libmy_library.so 라이브러리를 찾아서 캐시에 저장한 후 빌드 과정에서 참조할 수 있다.빠른 빌드 설정CMake 캐시를 이용하면 변수 값을 일일이 입력하지 않아도 된다. GUI 지원ccmake나 CMake GUI를 사용해 캐시 변수의 값을 손쉽게 수정할 수 있다. 캐시 변수를 통해 빌드 옵션을 관리할 수 있어 사용자 친화적인 설정 환경을 제공한다.캐시에 저장된 값이 잘못되거나 다시 설정할 필요가 있을 때는 CMakeCache.txt 파일을 직접 삭제하거나, 빌드 디렉토리를 통째로 지운 후 CMake를 다시 실행해 초기화할 수 있다.
rm -rf CMakeCache.txt CMakeFiles/
이 방법을 사용하면 캐시에 저장된 설정값들이 모두 초기화되고, 다시 처음부터 설정할 수 있다.
CMake 캐시는 프로젝트 구성 및 빌드 환경을 효율적으로 관리하는 데 중요한 역할을 한다.
설정된 변수와 경로, 빌드 옵션 등을 캐시에 저장하여 반복적인 설정 과정을 줄이고, 필요에 따라 값을 쉽게 변경할 수 있다.
CMakeLists.txt 파일을 통해 캐시의 상태를 확인하거나 편집할 수 있으며, GUI 도구를 통해 쉽게 관리할 수 있는 장점도 있다.