Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to idiomatically set the version number in a CMAKE/CPACK project?

Tags:

cmake

I'm trying to edit the CPack settings so that the outputted package file has the correct version number in it. But that's not all. I'd like CMake/CPack to have all the places where the version number is updated also be set. The .so file should also be set. And whatever else needs it.

From where I sit, the CPack documentation appears to be telling us to repeat ourselves.

If I do nothing, the output file is like so:

mystuff-0.1.1-Linux.tar.gz

Let's say the version number should be 1.2.3.

I would think that this is the minimalistic CPACK settings to cause all the version numbers to be changed -- and I placed these lines in my CMakeLists.txt file:

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")

When I build, the output file is still mystuff-0.1.1-Linux.tar.gz

If I repeat myself and do this:

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

Now that variable is set, but the file is still mystuff-0.1.1-Linux.tar.gz

It seems that I must also change CPACK_PACKAGE_FILE_NAME

What other places do I have to re-state the version number?

This doesn't feel idiomatic. I must be missing something to make this automatic. Am I supposed to specify the variable at an earlier point in time? I also see some projects on the internet containing a CPackConfig.cmake file -- the file contains overrides, but I still see some repeating oneself going on in those as well.

This bug also mentions the same thing. Apparently, they do want us to repeat ourselves. (as of 2015) However, even if that is the case, I was wondering if anyone has found a work-around?

If no work around, how about a way to re-state all the variables so that they end up automatically set correctly? For instance, doing the following is a way to compose the version number by using the variables

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

According to the documentation, the file name is composed like this:

SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}")

There are probably other variables that need re-setting. If I have to restate everything, then exactly what do I need to restate to be complete?

like image 518
101010 Avatar asked Nov 06 '16 03:11

101010


3 Answers

Make sure that you have the following line after setting the CPACK_... variables:

include (CPack)

This is the spot where CPACK_PACKAGE_FILE_NAME and others are automatically set, so the version variables (such as CPACK_PACKAGE_VERSION_MAJOR) must be already set at this point.

like image 109
pepan Avatar answered Nov 03 '22 23:11

pepan


If you set your project's version via https://cmake.org/cmake/help/v3.0/command/project.html, you can set the cpack version like

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)
like image 44
bk138 Avatar answered Nov 03 '22 21:11

bk138


You'll probably want to look at the documentation for the PROJECT() command, which has a VERSION field. I'm not sure if it is wired through to CPack, but at least that is the idiomatic place for setting the project version.

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

like image 29
Mark Lakata Avatar answered Nov 03 '22 22:11

Mark Lakata