From f3e1f2001811be156feea97df4d9a9bca100112b Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 27 Jun 2025 11:48:17 +0200 Subject: [PATCH] [cmake] unify version creation * move to common cmake/GetProjectVersion.cmake for both, WinPR and FreeRDP * add preference for git tag or commit * move options to this common file --- CMakeLists.txt | 39 +++------------------------- cmake/ConfigOptions.cmake | 2 -- cmake/GetProjectVersion.cmake | 48 +++++++++++++++++++++++++++++++++++ docs/version_detection.md | 2 ++ winpr/CMakeLists.txt | 21 ++------------- 5 files changed, 56 insertions(+), 56 deletions(-) create mode 100644 cmake/GetProjectVersion.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index f2ab39b1a..867c58d4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,25 +100,10 @@ if($ENV{BUILD_NUMBER}) set(BUILD_NUMBER $ENV{BUILD_NUMBER}) endif() -set(VERSION_REGEX "^(.*)([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)") -set(RAW_VERSION_STRING "3.16.1-dev0") -if(EXISTS "${PROJECT_SOURCE_DIR}/.source_tag") - file(READ ${PROJECT_SOURCE_DIR}/.source_tag RAW_VERSION_STRING) -elseif(USE_VERSION_FROM_GIT_TAG) - git_get_exact_tag(_GIT_TAG --tags --always) - if(NOT ${_GIT_TAG} STREQUAL "n/a") - string(REGEX MATCH ${VERSION_REGEX} FOUND_TAG "${_GIT_TAG}") - if(FOUND_TAG) - set(RAW_VERSION_STRING ${_GIT_TAG}) - endif() - endif() -endif() -string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING) - -string(REGEX REPLACE "${VERSION_REGEX}" "\\2" FREERDP_VERSION_MAJOR "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\3" FREERDP_VERSION_MINOR "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\4" FREERDP_VERSION_REVISION "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\5" FREERDP_VERSION_SUFFIX "${RAW_VERSION_STRING}") +include(GetProjectVersion) +get_project_version( + FREERDP_VERSION_MAJOR FREERDP_VERSION_MINOR FREERDP_VERSION_REVISION FREERDP_VERSION_SUFFIX GIT_REVISION +) set(FREERDP_API_VERSION "${FREERDP_VERSION_MAJOR}") set(FREERDP_VERSION "${FREERDP_VERSION_MAJOR}.${FREERDP_VERSION_MINOR}.${FREERDP_VERSION_REVISION}") @@ -129,22 +114,6 @@ else() endif() message("FREERDP_VERSION=${FREERDP_VERSION_FULL}") -if(EXISTS "${PROJECT_SOURCE_DIR}/.source_version") - file(READ ${PROJECT_SOURCE_DIR}/.source_version GIT_REVISION) - - string(STRIP ${GIT_REVISION} GIT_REVISION) -elseif(USE_VERSION_FROM_GIT_TAG) - git_get_exact_tag(GIT_REVISION --tags --always) - - if(${GIT_REVISION} STREQUAL "n/a") - git_rev_parse(GIT_REVISION --short) - endif() -endif() - -if(NOT GIT_REVISION) - set(GIT_REVISION ${FREERDP_VERSION}) -endif() - message(STATUS "Git Revision ${GIT_REVISION}") # MSVC compatibility with system headers diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 1feb6c811..51a53bd43 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -153,8 +153,6 @@ if(WITH_VAAPI_H264_ENCODING) add_definitions("-DWITH_VAAPI_H264_ENCODING") endif() -option(USE_VERSION_FROM_GIT_TAG "Extract FreeRDP version from git tag." ON) - option(WITH_CAIRO "Use CAIRO image library for screen resizing" OFF) option(WITH_SWSCALE "Use SWScale image library for screen resizing" ON) diff --git a/cmake/GetProjectVersion.cmake b/cmake/GetProjectVersion.cmake new file mode 100644 index 000000000..f3f12617a --- /dev/null +++ b/cmake/GetProjectVersion.cmake @@ -0,0 +1,48 @@ +option(USE_VERSION_FROM_GIT_TAG "Extract FreeRDP version from git tag." ON) +option(USE_GIT_FOR_REVISION "Extract git tag/commit" OFF) + +function(get_project_version VERSION_MAJOR VERSION_MINOR VERSION_REVISION VERSION_SUFFIX GIT_REVISION) + + # Default version, hard codec per release + set(RAW_VERSION_STRING "3.16.1-dev0") + + set(VERSION_REGEX "^(.*)([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)") + + # Prefer version from .source_tag file + if(EXISTS "${PROJECT_SOURCE_DIR}/.source_tag") + file(READ ${PROJECT_SOURCE_DIR}/.source_tag RAW_VERSION_STRING) + # otherwise try to extract the version from a git tag + elseif(USE_VERSION_FROM_GIT_TAG) + git_get_exact_tag(_GIT_TAG --tags --always) + if(NOT ${_GIT_TAG} STREQUAL "n/a") + string(REGEX MATCH ${VERSION_REGEX} FOUND_TAG "${_GIT_TAG}") + if(FOUND_TAG) + set(RAW_VERSION_STRING ${_GIT_TAG}) + endif() + endif() + endif() + + # Default git revision + set(FKT_GIT_REVISION "n/a") + + # Prefer git revision from .source_version file + if(EXISTS "${PROJECT_SOURCE_DIR}/.source_version") + file(READ ${PROJECT_SOURCE_DIR}/.source_version FKT_GIT_REVISION) + string(STRIP ${FKT_GIT_REVISION} FKT_GIT_REVISION) + # otherwise try to call git and extract tag/commit + elseif(USE_VERSION_FROM_GIT_TAG OR USE_GIT_FOR_REVISION) + git_rev_parse(FKT_GIT_REVISION --short) + endif() + + string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING) + string(REGEX REPLACE "${VERSION_REGEX}" "\\2" FKT_VERSION_MAJOR "${RAW_VERSION_STRING}") + string(REGEX REPLACE "${VERSION_REGEX}" "\\3" FKT_VERSION_MINOR "${RAW_VERSION_STRING}") + string(REGEX REPLACE "${VERSION_REGEX}" "\\4" FKT_VERSION_REVISION "${RAW_VERSION_STRING}") + string(REGEX REPLACE "${VERSION_REGEX}" "\\5" FKT_VERSION_SUFFIX "${RAW_VERSION_STRING}") + + set(${VERSION_MAJOR} ${FKT_VERSION_MAJOR} PARENT_SCOPE) + set(${VERSION_MINOR} ${FKT_VERSION_MINOR} PARENT_SCOPE) + set(${VERSION_REVISION} ${FKT_VERSION_REVISION} PARENT_SCOPE) + set(${VERSION_SUFFIX} ${FKT_VERSION_SUFFIX} PARENT_SCOPE) + set(${GIT_REVISION} ${FKT_GIT_REVISION} PARENT_SCOPE) +endfunction() diff --git a/docs/version_detection.md b/docs/version_detection.md index 3a00c5d3c..7ea139612 100644 --- a/docs/version_detection.md +++ b/docs/version_detection.md @@ -14,6 +14,8 @@ all sub-projects as WinPR. As default both variables are equal. +The whole detection has been encapsulated in cmake/GetProjectVersion.cmake + For nightly or development builds it is often of advantage to have the actual version from git instead of having the hard coded value set in CMakeLists.txt. For this the cmake variable `USE_VERSION_FROM_GIT_TAG` can be set. In order for this to work you need a) source checkout and b) git command line utility. diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index b315c7780..78226281a 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -130,25 +130,8 @@ if(NOT WIN32) endif() # Soname versioning -set(VERSION_REGEX "^(.*)([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)") -set(RAW_VERSION_STRING "3.16.1-dev0") -if(EXISTS "${PROJECT_SOURCE_DIR}/.source_tag") - file(READ ${PROJECT_SOURCE_DIR}/.source_tag RAW_VERSION_STRING) -elseif(USE_VERSION_FROM_GIT_TAG) - git_get_exact_tag(_GIT_TAG --tags --always) - if(NOT ${_GIT_TAG} STREQUAL "n/a") - string(REGEX MATCH ${VERSION_REGEX} FOUND_TAG "${_GIT_TAG}") - if(FOUND_TAG) - set(RAW_VERSION_STRING ${_GIT_TAG}) - endif() - endif() -endif() -string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING) - -string(REGEX REPLACE "${VERSION_REGEX}" "\\2" WINPR_VERSION_MAJOR "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\3" WINPR_VERSION_MINOR "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\4" WINPR_VERSION_REVISION "${RAW_VERSION_STRING}") -string(REGEX REPLACE "${VERSION_REGEX}" "\\5" WINPR_VERSION_SUFFIX "${RAW_VERSION_STRING}") +include(GetProjectVersion) +get_project_version(WINPR_VERSION_MAJOR WINPR_VERSION_MINOR WINPR_VERSION_REVISION WINPR_VERSION_SUFFIX GIT_REVISION) set(WINPR_VERSION "${WINPR_VERSION_MAJOR}.${WINPR_VERSION_MINOR}.${WINPR_VERSION_REVISION}") set(WINPR_API_VERSION "${WINPR_VERSION_MAJOR}")