101 lines
4.4 KiB
CMake
101 lines
4.4 KiB
CMake
# Полная версия лаунчера и канал сборки (dev / rc / release).
|
||||
|
|
#
|
|||
|
|
# В репозитории хранится только число X.Y.Z из project(), одинаковое во всех
|
|||
|
|
# ветках, — поэтому merge dev → rc → master не трогает версию. Канал
|
|||
|
|
# вычисляется при сборке (по убыванию приоритета):
|
|||
|
|
# 1. LAUNCHER_BUILD_VERSION — полная версия от CI: 1.0.1, 1.0.1-rc2;
|
|||
|
|
# 2. тег на HEAD: vX.Y.Z — релиз, vX.Y.Z-rcN — rc;
|
|||
|
|
# 3. ветка (из переменных CI или git): master — релиз, rc/beta — rc;
|
|||
|
|
# 4. всё остальное, в т.ч. сборка без git, — dev.
|
|||
|
|
#
|
|||
|
|
# Работает в двух режимах:
|
|||
|
|
# include() при configure — проверяет входные данные и пишет заголовок;
|
|||
|
|
# cmake -P на каждой сборке — чтобы после git checkout без reconfigure
|
|||
|
|
# канал и хэш коммита не устаревали.
|
|||
|
|
# Входные переменные: LAUNCHER_VERSION_NUMERIC, LAUNCHER_SOURCE_DIR,
|
|||
|
|
# LAUNCHER_VERSION_HEADER, LAUNCHER_BUILD_VERSION (необязательна).
|
|||
|
|
# Результат: LAUNCHER_VERSION, LAUNCHER_CHANNEL и файл LAUNCHER_VERSION_HEADER.
|
|||
|
|
|
|||
|
|
set(_numeric "${LAUNCHER_VERSION_NUMERIC}")
|
|||
|
|
|
|||
|
|
find_package(Git QUIET)
|
|||
|
|
function(_launcher_git out)
|
|||
|
|
set(${out} "" PARENT_SCOPE)
|
|||
|
|
if(NOT GIT_EXECUTABLE)
|
|||
|
|
return()
|
|||
|
|
endif()
|
|||
|
|
execute_process(COMMAND "${GIT_EXECUTABLE}" ${ARGN}
|
|||
|
|
WORKING_DIRECTORY "${LAUNCHER_SOURCE_DIR}"
|
|||
|
|
RESULT_VARIABLE _rc OUTPUT_VARIABLE _out ERROR_QUIET
|
|||
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|||
|
|
if(_rc EQUAL 0)
|
|||
|
|
set(${out} "${_out}" PARENT_SCOPE)
|
|||
|
|
endif()
|
|||
|
|
endfunction()
|
|||
|
|
|
|||
|
|
set(_full "")
|
|||
|
|
if(LAUNCHER_BUILD_VERSION)
|
|||
|
|
set(_full "${LAUNCHER_BUILD_VERSION}")
|
|||
|
|
string(REGEX REPLACE "^v" "" _full "${_full}")
|
|||
|
|
string(REGEX REPLACE "-.*$" "" _base "${_full}")
|
|||
|
|
if(NOT _base STREQUAL _numeric)
|
|||
|
|
message(FATAL_ERROR "LAUNCHER_BUILD_VERSION=${LAUNCHER_BUILD_VERSION} не совпадает "
|
|||
|
|
"с project(BiLauncher VERSION ${_numeric})")
|
|||
|
|
endif()
|
|||
|
|
else()
|
|||
|
|
# Тег vX.Y.Z или vX.Y.Z-rcN ровно на HEAD, относящийся к текущей версии
|
|||
|
|
_launcher_git(_tags tag --points-at HEAD)
|
|||
|
|
string(REPLACE "\n" ";" _tags "${_tags}")
|
|||
|
|
string(REPLACE "." "\\." _numeric_re "${_numeric}")
|
|||
|
|
foreach(_tag IN LISTS _tags)
|
|||
|
|
if(_tag MATCHES "^v(${_numeric_re}(-rc[0-9]+)?)$")
|
|||
|
|
# Релизный тег важнее rc-тега на том же коммите
|
|||
|
|
if(NOT _full OR NOT CMAKE_MATCH_2)
|
|||
|
|
set(_full "${CMAKE_MATCH_1}")
|
|||
|
|
endif()
|
|||
|
|
endif()
|
|||
|
|
endforeach()
|
|||
|
|
endif()
|
|||
|
|
|
|||
|
|
if(_full)
|
|||
|
|
if(_full MATCHES "-rc[0-9]*$")
|
|||
|
|
set(LAUNCHER_CHANNEL "rc")
|
|||
|
|
elseif(_full STREQUAL _numeric)
|
|||
|
|
set(LAUNCHER_CHANNEL "release")
|
|||
|
|
else()
|
|||
|
|
set(LAUNCHER_CHANNEL "dev")
|
|||
|
|
endif()
|
|||
|
|
set(LAUNCHER_VERSION "${_full}")
|
|||
|
|
else()
|
|||
|
|
# В CI на detached HEAD имени ветки в git нет — берём его из окружения
|
|||
|
|
set(_branch "$ENV{GITHUB_HEAD_REF}")
|
|||
|
|
if(NOT _branch AND "$ENV{GITHUB_REF_TYPE}" STREQUAL "branch")
|
|||
|
|
set(_branch "$ENV{GITHUB_REF_NAME}")
|
|||
|
|
endif()
|
|||
|
|
if(NOT _branch)
|
|||
|
|
_launcher_git(_branch rev-parse --abbrev-ref HEAD)
|
|||
|
|
endif()
|
|||
|
|
|
|||
|
|
if(_branch STREQUAL "master")
|
|||
|
|
set(LAUNCHER_CHANNEL "release")
|
|||
|
|
set(LAUNCHER_VERSION "${_numeric}")
|
|||
|
|
elseif(_branch STREQUAL "rc" OR _branch STREQUAL "beta")
|
|||
|
|
set(LAUNCHER_CHANNEL "rc")
|
|||
|
|
set(LAUNCHER_VERSION "${_numeric}-rc")
|
|||
|
|
else()
|
|||
|
|
set(LAUNCHER_CHANNEL "dev")
|
|||
|
|
set(LAUNCHER_VERSION "${_numeric}-dev")
|
|||
|
|
_launcher_git(_hash rev-parse --short=7 HEAD)
|
|||
|
|
if(_hash)
|
|||
|
|
# Неотслеживаемые файлы (каталоги сборки и т.п.) не считаем
|
|||
|
|
execute_process(COMMAND "${GIT_EXECUTABLE}" diff --quiet HEAD --
|
|||
|
|
WORKING_DIRECTORY "${LAUNCHER_SOURCE_DIR}" RESULT_VARIABLE _dirty ERROR_QUIET)
|
|||
|
|
if(NOT _dirty EQUAL 0)
|
|||
|
|
set(_hash "${_hash}.dirty")
|
|||
|
|
endif()
|
|||
|
|
string(APPEND LAUNCHER_VERSION "+${_hash}")
|
|||
|
|
endif()
|
|||
|
|
endif()
|
|||
|
|
endif()
|
|||
|
|
|
|||
|
|
configure_file("${CMAKE_CURRENT_LIST_DIR}/launcherversion.h.in" "${LAUNCHER_VERSION_HEADER}" @ONLY)
|