Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a CMake variable from the command line?

Something like this:

cmake --get-variable=MY_CMAKE_VARIABLE

The variable may exist in an included CMake file.

like image 273
Allan Avatar asked Dec 12 '11 13:12

Allan


People also ask

How can I see CMake variables?

Another way to view all cmake's internal variables, is by executing cmake with the --trace-expand option. This will give you a trace of all . cmake files executed and variables set on each line.

How use CMake command line?

Running CMake from the command line From the command line, cmake can be run as an interactive question and answer session or as a non-interactive program. To run in interactive mode, just pass the option “-i” to cmake. This will cause cmake to ask you to enter a value for each value in the cache file for the project.

How do I print a variable value in CMake?

Run CMake and have a look at the cache with the ccmake GUI tool. Then you'll get all the variables. Or run CMake with -LH then you will get all variables printed after configuration.

How do I use a variable in CMake?

You can use the command line to set entries in the Cache with the syntax cmake -D var:type=value , just cmake -D var=value or with cmake -C CMakeInitialCache. cmake .


3 Answers

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.

like image 151
tpg2114 Avatar answered Oct 19 '22 07:10

tpg2114


Use:

cmake -LA -N /path/to/project

to get a listing of all cache values. The -N is important; it prevents cmake from trying to generate any build files, and just shows you what's in the cache.

like image 11
Paul Brannan Avatar answered Oct 19 '22 06:10

Paul Brannan


If the variable you want is not something you're setting, but something from the defaults, you can use

cmake --system-information

And grep that. Note it does seem to take a second or two which seems kinda slow. If for example you're trying to do this to configure your cmake vars in the first place, it avoids getting the cart out in front of the horse. :)

You can also pass this a file name. So you can try only generating it if it doesn't exist, and parse the file if it does (to save that 1-2 seconds).

like image 5
johnb003 Avatar answered Oct 19 '22 07:10

johnb003