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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

像这样的东西:

cmake --get-variable=MY_CMAKE_VARIABLE

该变量可能存在于一个包含的CMake文件中。

提问于
用户回答回答于

如果你有一个现有的缓存文件,你可以这样做:

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

其他文件.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'd,那么在CMake中没有办法将它拉出来。但是,非CACHE的变量是暂时的,所以我不确定为什么你会在构建环境之外需要它们。

用户回答回答于

如果你需要获得非缓存的用户变量,但不能编辑原始的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没有语法错误就可靠。

扫码关注云+社区