如何捕获CMake命令行参数?

Viv*_*odo 12 cmake

我想在生成的脚本中记录传递给cmake的参数.例如,"my-config.in"将由cmake处理,它的定义如下:

配置= "@ CMAKE_ARGS @"

之后cmake,my-config将包含这样的行:

config =" - DLINUX -DUSE_FOO = y -DCMAKE_INSTALL_PREFIX =/usr"

我试过CMAKE_ARGS,CMAKE_OPTIONS但失败了.没有文件提到这一点.:-(

Fra*_*ser 17

我不知道提供此信息的任何变量,但您可以自己生成(有一些附带条件).

-D传递给CMake的任何参数都会添加到CMakeCache.txt构建目录中的缓存文件中,并在后续调用期间重新应用,而无需再次在命令行中指定.

所以在你的例子中,如果你首先执行CMake as

cmake ../.. -DCMAKE_INSTALL_PREFIX:PATH=/usr
Run Code Online (Sandbox Code Playgroud)

然后你会发现随后简单地运行

cmake .
Run Code Online (Sandbox Code Playgroud)

仍将CMAKE_INSTALL_PREFIX设置为/usr


如果您要查找的CMAKE_ARGS是从CMake的每次调用在命令行上定义的完整变量列表,那么以下应该可以解决这个问题:

get_cmake_property(CACHE_VARS CACHE_VARIABLES)
foreach(CACHE_VAR ${CACHE_VARS})
  get_property(CACHE_VAR_HELPSTRING CACHE ${CACHE_VAR} PROPERTY HELPSTRING)
  if(CACHE_VAR_HELPSTRING STREQUAL "No help, variable specified on the command line.")
    get_property(CACHE_VAR_TYPE CACHE ${CACHE_VAR} PROPERTY TYPE)
    if(CACHE_VAR_TYPE STREQUAL "UNINITIALIZED")
      set(CACHE_VAR_TYPE)
    else()
      set(CACHE_VAR_TYPE :${CACHE_VAR_TYPE})
    endif()
    set(CMAKE_ARGS "${CMAKE_ARGS} -D${CACHE_VAR}${CACHE_VAR_TYPE}=\"${${CACHE_VAR}}\"")
  endif()
endforeach()
message("CMAKE_ARGS: ${CMAKE_ARGS}")
Run Code Online (Sandbox Code Playgroud)

这有点脆弱,因为它取决于通过命令行设置的每个变量都有短语"没有帮助,在命令行上指定变量".指定为其HELPSTRING属性.如果CMake更改了此默认值HELPSTRING,则必须相应地更新if语句.


如果这不是您想要CMAKE_ARGS显示的内容,而只是当前执行中的参数,那么我认为没有办法可以做到这一点,无法破解CMake的源代码!但是,我希望这不是你想要的,因为所有以前的命令行参数每次都被有效地重新应用.