Как получить переменную CMake из командной строки? - PullRequest
25 голосов
/ 12 декабря 2011

Примерно так:

cmake --get-variable=MY_CMAKE_VARIABLE

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

Ответы [ 5 ]

15 голосов
/ 12 декабря 2011

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

grep MY_CMAKE_VARIABLE CMakeCache.txt

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

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

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

<VARIABLE>:<TYPE>=<VALUE>

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

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.И он не будет отображать ничего, что кэшируется ВНУТРЕННИЙ, и будет отображаться только ДОПОЛНИТЕЛЬНО, если вместо -L используется -LA.

Если ваши переменные помечены как ВНУТРЕННИЕ или не CACHE'd вообще, то в CMake нет метода, чтобы вытащить его.Но переменные, не относящиеся к CACHE, должны быть временными, поэтому я не уверен, зачем они вам понадобятся вне среды сборки.

6 голосов
/ 21 июля 2016

Используйте:

cmake -LA -N /path/to/project

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

4 голосов
/ 14 июля 2018

Если переменная, которую вы хотите, это не то, что вы устанавливаете, а что-то из значений по умолчанию, вы можете использовать

cmake --system-information

И смотри. Обратите внимание, что кажется, что это занимает секунду или две, что кажется довольно медленным. Если, например, вы пытаетесь сделать это для настройки ваших cmake vars в первую очередь, это позволит избежать вывоза телеги впереди лошади. :)

Вы также можете передать это имя файла. Таким образом, вы можете попытаться сгенерировать его, только если он не существует, и проанализировать файл, если он существует (чтобы сэкономить 1-2 секунды).

3 голосов
/ 06 ноября 2013

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

include(<Path to original CMakeLists.txt>)

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

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

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

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

0 голосов
/ 12 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...