我想使用cmake在发布版本的情况下将VERSION设置为发布版本,否则使用编译时.
使用make进行开发构建时,很容易获得编译时间
-DVERSION=`date +%Y-%m-%d_%H:%M`
Run Code Online (Sandbox Code Playgroud)
这可以通过c/c ++源代码直接使用.不幸的是,我还没有发现使用cmake时是如何实现的.
string(TIMESTAMP VERSION "%Y-%m-%d %H:%M")
add_definitions(-DVERSION="${VERSION}")
Run Code Online (Sandbox Code Playgroud)
将VERSION设置为执行cmake的时间.我怎样才能使用cmake时集版本的编译时间(以避免乱动__DATE__,并__TIME__在没有开放标志的)?
小智 23
对于相对较新版本的CMake(> = 2.8.11):
string(TIMESTAMP {output variable} [{format string}] [UTC])
Run Code Online (Sandbox Code Playgroud)
(见http://www.cmake.org/cmake/help/v3.0/command/string.html).例如:
string(TIMESTAMP TODAY "%Y%m%d")
Run Code Online (Sandbox Code Playgroud)
我在第一次运行CMake时的跨平台解决方案在timestamp.cmake二进制目录中创建了一个文件,并定义了一个timestamp运行生成文件的目标.文件timestamp.cmake形成使用的ISO 8601时间标记串STRINGCMake的命令,并将其写入到文件中timestamp.h与#define _TIMEZ_前缀预处理指令(具有一个前导下划线都还可以定义;具有两个前导下划线定义不应是用户定义的).
在主CMake文件中包含以下内容.
# build time in UTC ISO 8601
FILE (WRITE ${CMAKE_BINARY_DIR}/timestamp.cmake "STRING(TIMESTAMP TIMEZ UTC)\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(WRITE timestamp.h \"#ifndef TIMESTAMP_H\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#define TIMESTAMP_H\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#define _TIMEZ_ \\\"\${TIMEZ}\\\"\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/timestamp.cmake "FILE(APPEND timestamp.h \"#endif // TIMESTAMP_H\\n\")\n")
ADD_CUSTOM_TARGET (
timestamp
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/timestamp.cmake
ADD_DEPENDENCIES ${CMAKE_BINARY_DIR}/timestamp.cmake)
Run Code Online (Sandbox Code Playgroud)
然后使用ADD_DEPENDENCIESCMake命令使主目标(可能是主可执行文件)依赖于timestamp目标.它始终被CMake视为过时,因此每次主目标重建时都会刷新它,并根据请求刷新构建时间.
ADD_DEPENDENCIES (${CMAKE_BINARY_DIR}/${BINARY_NAME} timestamp)
Run Code Online (Sandbox Code Playgroud)
如果需要,可以使用此命令指定由空格分隔的多个其他依赖项.
然后你就可以了#include "timestamp.h"(假设CMake二进制目录在include路径中,通常是.如果没有,那很简单:) INCLUDE_DIRECTORIES (${CMAKE_BINARY_DIR}),并且_TIMEZ_只要你想拥有ISO 8601格式的构建时间戳(或者,事实上,无论你喜欢什么:你可以自己指定,有关STRING命令用法,请参阅CMake文档.
这可以通过直接(手动)创建文件timestamp.cmake并将其添加到您的代码存储库来简化,但我认为它不够干净.CMake的一般缺点是你不能STRING在CMake后端的阶段访问时间戳字符串形成过程(CMake命令中使用的那个),无论它是什么(例如,GNU make)运行所以必须使用单独的CMake文件并在该阶段调用它.如果你可以在"CMake命令模式"(cmake -E调用类型)中调用CMake时间戳字符串形成过程,这可以做得更简单和更清洁,例如,像这样:cmake -E date [format] [UTC],但是唉.我已经在CMake的Mantis bug追踪器中提交了一张票.
您可以通过支持我的功能请求发布一些评论来显示您需要多少这样的信息来帮助实现这一目标.
__DATE__ __TIME__也许您可以在代码中使用编译器宏,而不是从 cmake 获取它。值得一提的是,您将需要执行 clean/make 来更新这些值(因为 GCC 嵌入了它,如果对象已经编译,它将不会再次编译,因此没有日期/时间更改)