在 github 上使用 cmake 进行共享库版本控制

Shared library versioning with cmake on github

我在 github 上有一个相当新的项目,它生成一个共享库。展望未来,我想对文件名中的共享库 major/minor/patch 编号使用语义版本控制(如 semver.org 中所述)。该项目使用CMake。 CMakeLists.txt 文件引用 CPACK_PACKAGE_VERSION_MAJOR、CPACK_PACKAGE_VERSION_MINOR 和 CPACK_PACKAGE_VERSION_PATCH,如果它们未在命令行中传递,则将它们设置为默认值。

我的计划是根据语义版本控制原则对 ABI 更改和 API 添加进行分支。

我知道 github 支持基于 git 标签创建和命名包含项目源的发布包。但是当 github 用户在他们的机器上构建一个版本时,我没有看到将主要、次要和补丁号传播到共享库名称的方法。

例如,如果我有一个名为 myproj_1_2 的分支和一个名为 myproj_rel_1_2_9 的发布标签,是否可以让用户构建的共享库名称为 [=24] =].1.2.9?

这只是记录用户应该在 cmake 命令行上传递构建名称信息的问题,让 CMakeLists.txt 文件解析它并设置 CPACK_PACKAGE_VERSION_MAJOR、CPACK_PACKAGE_VERSION_MINOR 和 CPACK_PACKAGE_VERSION_PATCH 相应地,还是有更优雅的方法来做到这一点?

您关于 CPACK_PACKAGE_VERSION_XXX 设置方式的陈述是不正确的。如果 project 命令指定版本控制,则有问题的 CPack 变量由 project 命令设置。因此,当您创建 1.2.9 分支时,您将在项目命令中将 1.2.9 设置为版本号。

来自 CPack Help

CPACK_PACKAGE_VERSION_MAJOR

Package major version. This variable will always be set, but its default value depends on whether or not version details were given to the project() command in the top level CMakeLists.txt file. If version details were given, the default value will be CMAKE_PROJECT_VERSION_MAJOR. If no version details were given, a default version of 0.1.1 will be assumed, leading to CPACK_PACKAGE_VERSION_MAJOR having a default value of 0.

Project command

> project(<PROJECT-NAME>
>         [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
>         [DESCRIPTION <project-description-string>]
>         [HOMEPAGE_URL <url-string>]
>         [LANGUAGES <language-name>...])

如果您不想通过项目命令设置 VERSION,那么还有多种其他方法可以设置相关变量。

示例位于: https://cmake.org/cmake-tutorial/

另请参阅 CMake 如何处理版本:

https://gitlab.kitware.com/cmake/cmake/blob/master/Source/CMakeVersionSource.cmake

https://gitlab.kitware.com/cmake/cmake/blob/master/Source/cmVersionConfig.h.in

如何获取git设置版本相关信息的元数据的另一个例子: https://github.com/pmirshad/cmake-with-git-metadata/blob/master/CMakeLists.txt