我最近将一些项目从autotools切换到了cmake。
我喜欢在autotools上的一个常见的事情是 - 如果我进入src构建目录。有config.log / config.status - 在顶部列出了./configure --params
命令 - 因此很容易重新运行以前使用过的命令行标志。
(比如在编译一些东西之后 - 我想添加另一个--enable-this
- 所以从config.log / status复制和粘贴 - 然后重新运行./configure --old-params --enable-this
)
在cmake中 - 我有一堆-D
标志 - 如何在config.log / status中找到使用过的命令行 - 使用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} )
在构建文件夹中创建一个文件config.status - 包含所有set cmake params。
亲:
CON:
FILE(write
上设置chmod?变量MY_CMAKE_FLAGS
包含已知标志 - 需要手动完成
如果添加了新标志,则更新问候
答案 0 :(得分:2)
Cmake没有为您提供列出所有已使用的-D标志(定义)的简便方法。但是,对于正确编写的CMakeLists,不需要知道带有所有-D标志的完整命令行来更改一个特定的定义/选项。
考虑一下这个小报:
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
即使没有明确说明(取自缓存)
答案 1 :(得分:1)
可能有用的一个功能是打开项目的CMake缓存中的标志CMAKE_EXPORT_COMPILE_COMMANDS
。在构建期间,这将使CMake在二进制目录中生成一个JSON文件compile_commands.json
,该文件包含所有翻译单元的确切编译器调用。
答案 2 :(得分:1)
您可能需要查看CMake源代码中bootstrap脚本中的内容:
# 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
文件,然后使用cmake -C选项对其进行预加载。
并且 - 如果您还想将值输出到stdout
- 此初始缓存CMake脚本还接受除message()
命令之外的set(... CACHE)
命令。