Table of Contents
CMake Variables
set(VAR value) sets a variable in CMake. Access it with ${VAR}. Variables have scope: local (in current file or directory), parent scope (propagate up to including CMakeLists.txt), or cache (persistent across runs, visible in the CMake GUI).
Setting and using variables:
set(SOURCES main.cpp utils.cpp) add_executable(app ${SOURCES}) set(VERSION 1.2.3) message(STATUS "Building version ${VERSION}")
Variable scope:
set(LOCAL_VAR "value") # local: only in current CMakeLists.txt set(PARENT_VAR "value" PARENT_SCOPE) # parent: visible to including file set(CACHE_VAR "value" CACHE STRING "Description") # cache: persistent
Local variables don't escape their file. If a subdirectory sets a local variable, it doesn't affect the parent. Use PARENT_SCOPE to propagate values upward.
Cache variables persist across cmake runs and appear in the CMake GUI or via cmake -DVAR=value:
set(MY_OPTION OFF CACHE BOOL "Enable feature X") if(MY_OPTION) # ... enable feature endif()
Built-in variables (read-only, set by CMake):
CMAKE_BUILD_TYPE # "Debug", "Release", "RelWithDebInfo" CMAKE_CXX_COMPILER # path to C++ compiler CMAKE_INSTALL_PREFIX # root directory for installation CMAKE_SOURCE_DIR # top-level CMakeLists.txt directory CMAKE_BINARY_DIR # build tree directory CMAKE_CURRENT_SOURCE_DIR # current CMakeLists.txt directory CMAKE_CURRENT_BINARY_DIR # current build directory PROJECT_NAME # project name from project()
Pass variables from the command line:
cmake -DCMAKE_BUILD_TYPE=Release .. cmake -DMY_OPTION=ON -DVERSION=2.0 ..
Use variables to avoid repetition, configure builds conditionally, and parameterize paths. They're the primary way to make CMake flexible across different environments and user preferences.
