2011-12-12 15 views
18

Algo como esto:¿Cómo obtener una variable CMake desde la línea de comando?

cmake --get-variable=MY_CMAKE_VARIABLE 

La variable puede existir en un archivo de CMake incluido.

+1

La pregunta no está clara: ¿desea especificar el valor de una variable en la línea de comandos? ¿O desea extraer una variable existente de algún CMakeFile y hacer que cmake lo imprima como estándar? –

Respuesta

15

Si tiene un archivo de caché existente, puede hacer:

grep MY_CMAKE_VARIABLE CMakeCache.txt 

Si aún no dispone de un archivo de caché y desea ver qué opciones existen en un archivo CMakeLists.txt, que puede hacer (en un directorio diferente, ya que esto va a escribir un archivo de caché):

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

que devolverá a usted algo así como

<VARIABLE>:<TYPE>=<VALUE> 

Si es una variable avanzada, agregue el marcador -A al mismo comando e incluirá variables avanzadas. Por supuesto, si sólo desea que el valor, que puede hacer:

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

EDITAR

Por ejemplo, con un CMakeLists.txt que es:

cmake_minimum_required(VERSION 2.8) 

project(test) 

include(otherFile.txt) 

set(MY_VAR "Testing" CACHE STRING "") 

Y donde otherFile. txt es:

set(MY_OTHER_VAR "Hi" CACHE STRING "") 

El comando (ejecutar desde otro directorio):

cmake -L ../cmaketest 

Da:

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

Por lo tanto, sí muestra las variables de otros archivos. Debería analizar toda la compilación. El problema es que no mostrará ninguna variable que no esté marcada con CACHE. Y no mostrará ninguna que se guarde en la memoria caché INTERNA, y solo mostrará AVANZADA si se usa -LA en lugar de -L.

Si sus variables están marcadas como INTERNAS o no CACHE'd en absoluto, entonces no hay ningún método dentro de CMake para extraerlo. Pero, las variables que no son CACHE están destinadas a ser transitorias, así que no estoy seguro de por qué las necesitarías fuera de un entorno de compilación de todos modos.

+0

Ninguna de estas sugerencias parece funcionar para las variables que se incluyen desde otros CMakeFiles – Allan

+0

Se agregó un ejemplo de trabajo que incluye otros archivos cmake. ¿Qué estás intentando lograr? Tal vez haya otra manera, o una forma de establecer las variables para que pueda usarlas con el enfoque anterior. – tpg2114

-1

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

Cuando se ejecuta por primera cmake en un árbol de construcción vacía, se crea un archivo CMakeCache.txt y lo llena con ajustes personalizables para el proyecto. Esta opción se puede usar para especificar una configuración que tiene prioridad sobre el valor predeterminado del proyecto. La opción puede repetirse para tantas entradas de caché como desee.

+1

Eso no es lo que pidió OP –

2

Si necesita obtener no caché variable de usuario pero no puede editar la secuencia de comandos original de cmake, puede recurrir a un truco. Crear nuevo archivo CMakeLists.txt en otro directorio con el siguiente contenido:

include(<Path to original CMakeLists.txt>) 

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

Es muy posible, cmake formará un montón de errores mientras se ejecuta en nuevo directorio.Las rutas relativas, si se usan en el script original, definitivamente son la causa de tales errores. Pero cmake imprimirá el último valor asignado para su variable. Además, filtrar todos los errores y advertencias utilizando cualquier procesador de texto muy conocido (se supone UNIX familiar), por ejemplo:

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

utilizo este enfoque en los guiones de los proyectos de mantenimiento, es fiable, siempre y cuando CMakeLists.txt original tiene ningún errores de sintaxis

1

Uso:

cmake -LA -N /path/to/project 

para obtener una lista de todos los valores de caché. El -N es importante; evita que cmake intente generar cualquier archivo de compilación, y solo muestra qué hay en el caché.

Cuestiones relacionadas