这样的事情:
cmake --get-variable=MY_CMAKE_VARIABLE
变量可能存在于包含的CMake文件中。
答案 0 :(得分:15)
如果您有现有的缓存文件,则可以执行以下操作:
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,如果使用-LA而不是-L。
如果你的变量被标记为INTERNAL或者根本没有CACHE,那么CMake中没有任何方法可以将其拉出来。但是,非CACHE变量意味着是瞬态的,所以我不确定为什么在构建环境之外你还需要它们。
答案 1 :(得分:6)
使用:
cmake -LA -N /path/to/project
获取所有缓存值的列表。 -N很重要;它可以防止cmake尝试生成任何构建文件,只显示缓存中的内容。
答案 2 :(得分:3)
如果您需要获取非缓存用户变量但无法编辑原始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没有语法错误,它就是可靠的。
答案 3 :(得分:3)
如果您想要的变量不是要设置的变量,而是默认值,则可以使用
// enable ag-Grid Enterprise features
import { LicenseManager } from "ag-grid-enterprise/main";
LicenseManager.setLicenseKey("YOUR_LICENSE_KEY");
然后grep。请注意,这似乎需要一两秒钟,这似乎有点慢。 例如,如果您首先尝试执行此操作以配置cmake var,则可以避免将购物车拉到马匹前面。 :)
您还可以向其传递文件名。因此,您可以尝试仅生成不存在的文件,如果存在则进行解析(以节省1-2秒)。
答案 4 :(得分:-3)
首次在空构建树中运行cmake时,它会创建一个CMakeCache.txt文件,并使用项目的可自定义设置填充该文件。此选项可用于指定优先于项目默认值的设置。可以根据需要为多个缓存条目重复该选项。