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

43

类似这样:

cmake --get-variable=MY_CMAKE_VARIABLE

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


1
问题有点不清楚:您是希望在命令行上指定变量的值吗?还是希望从某个CMakeFile中提取现有变量,并让cmake将其打印到标准输出? - André
5个回答

26

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

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 的变量。如果使用 -LA 而不是 -L,则不会显示任何缓存 INTERNAL 的变量,并且只会显示 ADVANCED。

如果您的变量被标记为 INTERNAL 或根本没有 CACHE,则在 CMake 中没有提取它的方法。但是,非 CACHE 的变量意味着是瞬时的,因此我不确定您为什么需要它们超出构建环境之外。


这些建议似乎都不适用于从其他CMakeFiles中包含的变量。 - Allan
添加了一个包含其他cmake文件的工作示例。你想要实现什么?也许有另一种方法,或者有一种设置变量的方法,这样你就可以使用上述方法。 - tpg2114

15

使用:

cmake -LA -N /path/to/project

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


7

如果你想要的变量不是你设置的内容,而是默认值中的某个东西,那么可以使用

cmake --system-information

并grep它。请注意,这似乎需要一两秒钟的时间,这似乎有点慢。 例如,如果您首先尝试使用此方法配置cmake变量,则可以避免在马车前面放置购物车。:)

您还可以将其传递给文件名。因此,如果不存在,您可以尝试仅生成它,并在存在时解析文件(以节省1-2秒钟)。


我想获取项目的 PROJECT_VERSION,这是我从命令行获取它的唯一方法。更准确地说:cmake --system-information | awk -F= '$1~/CMAKE_PROJECT_VERSION:STATIC/{print$2}' - Guss
我想要获取项目的 PROJECT_VERSION,而这是我找到的唯一从命令行获取它的方法。更准确地说:cmake --system-information | awk -F= '$1~/CMAKE_PROJECT_VERSION:STATIC/{print$2}' - Guss

4

如果您需要获取未缓存的用户变量,但无法编辑原始的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没有语法错误,它就是可靠的。


-6

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

当在空的构建目录中首次运行cmake时,它会创建一个CMakeCache.txt文件,并填充可定制项目设置。此选项可用于指定优先于项目默认值的设置。该选项可以重复使用,以便为所需的缓存条目指定多个设置。


3
这不是原帖所问的。 - Oren S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接