CMAKE: распечатать все доступные переменные в скрипте

Мне интересно, есть ли способ распечатать все доступные переменные в CMAKE. Меня не интересуют переменные CMAKE - как и опция --help-variable. Я говорю о моих переменных, которые я определил, или переменных, определенных включенными сценариями.

Я в настоящее время в том числе

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

и надеялся, что я смогу просто распечатать все переменные, которые есть здесь, вместо того, чтобы просматривать все файлы и читать то, что было доступно - я могу найти некоторые переменные, о которых я не знал, которые могут быть полезны. Было бы хорошо, чтобы помочь обучению и открытию. Это строго для отладки / разработки.

похоже на вопрос в Print всех локальных переменных, доступных для текущей области в Lua, но для cmake!

Кто-нибудь делал это?

7 ответов

Решение

Используя функцию get_cmake_property, следующий цикл выведет все определенные переменные CMake и их значения:

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

Для печати переменных среды используйте командный режим cmake:

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

Другой способ - просто использовать:

cmake -LAH

Из справочной страницы:

-L[A][H]

Список не продвинутых кэшированных переменных.

Перечислите переменные кэша, запустит CMake и выведет список всех переменных из кэша CMake, которые не помечены как ВНУТРЕННИЕ или ДОП. Это будет эффективно отображать текущие настройки CMake [...].

Если указан A, то он будет отображать также расширенные переменные.

Если указано H, для каждой переменной также будет отображаться справка.

ccmake хороший интерактивный вариант для интерактивной проверки кэшированных переменных (option( или же set( CACHE:

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

Другой способ просмотреть все внутренние переменные cmake - запустить cmake с --trace-expand вариант.

Это даст вам трассировку всех выполненных файлов.cmake и переменных, установленных в каждой строке.

На основе @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")

имена переменных чувствительны к регистру

кстати, если вас интересует повышение, это Boost_INCLUDE_DIRS не BOOST_INCLUDE_DIRS, и это Boost_LIBRARIES не BOOST_LIBRARIES, и по ошибке у меня были BOOST_LIBRARIES вместо Boost_LIBRARIES, https://cmake.org/cmake/help/v3.0/module/FindBoost.html, лучший пример для повышения:

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

target_link_libraries(myfile PRIVATE
 ${Boost_LIBRARIES}
)

Ни один из текущих ответов не позволил мне увидеть переменные в подкаталоге моего проекта. Вот решение:

      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)

Вы можете использовать <em>сообщение</em> :

      message([STATUS] "SUB_SOURCES : ${SUB_SOURCES}")
Другие вопросы по тегам