如何在CMAKE / CPACK项目中以惯用方式设置版本号?

时间:2016-11-06 03:41:06

标签: cmake

我正在尝试编辑CPack设置,以便输出的包文件中包含正确的版本号。但那还不是全部。我希望CMake / CPack能够设置更新版本号的所有地方。还应设置.so文件。而其他任何需要它。

从我坐的地方,CPack documentation appears to be telling us重复一遍。

如果我什么都不做,输出文件是这样的:

mystuff-0.1.1-Linux.tar.gz

假设版本号应为1.2.3。

我认为这是简化的CPACK设置,可以更改所有版本号 - 我将这些行放在我的CMakeLists.txt文件中:

SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "My app is great")
SET(CPACK_PACKAGE_VENDOR "My Name")
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")

SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "3")
SET(CPACK_PACKAGE_VERSION_PATCH "2")

构建时,输出文件仍为mystuff-0.1.1-Linux.tar.gz

如果我重复自己并且这样做:

SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")

现在已设置变量,但文件仍为mystuff-0.1.1-Linux.tar.gz

似乎我还必须更改CPACK_PACKAGE_FILE_NAME

我还有哪些地方可以重新说明版本号?

这不是惯用的。我必须遗漏一些让自动化的东西。我是否应该在较早的时间点指定变量?我还在互联网上看到一些包含CPackConfig.cmake文件的项目 - 该文件包含覆盖,但我仍然看到一些重复自己正在进行的项目。

This bug也提到同样的事情。显然,他们确实希望我们重复自己。 (截至2015年)然而,即使是这样,我想知道是否有人找到了解决办法吗?

如果没有解决方法,如何重新声明所有变量,以便最终自动设置正确?例如,执行以下操作是使用变量

组成版本号的方法
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")

According to the documentation,文件名的组成如下:

SET(CPACK_PACKAGE_FILE_NAME“$ {CPACK_PACKAGE_NAME} - $ {CPACK_PACKAGE_VERSION} - $ {CPACK_SYSTEM_NAME}”)

可能还有其他变量需要重新设置。如果我必须重述所有内容,那么我需要重申什么才能完成?

3 个答案:

答案 0 :(得分:2)

确保在设置CPACK _...变量之后有以下行:

include (CPack)

这是CPACK_PACKAGE_FILE_NAME和其他人自动设置的位置,因此此时必须已设置版本变量(例如CPACK_PACKAGE_VERSION_MAJOR)。

答案 1 :(得分:1)

您可能希望查看PROJECT()命令的文档,该命令具有VERSION字段。我不确定它是否连接到CPack,但至少这是设置项目版本的惯用位置。

https://cmake.org/cmake/help/v3.0/command/project.html

答案 2 :(得分:0)

如果您通过https://cmake.org/cmake/help/v3.0/command/project.html设置项目的版本,则可以设置cpack版本,如

set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
include(CPack)