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

222

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

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

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

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

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

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

Майкл
источник

Ответы:

368

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

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

Это также может быть встроено в вспомогательную функцию, которая может дополнительно использовать регулярное выражение для печати только подмножества переменных с совпадающими именами.

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()

Чтобы напечатать переменные окружения, используйте командный режим CMake :

execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")
Sakra
источник
Это очень полезный фрагмент. Почему не выводятся переменные ENV, которые я устанавливаю в командной строке?
Игорь Ганапольский
2
@ Geremia, вы можете скопировать этот блок кода в файл myfile.txt и выполнить: cmake -P myfile.txt
Idok
2
VARIABLESперечисляет только «переменные, определенные в текущем каталоге». cmake.org/cmake/help/latest/prop_dir/…
CivFan
1
Мне пришлось удалить STATUSиз messageкоманды для вывода, чтобы быть видимым.
luator
Не работал для меня все, что я получил, было переменными, начинающимися с CMAKE_ *
C Johnson
173

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

cmake -LAH

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

-L[A][H]

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

Перечислите переменные кэша, запустит CMake и выведет список всех переменных из кэша CMake, которые не помечены как INTERNALили ADVANCED. Это будет эффективно отображать текущие настройки CMake [...].

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

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

jtsagata
источник
4
Сделайте это в вашем каталоге сборки
jtsagata
5
Обратите внимание, что этот метод НЕ печатает системные переменные (WIN32, UNIX, APPLE и т. Д.).
Холокронотка
4
Это не распечатывает все доступные библиотеки, только кэшированные.
rafalcieslak
2
Это не распечатывает все переменные, только кэшированные. (FTFY rafa)
Qwertie
9

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

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

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
3
Полезный инструмент :) Тем не менее, вопросы просит распечатать все переменные ... но это покажет только кэшированные переменные.
OLL