Автоматизирован процесс получения версии программы из исходнго файла при сборке в пакет:

- Копирование source/snag/version_.d в source/snag/version_.d.bak и каждый раз восстанавливается оригинальный файл при сборке через CMake
- Добавлена параметризорванная возможность включения hash в версионирование по флагу GIT_HASH_VERSION
This commit is contained in:
Alexander Zhirov 2025-06-02 11:08:50 +03:00
parent 4474cc5b7c
commit d58ab81fd8
Signed by: alexander
GPG key ID: C8D8BE544A27C511
6 changed files with 53 additions and 32 deletions

View file

@ -1,18 +1,15 @@
cmake_minimum_required(VERSION 3.14)
project(snag)
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 1)
set(PROJECT_VERSION_PATCH 0)
string(TIMESTAMP PROJECT_VERSION_BUILD "%y%j.%H%M")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(snag_git)
include(snag_version)
string(TIMESTAMP PROJECT_VERSION_BUILD "%y%j.%H%M")
if(GIT_HASH_VERSION)
message(STATUS "GIT_HASH_VERSION is set")
include(snag_git)
endif()
include(snag_platforms)
set(PROJECT_VERSION_SUFFIX "-${GIT_VERSION_SUFFIX}")
# Overwrite suffix for Release or Release Candidate builds
set(PROJECT_VERSION_SUFFIX "-alpha.1")
set(CMAKE_BUILD_TYPE "Release")
if(CMAKE_BUILD_TYPE)
set(BUILD_TYPE ${CMAKE_BUILD_TYPE})
@ -27,7 +24,7 @@ message(STATUS "PROJECT_VERSION_DISPLAY: ${PROJECT_VERSION_DISPLAY}")
message(STATUS "")
# Deb package
set(DEB_PACKAGE_VERSION "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}")
set(DEB_PACKAGE_VERSION "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}${GIT_VERSION_SUFFIX}")
if(PROJECT_VERSION_CODENAME)
set(DEB_PACKAGE_VERSION "${DEB_PACKAGE_VERSION}-${PROJECT_VERSION_CODENAME}")
endif()

View file

@ -1,24 +1,20 @@
cmake_minimum_required(VERSION 3.6)
if(DEFINED ENV{CI_COMMIT_BRANCH})
string(REGEX REPLACE ".*/" "" GIT_BRANCH $ENV{CI_COMMIT_BRANCH})
string(REPLACE "_" "-" GIT_BRANCH ${GIT_BRANCH})
if(NOT GIT_BRANCH STREQUAL "stable")
set(GIT_VERSION_SUFFIX "${GIT_BRANCH}-")
find_package(Git)
if(GIT_FOUND)
# Получаем короткий хэш текущего коммита
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_SHORT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Проверяем, успешно ли получен хэш
if(GIT_SHORT_HASH)
message(STATUS "Git short hash: ${GIT_SHORT_HASH}")
set(GIT_VERSION_SUFFIX "-${GIT_SHORT_HASH}")
else()
set(GIT_VERSION_SUFFIX "")
message(WARNING "Failed to retrieve Git short hash")
endif()
else()
set(GIT_BRANCH "dev")
set(GIT_VERSION_SUFFIX "${GIT_BRANCH}-")
endif()
if(DEFINED ENV{CI_COMMIT_SHORT_SHA})
set(GIT_TAG $ENV{CI_COMMIT_SHORT_SHA})
else()
set(GIT_TAG "0000000")
endif()
set(GIT_VERSION_SUFFIX "${GIT_VERSION_SUFFIX}${GIT_TAG}")
MESSAGE(STATUS "GIT_VERSION_SUFFIX: ${GIT_VERSION_SUFFIX}")
MESSAGE(STATUS "")

28
cmake/snag_version.cmake Normal file
View file

@ -0,0 +1,28 @@
cmake_minimum_required (VERSION 3.6)
# Сохраняем копию файла с версией программы и каждый раз обновляем при конфигуре через Cmake
if(EXISTS "${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak")
configure_file(
"${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak"
"${CMAKE_SOURCE_DIR}/source/snag/version_.d"
COPYONLY
)
else()
configure_file(
"${CMAKE_SOURCE_DIR}/source/snag/version_.d"
"${CMAKE_SOURCE_DIR}/source/snag/version_.d.bak"
COPYONLY
)
endif()
# Чтение файла version_.d
file(READ "${CMAKE_SOURCE_DIR}/source/snag/version_.d" VERSION_FILE_CONTENT)
# Извлечение строки версии (например, "0.1.0-alpha.1")
string(REGEX MATCH "snagVersion = \"([0-9]+)\\.([0-9]+)\\.([0-9]+)([^\"]*)\"" _ ${VERSION_FILE_CONTENT})
# Установка переменных для мажорной, минорной, патч-версии и суффикса
set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2})
set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3})
set(PROJECT_VERSION_SUFFIX ${CMAKE_MATCH_4})

View file

@ -1,6 +1,6 @@
# Сборка из под Debian
```
cmake .
cmake . -DGIT_HASH_VERSION=ON
dpkg-buildpackage -us -uc -nc
```

2
debian/rules vendored
View file

@ -8,7 +8,7 @@ DEST_DIR = $(DEBIAN_DIR)/snag
dh $@ $(BUILD_SYSTEM)
override_dh_auto_configure:
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DGIT_HASH_VERSION=ON
override_dh_auto_build:
cmake --build build

View file

@ -1,3 +1,3 @@
module snag.version_;
enum snagVersion = "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}";
enum snagVersion = "${PROJECT_VERSION_DISPLAY}${PROJECT_VERSION_SUFFIX}${GIT_VERSION_SUFFIX}";