首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cmake -获取使用的命令行标志"-D“

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

Stack Overflow用户
提问于 2015-06-16 14:47:26
回答 3查看 4.4K关注 0票数 13

最近,我把一些项目从自动工具转向了cmake。

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

(就像编译了一些东西之后--我想要添加另一个--enable-this --所以从config.log/./configure --old-params --enable-this复制和粘贴,然后重新运行./configure --old-params --enable-this) )

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

我知道有CMakeCache..。-但提取使用过的旗帜很难

编辑:

我想出了以下解决方案:

代码语言:javascript
复制
#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} )

在生成文件夹中创建一个包含所有设置的cmake的文件config.status。

专业:

  • 似乎解决了我的问题
  • 似乎适用于后续的cmake调用。

con:

  • 无法在FILE(write上设置chmod?变量
  • MY_CMAKE_FLAGS包含已知的标志-如果添加了新标志,则需要手动更新。

问候

EN

回答 3

Stack Overflow用户

发布于 2015-06-17 07:00:09

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

考虑一下这个片段:

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
>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调用:

代码语言:javascript
复制
>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甚至没有明确说明(摘自缓存)。

票数 2
EN

Stack Overflow用户

发布于 2015-06-16 16:37:15

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-18 11:06:14

您可能想看看CMake源代码中的引导脚本所做的工作:

代码语言:javascript
复制
# 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脚本除了接受set(... CACHE)命令外,还会接受message()命令。

另见如何存储CMake生成设置

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30870975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档