【发布时间】:2014-06-18 18:44:09
【问题描述】:
如果是发布版本,我想使用 cmake 将 VERSION 设置为发布版本,否则设置为编译时间。
使用 make 进行开发构建时,通过以下方式轻松获取编译时间
-DVERSION=`date +%Y-%m-%d_%H:%M`
可以直接被 c/c++ 源代码使用。不幸的是,我还没有发现使用 cmake 时如何实现相同的效果。
string(TIMESTAMP VERSION "%Y-%m-%d %H:%M")
add_definitions(-DVERSION="${VERSION}")
将 VERSION 设置为执行 cmake 的时间。如何在使用 cmake 时将 VERSION 设置为编译时间(以避免在没有 RELEASE 标志的情况下不得不摆弄__DATE__ 和__TIME__)?
【问题讨论】:
-
Here's a useful answer 解决您的问题。您需要确保您的主机构建环境中有一些可用的命令,例如
date。使用__DATE__和__TIME__宏的通用解决方案也很容易,只需提供一个包含必要定义的头文件,该文件在每次构建时生成(或至少触及)(作为预构建操作)跨度> -
一般来说,版本号的目的是能够重现构建二进制文件的确切源文件。因此,使用编译的时间戳是一个非常、非常糟糕的选择。分配并维护正确的版本号,或者如果您不想这样做,请使用您的版本控制软件中的某些内容(SVN 的分支/修订,GIT 的哈希码)。只是不要使用编译时间戳,这比根本没有版本更糟糕,因为你可以对旧源进行更新编译,这会让包括你自己在内的每个人都感到困惑。
-
@DevSolar 我认为您在这里混合了不同的想法。修订的目的,而不是版本,是为了能够重现确切的源文件。构建 ID 的目的是能够在我们的构建/开发机器上找到准确的构建工件。 app/lib 版本的目的其实很广泛,从营销目的开始,到后向兼容性问题结束。 app/lib 版本可能包含也可能不包含构建 ID 或修订版。如何跟踪特定版本以构建或修订取决于开发人员(操作人员)。至于时间戳,它可以很好地用作开发构建的构建 ID。
-
@AlexChe:时间戳构建 ID 的问题是时间戳不允许将二进制文件追溯到其源,除非您仅使用单个代码分支 - 即使那样您也会必须摆弄您正在使用的 VCS。 VCS 修订版更好,但仍然会失去其信息价值,例如必须(或想要)迁移您的 VCS。恕我直言,您应该有一个产品版本、组件版本,并且理想情况下使用一些特定于 VCS 的方式来标记进入组件构建的源,如果需要,您可以迁移到不同的 VCS。