cmake-获取已使用的命令行标志“-D";

cmake-获取已使用的命令行标志“-D";,cmake,Cmake,我最近把几个项目从autotools转到了cmake 我喜欢autotools的一个常见功能是——如果我进入src build目录。这里有config.log/config.status,在顶部列出了/configure--params命令,因此很容易重新运行以前使用的命令行标志 (就像在编译了一些东西之后——我想添加另一个——启用这个——所以从config.log/status复制并粘贴——然后重新运行/configure--old参数——启用这个) 在cmake中-我有一堆-D标志-如何在c

我最近把几个项目从autotools转到了cmake

我喜欢autotools的一个常见功能是——如果我进入src build目录。这里有config.log/config.status,在顶部列出了
/configure--params
命令,因此很容易重新运行以前使用的命令行标志

(就像在编译了一些东西之后——我想添加另一个
——启用这个
——所以从config.log/status复制并粘贴——然后重新运行
/configure--old参数——启用这个

在cmake中-我有一堆
-D
标志-如何在cmake项目中找到config.log/status中使用的命令行

我知道有一个CMakeCache…-但是很难提取使用过的旗帜

编辑:

我提出了以下解决方案:

#save commandline to rebuild this :)
set(USED_CMD_LINE "cmake ")
set(MY_CMAKE_FLAGS CMAKE_BUILD_TYPE CMAKE_INSTALL_PREFIX ENABLE_SSL ENABLE_LUA ENABLE_SSH ENABLE_SNMP MYSQL_USER MYSQL_PASS MYSQL_HOST MYSQL_DB FULL_FEATURES USE_COVERAGE)
FOREACH(cmd_line_loop IN ITEMS ${MY_CMAKE_FLAGS})
    if(${cmd_line_loop})
        STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} "-D"  ${cmd_line_loop} "=" ${${cmd_line_loop}} " ")
    endif()
ENDFOREACH(cmd_line_loop)
STRING(CONCAT USED_CMD_LINE ${USED_CMD_LINE} " .. ")
#store to a file aka "config.status"
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/config.status ${USED_CMD_LINE} )
在生成文件夹中创建一个文件config.status,其中包含所有设置的cmake参数

赞成者:

  • 似乎解决了我的问题
  • 似乎对后续的cmake呼叫有效
反对:

  • 无法在
    文件上设置chmod(写入变量
  • MY_CMAKE_标志
    包含已知标志-需要手动 如果添加了新标志,则更新

关于

一个可能有用的功能是在项目的CMAKE缓存中打开标志
CMAKE_EXPORT_COMPILE_COMMANDS
。在构建过程中,这将使CMAKE在二进制目录中生成一个JSON文件
COMPILE_COMMANDS.JSON
,其中包含所有翻译单元的确切编译器调用。

CMAKE不会您可以用一种简单的方法列出所有使用过的-D标志(defines)。但是,对于正确编写的CMakeLists,不需要知道包含所有-D标志的完整命令行就可以更改一个特定的define/选项

考虑一下这个小笑话:

SET(my_var_1 TRUE CACHE BOOL "my var 1")
SET(my_var_2 TRUE CACHE BOOL "my var 2")

message(STATUS "my_var_1 ${my_var_1}")
message(STATUS "my_var_2 ${my_var_2}")
第一次cmake调用:

>cmake .. -Dmy_var_1=FALSE
-- my_var_1 FALSE
-- my_var_2 TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: out
>cmake  .. -Dmy_var_2=FALSE
-- my_var_1 FALSE
-- my_var_2 FALSE
-- Configuring done
-- Generating done
-- Build files have been written to: out
第二次cmake调用:

>cmake .. -Dmy_var_1=FALSE
-- my_var_1 FALSE
-- my_var_2 TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: out
>cmake  .. -Dmy_var_2=FALSE
-- my_var_1 FALSE
-- my_var_2 FALSE
-- Configuring done
-- Generating done
-- Build files have been written to: out

请注意,
my\u var\u 1=FALSE
即使它没有明确说明(从缓存中获取)

您可能想看看在CMake的源代码中脚本做了什么:

# Write our default settings to Bootstrap${_cmk}/InitialCacheFlags.cmake.
echo '
# Generated by '"${cmake_source_dir}"'/bootstrap
# Default cmake settings.  These may be overridden any settings below.
set (CMAKE_INSTALL_PREFIX "'"${cmake_prefix_dir}"'" CACHE PATH "Install path prefix, prepended onto install directories." FORCE)
set (CMAKE_DOC_DIR "'"${cmake_doc_dir}"'" CACHE PATH "Install location for documentation (relative to prefix)." FORCE)
set (CMAKE_MAN_DIR "'"${cmake_man_dir}"'" CACHE PATH "Install location for man pages (relative to prefix)." FORCE)
set (CMAKE_DATA_DIR "'"${cmake_data_dir}"'" CACHE PATH "Install location for data (relative to prefix)." FORCE)
' > "${cmake_bootstrap_dir}/InitialCacheFlags.cmake"

[...]

"${cmake_bootstrap_dir}/cmake" "${cmake_source_dir}" "-C${cmake_bootstrap_dir}/InitialCacheFlags.cmake" "-G${cmake_bootstrap_generator}" ${cmake_options} ${cmake_bootstrap_system_libs} "$@"
boostrap
脚本正在生成一个
InitialCacheFlags.cmake
文件,然后使用该选项对其进行预加载

并且-如果您还想将值输出到
stdout
-除了
set(…cache)
命令之外,此初始缓存CMake脚本还接受
message()
命令


另请参见

这是一个很好的问题——我已经问了几年了,但没有问过StackOverflow。我认为在调用cmake时没有办法获得-D标志集。sakra在下面给出的答案显示了如何获得cmake调用结果的确切命令,但这并没有告诉您用于cmake配置调用的参数。正确的答案可能比预期的更难,因为用户可能会使用
cmake-Danotherflag=value不断地重新配置cmake构建目录。
。这很悲哀!事实上,我真的很喜欢cmake,它解决了3.5mio问题(我学会了如何生活)来自autotools-但缺少用户提供的命令行标志,这真的很糟糕。请参阅我编辑的问题-这对我来说解决了我的问题(无论如何都不是完美的方式)生成的CMakeCache.txt如何?它包含使用过的标志…thx用于您的答案,很高兴了解
CMAKE_EXPORT\u COMPILE_命令
,但它并不能解决我的问题。thx对于您的答案,我知道基于CMakeCache的功能,但对于我的问题,它更像是-我在服务器a上有一个构建文件夹-并且想要编译源代码从头安装到另一台服务器上(在autotools的日子里-我刚刚将源代码下载到新服务器-从配置状态复制了configure命令,并在新服务器上运行此命令)请看我编辑的问题——这实际上是一种方法,在你最近的编辑中,你可以说你可以跟上<代码> MyOxCasMax FLAG/<代码>,你应该考虑CMAP模块。也许CMakeCache.txt可以被复制到新的项目构建DIR,再运行CGube会考虑到缓存文件。