CMake: Print out all accessible variables in a script

Cmake

Cmake Problem Overview


I'm wondering if there is a way to print out all accessible variables in CMake. I'm not interested in the CMake variables - as in the --help-variables option. I'm talking about my variables that I defined, or the variables defined by included scripts.

I'm currently including:

INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)

And I was hoping that I could just print out all the variables that are here, instead of having to go through all the files and read what was available - I may find some variables I didn't know about that may be useful. It would be good to aid learning & discovery. It is strictly for debugging/development.

This is similar to the question in https://stackoverflow.com/questions/2834579/print-all-local-variables-accessible-to-the-current-scope-in-lua, but for CMake!

Has anyone done this?

Cmake Solutions


Solution 1 - Cmake

Using the get_cmake_property function, the following loop will print out all CMake variables defined and their values:

get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
	message(STATUS "${_variableName}=${${_variableName}}")
endforeach()

This can also be embedded in a convenience function which can optionally use a regular expression to print only a subset of variables with matching names

function(dump_cmake_variables)
	get_cmake_property(_variableNames VARIABLES)
	list (SORT _variableNames)
	foreach (_variableName ${_variableNames})
		if (ARGV0)
			unset(MATCHED)
			string(REGEX MATCH ${ARGV0} MATCHED ${_variableName})
			if (NOT MATCHED)
				continue()
			endif()
		endif()
		message(STATUS "${_variableName}=${${_variableName}}")
	endforeach()
endfunction()

To print environment variables, use CMake's command mode:

execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")

Solution 2 - Cmake

Another way is to simply use:

cmake -LAH

From the manpage:

>-L[A][H] > > List non-advanced cached variables. > > List cache variables will run CMake and list all the variables from the CMake cache that are not marked as INTERNAL or ADVANCED. This will effectively display current CMake settings [...]. > > If A is specified, then it will display also advanced variables. > > If H is specified, it will also display help for each variable.

Solution 3 - Cmake

ccmake is a good interactive option to interactively inspect cached variables (option( or set( CACHE:

sudo apt-get install cmake-curses-gui
mkdir build
cd build
cmake ..
ccmake ..

https://i.stack.imgur.com/ohmjl.png" width="500" />

Solution 4 - Cmake

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.

Solution 5 - Cmake

None of the current answers allowed me to see the variables in my project subdirectory. Here's a solution:

function(print_directory_variables dir)
    # Dump variables:
    get_property(_variableNames DIRECTORY ${dir} PROPERTY VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        get_directory_property(_variableValue DIRECTORY ${dir} DEFINITION ${_variableName})
        message(STATUS "DIR ${dir}: ${_variableName}=${_variableValue}")
    endforeach()
endfunction(print_directory_variables)

# for example
print_directory_variables(.)
print_directory_variables(ui/qt)

Solution 6 - Cmake

based on @sakra

function(dump_cmake_variables)
    get_cmake_property(_variableNames VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        if (ARGV0)
            unset(MATCHED)

            #case sensitive match
            # string(REGEX MATCH ${ARGV0} MATCHED ${_variableName})
            #
            #case insenstitive match
            string( TOLOWER "${ARGV0}" ARGV0_lower )
            string( TOLOWER "${_variableName}" _variableName_lower )
            string(REGEX MATCH ${ARGV0_lower} MATCHED ${_variableName_lower})

            if (NOT MATCHED)
                continue()
            endif()
        endif()
        message(STATUS "${_variableName}=${${_variableName}}")
    endforeach()
endfunction()

dump_cmake_variables("^Boost")

variable names are case sensitive

btw if you are interested in boost, it is Boost_INCLUDE_DIRS not BOOST_INCLUDE_DIRS, and it is Boost_LIBRARIES not BOOST_LIBRARIES, and by mistake I had BOOST_LIBRARIES instead of Boost_LIBRARIES, https://cmake.org/cmake/help/v3.0/module/FindBoost.html , better example for boost:

set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS RANDOM)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(myfile PRIVATE
 ${Boost_LIBRARIES}
)

Solution 7 - Cmake

You can use message :

message([STATUS] "SUB_SOURCES : ${SUB_SOURCES}")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMichaelView Question on Stackoverflow
Solution 1 - CmakesakraView Answer on Stackoverflow
Solution 2 - CmakejtsagataView Answer on Stackoverflow
Solution 3 - CmakeCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 4 - CmakeWillem HengeveldView Answer on Stackoverflow
Solution 5 - CmakebukzorView Answer on Stackoverflow
Solution 6 - CmakeShimon DoodkinView Answer on Stackoverflow
Solution 7 - CmakeFurlingsView Answer on Stackoverflow