2015-06-16 29 views
7

我最近将一些项目从autotools切换到cmake。cmake - 获取使用的命令行标志“-D”

我在autotools上喜欢的一件常见事情是 - 如果我进入src构建目录。有config.log/config.status - 在顶部列出了./configure --params命令 - 因此很容易重新运行以前使用的命令行标志。

(如编译一些东西后 - 我想补充一个又一个--enable-this - 所以从的config.log /状态复制粘贴& - 并重新运行./configure --old-params --enable-this

在cmake的 - 我有一堆-D标志 - 我怎么能找到像config.log /状态中使用的命令行 - 用cmake项目?

我知道还有就是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}) 

创建build文件夹中的文件config.status - 包含所有设置的cmake参数。

亲:

  • 似乎解决我的问题
  • 似乎对后续的cmake工作电话

CON:

  • 无法设置文件模式上FILE(write?变量
  • MY_CMAKE_FLAGS包含已知的标志 - 需要手动 更新,如果一个新的标志被添加

问候

+1

这是一个很好的问题 - 一个我有一对夫妇的年,但并没有要求在计算器上。我不认为有一种方法可以在调用cmake时使用-D标志集。下面给出的答案显示了如何查看cmake调用结果的确切命令,但是这并不能给出用于cmake configure调用的参数。一个正确的答案比人们想象的要困难得多,因为用户可以使用'cmake -Danotherflag = value .'不断重新配置cmake构建目录。 – Phil

+0

多数民众赞成在悲伤!事实上,我真的很喜欢cmake,它解决了像autotools一样的3.5mio问题(我学会了解决这个问题) - 但是缺少获取用户提供的命令行标志,实在是太糟糕了。 –

+0

看到我编辑的问题 - 它替代我解决我的问题(反正不完美的方式) –

回答

1

一个功能,可能会有所帮助在项目的CMake的开启标志CMAKE_EXPORT_COMPILE_COMMANDS缓存。在编译期间,这将使CMake在二进制目录中生成一个JSON文件compile_commands.json,该目录包含所有翻译单元的确切编译器调用。

+2

thx为您的答案,并很高兴知道'CMAKE_EXPORT_COMPILE_COMMANDS',但它不能解决我的问题。 –

0

Cmake不给你简单的方法列出所有使用的-D标志(定义)。但是,对于正确编写的CMakeLists,不需要知道具有全部-D标志的完整命令行来更改一个特定的定义/选项。

考虑这个snipplet:

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的调用:

>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_var_1=FALSE即使它没有明确地说明(从缓存中获取)

+0

thx为您的答案 我知道功能,基于cmakecache ,但对于我的问题,它更像 - 我有一个生成文件夹在服务器A - 并希望从头开始在不同的服务器上编译源代码(在autotools天 - 我刚刚将源代码下载到新服务器 - 从配置状态复制配置命令,并在新的服务器上运行这个) 看到我编辑的问题 - 这实际上是一种方式,我可以住 –

+1

鉴于您最近的编辑假设你可以跟踪“MY_CMAKE_FLAGS”,你应该考虑cmake模块[FeatureSummary](http://www.cmake.org/cmake/help/v3.3/module/FeatureSummary.html)。 – Phil

0

你可能想看看是什么在bootstrap脚本的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} "[email protected]" 

boostrap脚本生成InitialCacheFlags.cmake文件,然后用cmake -C选项预加载它。

而且 - 如果您还想将值输出到stdout - 此初始缓存CMake脚本除set(... CACHE)命令外还接受message()命令。

参见How to store CMake build settings