How to get a CMake variable from the command line?

If you have an existing cache file, you can do:

grep MY_CMAKE_VARIABLE CMakeCache.txt

If you do not yet have a cache file and you want to see what options there are in a CMakeLists.txt file, you can do (in a different directory since this will write a cache file):

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE

which will return to you something like

<VARIABLE>:<TYPE>=<VALUE>

If it is an advanced variable, add the -A flag to the same command and it will include advanced variables. Of course, if you only want the value, you can do:

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2

EDIT

For example, with a CMakeLists.txt that is:

cmake_minimum_required(VERSION 2.8)

project(test)

include(otherFile.txt)

set(MY_VAR "Testing" CACHE STRING "")

And where otherFile.txt is:

set(MY_OTHER_VAR "Hi" CACHE STRING "")

The command (run from another directory):

cmake -L ../cmaketest

Gives:

-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tgallagher/cmaketest-build
-- Cache values
CMAKE_BUILD_TYPE:STRING=
CMAKE_INSTALL_PREFIX:PATH=/usr/local
MY_OTHER_VAR:STRING=Hi
MY_VAR:STRING=Testing

So, it does show variables from other files. It should parse the entire build. The issue though is that it will not show any variables that are not marked with CACHE. And it will not show any that are cached INTERNAL, and will only show ADVANCED if -LA is used instead of -L.

If your variables are marked as INTERNAL or not CACHE’d at all, then there is no method within CMake to pull it out. But, non-CACHE’d variables are meant to be transient, so I’m not sure why you would need them outside of a build environment anyway.

Leave a Comment