如何从命令行获取CMake变量?

All*_*lan 27 command-line cmake

像这样的东西:

cmake --get-variable=MY_CMAKE_VARIABLE
Run Code Online (Sandbox Code Playgroud)

该变量可能存在于包含的CMake文件中.

tpg*_*114 16

如果您有现有的缓存文件,则可以执行以下操作:

grep MY_CMAKE_VARIABLE CMakeCache.txt
Run Code Online (Sandbox Code Playgroud)

如果您还没有缓存文件,并且想要查看CMakeLists.txt文件中有哪些选项,则可以执行(在不同的目录中,因为这将写入缓存文件):

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE
Run Code Online (Sandbox Code Playgroud)

哪会回到你身边

<VARIABLE>:<TYPE>=<VALUE>
Run Code Online (Sandbox Code Playgroud)

如果它是高级变量,请将-A标志添加到同一命令,它将包含高级变量.当然,如果你只想要价值,你可以这样做:

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2
Run Code Online (Sandbox Code Playgroud)

编辑

例如,使用CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(test)

include(otherFile.txt)

set(MY_VAR "Testing" CACHE STRING "")
Run Code Online (Sandbox Code Playgroud)

而otherFile.txt是:

set(MY_OTHER_VAR "Hi" CACHE STRING "")
Run Code Online (Sandbox Code Playgroud)

该命令(从另一个目录运行):

cmake -L ../cmaketest
Run Code Online (Sandbox Code Playgroud)

得到:

-- 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
Run Code Online (Sandbox Code Playgroud)

因此,它确实显示了其他文件中的变量.它应该解析整个构建.但问题是它不会显示任何未标记为CACHE的变量.并且它不会显示任何缓存的INTERNAL,并且只会显示ADVANCED,如果使用-LA而不是-L.

如果你的变量被标记为INTERNAL或者根本没有CACHE,那么CMake中没有任何方法可以将其拉出来.但是,非CACHE变量意味着是瞬态的,所以我不确定为什么在构建环境之外你还需要它们.


Pau*_*nan 6

使用:

cmake -LA -N /path/to/project
Run Code Online (Sandbox Code Playgroud)

获取所有缓存值的列表.-N很重要; 它可以防止cmake尝试生成任何构建文件,并只显示缓存中的内容.


dyo*_*mas 5

如果您需要获取非缓存的用户变量但无法编辑原始 cmake 脚本,您可以使用一个技巧。在另一个目录中创建新的 CMakeLists.txt 文件,内容如下:

include(<Path to original CMakeLists.txt>)

message(STATUS "MY_VAR={${MY_VAR}}")
Run Code Online (Sandbox Code Playgroud)

很有可能,cmake 在新目录中运行时会出现很多错误。如果在原始脚本中使用相对路径,则肯定是导致此类错误的原因。但 cmake 将打印为变量分配的最后一个值。此外,使用任何众所周知的文本处理器(假设熟悉 UNIX)过滤所有错误和警告,例如:

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

我在项目维护脚本中使用这种方法,只要原始 CMakeLists.txt 没有语法错误,它就是可靠的。


joh*_*003 5

如果您想要的变量不是您要设置的变量,而是来自默认值的变量,则可以使用

cmake --system-information
Run Code Online (Sandbox Code Playgroud)

并grep。请注意,它似乎需要一两秒钟,这似乎有点慢。例如,如果您首先尝试这样做来配置您的 cmake 变量,则可以避免将手推车放在马面前。:)

您也可以传递一个文件名。所以你可以尝试只在它不存在时生成它,如果它存在则解析文件(以节省 1-2 秒)。