Подтвердить что ты не робот

Как получить переменную CMake из командной строки?

Что-то вроде этого:

cmake --get-variable=MY_CMAKE_VARIABLE

Переменная может существовать в включенном файле CMake.

4b9b3361

Ответ 1

Если у вас есть существующий файл кеша, вы можете сделать:

grep MY_CMAKE_VARIABLE CMakeCache.txt

Если у вас еще нет файла кэша, и вы хотите увидеть, какие параметры есть в файле CMakeLists.txt, вы можете сделать (в другом каталоге, так как это будет писать файл кэша):

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

который вернет вам что-то вроде

<VARIABLE>:<TYPE>=<VALUE>

Если это расширенная переменная, добавьте флаг -A к той же команде, и она будет содержать расширенные переменные. Конечно, если вы хотите только значение, вы можете сделать:

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

ИЗМЕНИТЬ

Например, с CMakeLists.txt, который:

cmake_minimum_required(VERSION 2.8)

project(test)

include(otherFile.txt)

set(MY_VAR "Testing" CACHE STRING "")

И где otherFile.txt:

set(MY_OTHER_VAR "Hi" CACHE STRING "")

Команда (выполняется из другого каталога):

cmake -L ../cmaketest

дает:

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

Таким образом, он показывает переменные из других файлов. Он должен разобрать всю сборку. Проблема заключается в том, что он не будет отображать переменные, которые не отмечены CACHE. И он не будет показывать какие-либо кэшированные INTERNAL, и будет показывать только ADVANCED, если вместо -L используется -LA.

Если ваши переменные отмечены как INTERNAL, а не CACHE'd вообще, то в CMake нет способа вытащить его. Но переменные non-CACHE'd должны быть временными, поэтому я не уверен, почему вы нуждаетесь в них вне среды сборки в любом случае.

Ответ 2

Если вам нужна пользовательская переменная non cached, но не может редактировать оригинальный cmake script, вы можете прибегнуть к трюку. Создайте новый файл CMakeLists.txt в другом каталоге со следующим содержимым:

include(<Path to original CMakeLists.txt>)

message(STATUS "MY_VAR={${MY_VAR}}")

Вполне возможно, что cmake сделает много ошибок во время работы в новом каталоге. Относительные пути, если они используются в оригинале script, определенно являются причиной таких ошибок. Но cmake будет печатать последнее значение, назначенное для вашей переменной. Кроме того, отфильтруйте все ошибки и предупреждения с помощью любого известного текстового процессора (предположим, что UNIX - знакомый), например:

cmake . | sed -n 's/-- MY_VAR={\(.*\)}/\1/p' 2>&1

Я использую этот подход в сценариях поддержки проектов, он надежен до тех пор, пока оригинальный CMakeLists.txt не имеет синтаксических ошибок.

Ответ 3

Использование:

cmake -LA -N /path/to/project

чтобы получить список всех значений кеша. -N важен; это предотвращает попытку cmake пытаться сгенерировать любые файлы сборки и просто показывает вам, что в кеше.

Ответ 4

-D <var>:<type>=<value>:

Когда cmake сначала запускается в пустое дерево сборки, он создает файл CMakeCache.txt и заполняет его настраиваемыми параметрами для проекта. Эта опция может использоваться для указания параметра, который имеет приоритет над значением по умолчанию для проекта. Опция может быть повторена для количества записей кэша по желанию.