From 46c054c16bc1e84c485d0ed3359742828348656e Mon Sep 17 00:00:00 2001 From: Neui Date: Sat, 8 Jun 2024 16:11:08 +0200 Subject: [PATCH] CMake: Get version for CPack during generation time This allows for easier usage of CPack to generate local packages with proper version rather than the default dummy version 0.1.1, which could cause conflicts with the properly-versioned distro-provided package getting prioritised due to the higher version number than the cpack-generated one. Additionally, the version determining code has been moved to a new file so it can be reused by different CMake components. --- CMake/CPackProjectConfig.cmake.in | 24 ++++++++++++++ CMake/GetScmRev.cmake | 54 +++++++++++++++++++++++++++++++ CMake/ScmRevGen.cmake | 53 +----------------------------- CMakeLists.txt | 5 +++ 4 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 CMake/CPackProjectConfig.cmake.in create mode 100644 CMake/GetScmRev.cmake diff --git a/CMake/CPackProjectConfig.cmake.in b/CMake/CPackProjectConfig.cmake.in new file mode 100644 index 0000000000..b88d44b865 --- /dev/null +++ b/CMake/CPackProjectConfig.cmake.in @@ -0,0 +1,24 @@ +# This is included by CPack (CPACK_PROJECT_CONFIG_FILE) during package generation + +set(PROJECT_SOURCE_DIR "@PROJECT_SOURCE_DIR@") +set(DISTRIBUTOR "@DISTRIBUTOR@") +set(DOLPHIN_DEFAULT_UPDATE_TRACK "@DOLPHIN_DEFAULT_UPDATE_TRACK@") +set(GIT_FOUND "@GIT_FOUND@") +set(GIT_EXECUTABLE "@GIT_EXECUTABLE@") +set(DOLPHIN_WC_REVISION "@DOLPHIN_WC_REVISION@") +set(DOLPHIN_WC_DESCRIBE "@DOLPHIN_WC_DESCRIBE@") +set(DOLPHIN_WC_BRANCH "@DOLPHIN_WC_BRANCH@") +set(DOLPHIN_WC_COMMITS_AHEAD_MASTER "0") # Fallback +set(CMAKE_OSX_DEPLOYMENT_TARGET "@CMAKE_OSX_DEPLOYMENT_TARGET@") + +include("${PROJECT_SOURCE_DIR}/CMake/GetScmRev.cmake") + +set(CPACK_PACKAGE_VERSION_MAJOR "${DOLPHIN_VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${DOLPHIN_VERSION_MINOR}") +if(DOLPHIN_WC_BRANCH STREQUAL "stable") + set(CPACK_PACKAGE_VERSION_PATCH "${DOLPHIN_VERSION_PATCH}") +else() + set(CPACK_PACKAGE_VERSION_PATCH "${DOLPHIN_WC_COMMITS_AHEAD_MASTER}") +endif() +set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") diff --git a/CMake/GetScmRev.cmake b/CMake/GetScmRev.cmake new file mode 100644 index 0000000000..a7ffe7c330 --- /dev/null +++ b/CMake/GetScmRev.cmake @@ -0,0 +1,54 @@ +cmake_minimum_required(VERSION 3.13) + +# for revision info +if(GIT_FOUND) + # defines DOLPHIN_WC_REVISION + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE DOLPHIN_WC_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE) + # defines DOLPHIN_WC_DESCRIBE + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty + OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # remove hash (and trailing "-0" if needed) from description + string(REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}") + + # defines DOLPHIN_WC_BRANCH + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD + OUTPUT_VARIABLE DOLPHIN_WC_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE) + # defines DOLPHIN_WC_COMMITS_AHEAD_MASTER + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD ^master + OUTPUT_VARIABLE DOLPHIN_WC_COMMITS_AHEAD_MASTER + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # defines DOLPHIN_WC_TAG + execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --exact-match HEAD + OUTPUT_VARIABLE DOLPHIN_WC_TAG + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) +endif() + +string(TIMESTAMP DOLPHIN_WC_BUILD_DATE "%Y-%m-%d" UTC) + +# version number +set(DOLPHIN_VERSION_MAJOR "2506") +set(DOLPHIN_VERSION_MINOR "0") +set(DOLPHIN_VERSION_PATCH ${DOLPHIN_WC_REVISION}) + +# If Dolphin is not built from a Git repository, default the version info to +# reasonable values. +if(NOT DOLPHIN_WC_REVISION) + set(DOLPHIN_WC_DESCRIBE "${DOLPHIN_VERSION_MAJOR}.${DOLPHIN_VERSION_MINOR}") + set(DOLPHIN_WC_REVISION "${DOLPHIN_WC_DESCRIBE} (no further info)") + set(DOLPHIN_WC_BRANCH "master") + set(DOLPHIN_WC_COMMITS_AHEAD_MASTER 0) +endif() + +# If this is a tag (i.e. a release), then set the current patch version and +# the number of commits ahead to zero. +if(DOLPHIN_WC_TAG) + set(DOLPHIN_VERSION_PATCH "0") + set(DOLPHIN_WC_COMMITS_AHEAD_MASTER 0) +endif() diff --git a/CMake/ScmRevGen.cmake b/CMake/ScmRevGen.cmake index 753592300c..4acf61b007 100644 --- a/CMake/ScmRevGen.cmake +++ b/CMake/ScmRevGen.cmake @@ -1,57 +1,6 @@ cmake_minimum_required(VERSION 3.13) -# for revision info -if(GIT_FOUND) - # defines DOLPHIN_WC_REVISION - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - OUTPUT_VARIABLE DOLPHIN_WC_REVISION - OUTPUT_STRIP_TRAILING_WHITESPACE) - # defines DOLPHIN_WC_DESCRIBE - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --always --long --dirty - OUTPUT_VARIABLE DOLPHIN_WC_DESCRIBE - OUTPUT_STRIP_TRAILING_WHITESPACE) - - # remove hash (and trailing "-0" if needed) from description - string(REGEX REPLACE "(-0)?-[^-]+((-dirty)?)$" "\\2" DOLPHIN_WC_DESCRIBE "${DOLPHIN_WC_DESCRIBE}") - - # defines DOLPHIN_WC_BRANCH - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - OUTPUT_VARIABLE DOLPHIN_WC_BRANCH - OUTPUT_STRIP_TRAILING_WHITESPACE) - # defines DOLPHIN_WC_COMMITS_AHEAD_MASTER - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD ^master - OUTPUT_VARIABLE DOLPHIN_WC_COMMITS_AHEAD_MASTER - OUTPUT_STRIP_TRAILING_WHITESPACE) - - # defines DOLPHIN_WC_TAG - execute_process(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} describe --exact-match HEAD - OUTPUT_VARIABLE DOLPHIN_WC_TAG - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET) -endif() - -string(TIMESTAMP DOLPHIN_WC_BUILD_DATE "%Y-%m-%d" UTC) - -# version number -set(DOLPHIN_VERSION_MAJOR "2506") -set(DOLPHIN_VERSION_MINOR "0") -set(DOLPHIN_VERSION_PATCH ${DOLPHIN_WC_REVISION}) - -# If Dolphin is not built from a Git repository, default the version info to -# reasonable values. -if(NOT DOLPHIN_WC_REVISION) - set(DOLPHIN_WC_DESCRIBE "${DOLPHIN_VERSION_MAJOR}.${DOLPHIN_VERSION_MINOR}") - set(DOLPHIN_WC_REVISION "${DOLPHIN_WC_DESCRIBE} (no further info)") - set(DOLPHIN_WC_BRANCH "master") - set(DOLPHIN_WC_COMMITS_AHEAD_MASTER 0) -endif() - -# If this is a tag (i.e. a release), then set the current patch version and -# the number of commits ahead to zero. -if(DOLPHIN_WC_TAG) - set(DOLPHIN_VERSION_PATCH "0") - set(DOLPHIN_WC_COMMITS_AHEAD_MASTER 0) -endif() +include("${PROJECT_SOURCE_DIR}/CMake/GetScmRev.cmake") function(configure_source_file path) configure_file( diff --git a/CMakeLists.txt b/CMakeLists.txt index b67e31838d..81f9ec2f0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -899,6 +899,11 @@ set(CPACK_SOURCE_GENERATOR "TGZ;TBZ2;ZIP") set(CPACK_SOURCE_IGNORE_FILES "\\\\.#;/#;.*~;\\\\.swp;/\\\\.git") list(APPEND CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}") +# Additional options generated at cpack generation time (like version) +configure_file("${PROJECT_SOURCE_DIR}/CMake/CPackProjectConfig.cmake.in" + "${PROJECT_BINARY_DIR}/CMake/CPackProjectConfig.cmake" @ONLY) +set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMake/CPackProjectConfig.cmake") + # CPack must be included after the CPACK_* variables are set in order for those # variables to take effect. Include(CPack)