c语⾔编译时间,使⽤cmake编译⽇期和时间
为什么现在都用cmake我第⼀次运⾏CMake的跨平台解决⽅案在⼆进制⽬录中创建ake⽂件,并定义运⾏⽣成⽂件的⽬标⽂件timestamp。⽂件ake使⽤STRING CMake命令形成⼀个ISO 8601时间戳字符串,并将其写⼊⽂件timestamp.h,其中#define _TIMEZ_预处理程序指令(⽤⼀个前导下划线定义;没有定义,两个前导下划线定义不应由⽤户定义)。
在您的主CMake⽂件中包含以下内容。
# build time in UTC ISO 8601
FILE (WRITE ${CMAKE_BINARY_DIR}/ake "STRING(TIMESTAMP TIMEZ UTC)\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/ake "FILE(WRITE timestamp.h \"#ifndef TIMESTAMP_H\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/ake "FILE(APPEND timestamp.h \"#define TIMESTAMP_H\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/ake "FILE(APPEND timestamp.h \"#define _TIMEZ_
\\\"\${TIMEZ}\\\"\\n\\n\")\n")
FILE (APPEND ${CMAKE_BINARY_DIR}/ake "FILE(APPEND timestamp.h \"#endif // TIMESTAMP_H\\n\")\n")
ADD_CUSTOM_TARGET (
timestamp
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/ake
ADD_DEPENDENCIES ${CMAKE_BINARY_DIR}/ake)
然后使⽤ADD_DEPENDENCIES CMake的命令,让您的主要⽬标(可能是主要的可执⾏⽂件)依赖于timestamp⽬标。 CMake始终认为它已经过时,所以每次主要⽬标重建时都会刷新它,根据要求刷新构建时间。
ADD_DEPENDENCIES (${CMAKE_BINARY_DIR}/${BINARY_NAME} timestamp)
如果需要,可以使⽤此命令指定由空格分隔的多个附加依赖项。
然后,你可以#include "timestamp.h"(假设CMake的⼆进制dir是在包括路径,这通常是如果没有,那很简单:INCLUDE_DIRECTORIES (${CMAKE_BINARY_DIR})),并使⽤_TIMEZ_每当你想有编译时间戳ISO 8601格式(或者,实际上,⽆论你喜欢:你可以⾃⼰指定,see CMake documentation for STRING command usage)。
这可以通过直接(⼿⼯)创建⽂件ake并将其添加到您的代码库中来简化,但我认为它不够⼲净。这是CMake的⼀个普遍缺点,你不能访问CMake后端的时间戳字符串形成过程(在STRING CMake命令中使⽤的那个过程),不管它是什么(例如,GNU make),所以必须使⽤单独的CMake⽂件并在该阶段调⽤它。如果您可以在“CMake命令模式”(cmake -E类型的调⽤)中调⽤CMake时间戳字符串形成过程,可以做得更简单更⼲净,例如,如下所⽰:cmake -E date [format] [UTC],但可惜。我有filed a ticket in the CMake's Mantis bug tracker。
您可以通过⽀持我的功能请求发布⼀些评论来显⽰您对此有多⼤的需求,从⽽帮助您实现这⼀⽬标。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论